模糊操作是图像处理中最简单和常用的操作之一,该使用的操作之一原因就为了给图像预处理时减低噪声,基于数学的卷积操作
均值模糊,函数 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()
运行结果