2D卷积(图像过滤)

同一维信号一样,可以对2D图像实施低通滤波(LPF)和高通滤波(HPF)。LPF用于去除噪音,模糊图像;HPF用于找到图像的边缘。

Opencv提供的函数cv.filter2D()可以对一幅图像进行卷积操作。下面使用5x5的平均滤波器核:

 操作如下,将核放在图像的一个像素A上,求与核对应的图像上25(5x5)个像素的和,再取平均数,用这个平均数代替像素中心像素A的值。重复以上的操作直到将图像的每一个像素值都更新一遍。

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

img=cv.imread('./images/lena.jpeg')
img=img[:,:,[2,1,0]]
kernel=np.ones((5,5),np.float32)/25
# cv.filter2D(src,dst,kernel,anchor=(-1,-1))
# ddepth:desired depth of the destination image;
# the following combinations of src.depth() and ddepth are supported:
#src.depth() = CV_8U, ddepth = -1/CV_16S/CV_32F/CV_64F
#src.depth() = CV_16U/CV_16S, ddepth = -1/CV_32F/CV_64F
#src.depth() = CV_32F, ddepth = -1/CV_32F/CV_64F
#src.depth() = CV_64F, ddepth = -1/CV_64F
#when ddepth=-1, the output image will have the same depth as the source.

dst=cv.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()

结果:

 图像模糊(图像平滑)

通过将图像与低通滤波器内核进行卷积来实现图像模糊。这对于消除噪音很有用。它实际上从图像中消除了高频部分(例如噪声、边缘)。因此,在此操作中边缘有些模糊。(有一些模糊技术也可以不模糊边缘)。opencv主要提供四种类型的模糊技术。

1.平均

通过将图像与归一化框滤镜进行卷积来完成的。它仅获取内核区域下所有像素的平均值,并替换中心元素。这是通过功能cv.blur()或cv.boxFilter()完成的。应该指定内核的宽度和高度。

注意:如果不想使用标准化的框式过滤器,请使用cv.boxFilter()。将参数normalize=False传递给函数。

import cv2 as cv

img=cv.imread('./images/opencv.png')
dst=cv.blur(img,(5,5))
while(1):
    cv.imshow('img',img)
    cv.imshow('dst',dst)
    if cv.waitKey(1)&0XFF==27:
        break
cv.destroyAllWindows()

结果:

 2.高斯模糊

在这种情况下,代替盒式滤波器,使用了高斯核。这是通过功能cv.GaussianBlur()完成的。应指定内核的宽度和高度,该宽度和高度应为正数和奇数。还应指定x和y方向的标准偏差,分别为sigmaX和sigmaY。如果仅指定sigmaX,则将sigmaY与sigmaX相同。如果两个都为0,则根据内核大小进行计算。高斯模糊对于从图像中去除高斯噪声非常有效。

如果需要,可以使用函数cv.getGaussianKernel()创建高斯内核。

修改以上代码,实现高斯模糊。

gaussian=cv.GaussianBlur(img,(5,5),0)

3.中位模糊

函数cv.medianBlur()提取内核区域下所有像素的中值,并将中心元素替换为该中值。这对于消除图像中的椒盐噪声非常有效。在上述过滤器中,中心元素是最新计算的值,该值可以是图像中的像素值或新值。但是在中值模糊中,中心元素总是被图像中的某些像素值代替。有效降低噪音。其内核大小应为正奇数整数。

median=cv.medianBlur(img,5)

4.双边滤波

cv.bilateralFilter()在去除噪声的同时保持边缘清晰锐利非常有效。但是,与其他过滤器相比,该操作速度较慢。高斯滤波器采用像素周围的邻域并找到高斯加权平均值。高斯滤波器仅是空间的函数,也就是说,滤波时会考虑附近的像素。它不考虑是否具有几乎相同的强度。它不考虑像素是否是边缘像素。因此它也模糊了边缘。

双边滤波器在空间中也采用高斯滤波器,但是又有一个高斯滤波器,它是像素差的函数。空间的高斯函数确保仅考虑附近像素的模糊,而强度差的高斯函数确保仅考虑强度与中心像素相似的那些像素的模糊。由于边缘的像素强度变化较大,因此可以保留边缘。

bilateral=cv.bilateralFilter(img,9,75,75)

 

 posted on 2024-05-03 10:50  会飞的金鱼  阅读(22)  评论(0)    收藏  举报