opencv python 图像平滑/2D卷积/图像平滑/平均值法/高斯模糊/中值模糊/双边滤波
1 2D卷积
与一维信号一样,图像也可以使用各种低通滤波器(LPF),高通滤波器(HPF)等进行滤波.LPF有助于消除噪声,模糊图像等.HPF滤波器有助于找到边缘图片.
cv.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
:将内核与图像进行卷积
应用
对图像进行平均过滤。 一个5x5的平均滤波器内核可以定义如下:
$$K=\frac{1}{25} \left[ \begin{matrix} 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \end{matrix} \right] $$
将此内核保持在像素上方,添加该内核下方的所有25个像素,取其平均值并用新的平均值替换中心像素.
代码:
import cv2 import numpy as np import matplotlib.pylab as plt img = cv2.imread('img.jpg') kernel = np.ones((5,5),np.float32)/25 dst = cv2.filter2D(img,-1,kernel) plt.subplot(121),plt.imshow(img),plt.title('Original') plt.xticks([]), plt.yticks([]) plt.subplot(122),plt.imshow(dst),plt.title('Averaging') plt.xticks([]), plt.yticks([]) plt.show()
2图像模糊(图像平滑)
通过将图像与低通滤波器内核卷积来实现图像模糊.它有助于消除噪音.它实际上从图像中去除了高频内容(例如:噪声,边缘).因此在此操作中边缘会模糊一点.(有模糊的技术,也不会模糊边缘).OpenCV主要提供四种模糊技术.
1平均法
过将图像与标准化的盒式过滤器进行卷积来完成的。它只取内核区域下所有像素的平均值并替换中心元素。这是由函数cv2.blur()
或cv2.boxFilter()
完成的,3x3标准化的盒式过滤器如下所示:
$$K=\frac{1}{9} \left[ \begin{matrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{matrix} \right] $$
NOTE:
如果不想使用规范化的框过滤器,请使用cv2.boxFilter()
.将参数normalize = False传递给函数.
应用
使用5x5大小的内核进行图像平滑:
代码:
import cv2 import numpy as np import matplotlib.pylab as plt img = cv2.imread('img.jpg') blur = cv2.blur(img,(5,5)) plt.subplot(121),plt.imshow(img),plt.title('Original') plt.xticks([]), plt.yticks([]) plt.subplot(122),plt.imshow(blur),plt.title('Blurred') plt.xticks([]), plt.yticks([]) plt.show()
2高斯模糊
cv2.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]])
- 应该指定内核的宽度和高度,它应该是正数和奇数.
- 还应该分别指定X和Y方向的标准偏差sigmaX和sigmaY.如果仅指定了sigmaX,则sigmaY与sigmaX相同.如果两者都为零,则根据内核大小计算它们.
- 高斯模糊在从图像中去除高斯噪声方面非常有效
- 可以使用函数
cv2.getGaussianKernel()
创建高斯内核
代码:
import cv2 import numpy as np import matplotlib.pylab as plt img = cv2.imread('img.jpg') blur = cv2.GaussianBlur(img,(5,5),0) plt.subplot(121),plt.imshow(img),plt.title('Original') plt.xticks([]), plt.yticks([]) plt.subplot(122),plt.imshow(blur),plt.title('Blurred') plt.xticks([]), plt.yticks([]) plt.show()
3 中值模糊
cv2.medianBlur(src, ksize[, dst])
:内核区域下所有像素的中值,并用该中值替换中心元素.对图像中的椒盐噪声非常有效.其内核大小应为正整数
代码
import cv2 import numpy as np import matplotlib.pylab as plt img = cv2.imread('img7.png') blur = cv2.medianBlur(img,5) plt.subplot(121),plt.imshow(img),plt.title('Original') plt.xticks([]), plt.yticks([]) plt.subplot(122),plt.imshow(blur),plt.title('Blurred') plt.xticks([]), plt.yticks([]) plt.show()
4 双边滤波
cv2.bilateralFilter()
在降低噪音方面非常有效,同时保持边缘清晰,但与其他过滤器相比,操作速度较慢.
NOTE:
- 高斯滤波器采用像素周围的邻域并找到其高斯加权平均值. 该高斯滤波器仅是空间的函数,即在滤波时考虑附近的像素, 没有考虑像素是否具有几乎相同的强度,不考虑像素是否是边缘像素,所以它也模糊了边缘.
- 双边滤波器在空间中也采用高斯滤波器,但是还有一个高斯滤波器是像素差的函数.空间的高斯函数确保仅考虑附近的像素用于模糊,而强度差的高斯函数确保仅考虑具有与中心像素相似的强度的像素用于模糊,因此它保留了边缘,因为边缘处的像素将具有较大的强度变化.
代码:
import cv2 import numpy as np import matplotlib.pylab as plt img = cv2.imread('img.jpg') blur = cv2.bilateralFilter(img,9,75,75) plt.subplot(121),plt.imshow(img),plt.title('Original') plt.xticks([]), plt.yticks([]) plt.subplot(122),plt.imshow(blur),plt.title('Blurred') plt.xticks([]), plt.yticks([]) plt.show()