一、實驗目的
掌握opencv如何實現圖像的均值濾波、中值濾波和高斯濾波。
二、實驗內容
1.題目描述
對圖片test.png進行圖像的均值濾波、中值濾波和高斯濾波,還有高斯邊緣檢測,下面是test.png原圖片。
下面需要達到的效果:
2.實現過程
通過對老師發給的代碼進行分析,再在百度上搜索分析,代碼如下:
import cv2 import numpy as np from PIL import Image, ImageDraw, ImageFont __author__ = "sunjingjing" #均值濾波 def blur(source): img = cv2.blur(source, (10,10)) cv2img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # cv2和PIL中顏色的hex碼的儲存順序不同 pilimg = Image.fromarray(cv2img) draw = ImageDraw.Draw(pilimg) # 圖片上打印 font = ImageFont.truetype("simhei.ttf", 20, encoding="utf-8") # 參數1:字體文件路徑,參數2:字體大小 draw.text((0, 0), "均值濾波", (255, 0, 0), font=font) # 參數1:打印坐標,參數2:文本,參數3:字體顏色,參數4:字體 # PIL圖片轉cv2 圖片 cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR) cv2.imshow("blur", cv2charimg) #中值濾波 def medianBlur(source): img= cv2.medianBlur(source, 3) cv2img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # cv2和PIL中顏色的hex碼的儲存順序不同 pilimg = Image.fromarray(cv2img) draw = ImageDraw.Draw(pilimg) # 圖片上打印 font = ImageFont.truetype("simhei.ttf", 20, encoding="utf-8") # 參數1:字體文件路徑,參數2:字體大小 draw.text((0, 0), "中值濾波", (255, 0, 0), font=font) # 參數1:打印坐標,參數2:文本,參數3:字體顏色,參數4:字體 # PIL圖片轉cv2 圖片 cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR) cv2.imshow("medianBlur", cv2charimg) #方框濾波 def BoxFilter(source): img = cv2.boxFilter(source, -1, (5,5), normalize=1) cv2img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # cv2和PIL中顏色的hex碼的儲存順序不同 pilimg = Image.fromarray(cv2img) draw = ImageDraw.Draw(pilimg) # 圖片上打印 font = ImageFont.truetype("simhei.ttf", 20, encoding="utf-8") # 參數1:字體文件路徑,參數2:字體大小 draw.text((0, 0), "方框濾波", (255, 0, 0), font=font) # 參數1:打印坐標,參數2:文本,參數3:字體顏色,參數4:字體 # PIL圖片轉cv2 圖片 cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR) cv2.imshow("boxFilter", cv2charimg) #高斯濾波 def GaussianBlur(source): img = cv2.GaussianBlur(source, (3,3), 0) cv2img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # cv2和PIL中顏色的hex碼的儲存順序不同 pilimg = Image.fromarray(cv2img) draw = ImageDraw.Draw(pilimg) # 圖片上打印 font = ImageFont.truetype("simhei.ttf", 20, encoding="utf-8") # 參數1:字體文件路徑,參數2:字體大小 draw.text((0, 0), "高斯濾波", (255, 0, 0), font=font) # 參數1:打印坐標,參數2:文本,參數3:字體顏色,參數4:字體 # PIL圖片轉cv2 圖片 cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR) cv2.imshow("GaussianBlur", cv2charimg) #高斯邊緣檢測 def Gaussian(source): sobelX = cv2.Sobel(source,cv2.CV_64F,1,0)#x方向的梯度 sobelY = cv2.Sobel(source,cv2.CV_64F,0,1)#y方向的梯度 sobelX = np.uint8(np.absolute(sobelX))#x方向梯度的絕對值 sobelY = np.uint8(np.absolute(sobelY))#y方向梯度的絕對值 img = cv2.bitwise_or(sobelX,sobelY)# cv2img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # cv2和PIL中顏色的hex碼的儲存順序不同 pilimg = Image.fromarray(cv2img) draw = ImageDraw.Draw(pilimg) # 圖片上打印 font = ImageFont.truetype("simhei.ttf", 20, encoding="utf-8") # 參數1:字體文件路徑,參數2:字體大小 draw.text((0, 0), "高斯邊緣檢測", "green", font=font) # 參數1:打印坐標,參數2:文本,參數3:字體顏色,參數4:字體 # PIL圖片轉cv2 圖片 cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR) cv2.imshow("GaussianBlur", cv2charimg) if __name__ == "__main__": #加載圖片 img = cv2.imread("test2.png") cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE) cv2.imshow("input image", img) blur(img) medianBlur(img) GaussianBlur(img) # Gaussian(img) cv2.waitKey(0) cv2.destroyAllWindows()
3.運行結果
4.問題及解決方法
問題:沒有辦法將中文寫在圖片上,一有中文就亂碼
解決方法:在百度上搜索,發現要寫上中文,要設置漢字的字體顏色和坐標將漢字沾在圖片上。也就是下面這幾行代碼
三、實驗總結
通過這次的作業,我發現opencv真的沒有xavis 好用,xavis短短幾行代碼,但在python或C語言中就需要很多行,不過opencv是開源的,比較方便。還有網絡促進了社會進步,在網上我可以找到自己需要的東西,也可以自己去學習機器視覺方面的知識。總之對機器視覺有了更深的了解。