模糊操作是圖像處理中最簡單和常用的操作之一,該使用的操作之一原因就為了給圖像預處理時減低噪聲,基於數學的卷積操作
均值模糊,函數 cv2.blur(image,(5,5)),這是一個平滑圖片的函數,它將一個區域內所有點的灰度值的平均值作為這個點的灰度值。像該函數對領域點的灰度值進行權重相加最后設置灰度值,這樣的操作又叫卷積,這樣的濾波器叫線性濾波器。
中值模糊,函數cv2.medianBlur(image,5),該函數不同於上一個函數,它是非線性濾波器,它是取領域的中值作為當前點的灰度值。,上面函數就是選取了5*5大小的矩陣,必須為奇數,處理有椒鹽噪聲(就像燒烤撒很多孜然,圖片上有很多點)有很好的效果
自定義模糊(銳化),函數filter2D():定義為cv2.filter2D(src,ddepth,kernel)
銳化就是突出圖像細節或者增強圖像被模糊的地方,銳化原理就是細節增強,圖像的導數就是圖像的細節,隨着導數階數升高,能代表的東西也不同。
均值模糊、中值模糊、自定義模糊的python代碼
import cv2 import numpy as np __author__ = "boboa" # 均值模糊 去隨機噪聲有很好的去燥效果 def blur_demo(image): dst = cv2.blur(image, (5, 5)) cv2.imshow("blur_demo", dst) # 中值模糊去除椒鹽噪聲 def median_blur_demo(image): dst = cv2.medianBlur(image, 5) cv2.imshow("median_blur_demo", dst) # 自定義模糊 def custom_blur_demo(image): # kernels = np.ones([5, 5], np.float32)/25 kernels = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32) dst = cv2.filter2D(image, -1, kernel=kernels) cv2.imshow("custom_blur_demo", dst) if __name__ == "__main__": img = cv2.imread("img3.jpg") cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE) cv2.imshow("input image", img) blur_demo(img) median_blur_demo(img) cv2.waitKey(0) cv2.destroyAllWindows()
均值模糊運行效果
中值模糊運行結果
自定義運行結果
高斯模糊本質上是低通濾波器,輸出圖像的每個像素點是原圖像上對應像素點與周圍像素點的加權和,原理並不復雜,就是用高斯分布權值矩陣與原始圖像矩陣做卷積運算而已。
高斯模糊的python代碼
import cv2 import numpy as np """ 高斯模糊/噪聲 輪廓還在,保留圖像的主要特征 高斯模糊比均值模糊去噪效果好 """ def clamp(pv): if pv > 255: return 255 if pv < 0: return 0 else: return pv def gaussian_noise(image): h, w, c = image.shape for row in range(h): for col in range(w): s = np.random.normal(0, 20, 3) b = image[row, col, 0] # blue g = image[row, col, 1] # green r = image[row, col, 2] # red image[row, col, 0] = clamp(b + s[0]) image[row, col, 1] = clamp(g + s[1]) image[row, col, 2] = clamp(r + s[2]) cv2.imshow("noise image", image) if __name__ == "__main__": img = cv2.imread("img5.jpg") cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE) cv2.imshow("input image", img) # gaussian_noise(img) # 高斯模糊抑制高斯噪聲 dst = cv2.GaussianBlur(img, (5, 5), 0) cv2.imshow("Gaussian Blur", dst) cv2.waitKey(0) cv2.destroyAllWindows()
運行結果