OpenCV图像平滑处理(模糊)———滤波

前面介绍里面,我有写过对于图像的平滑处理的几种方法:
归一化滤波,高斯模糊,中值滤波,双边滤波。 接下来,一一介绍里面参数的含义,以及自己做出的一些总结,还有上篇里面说的关于进度条数值不变的原因。

在开始讲图像平滑处理之前,我们有必要了解下什么是图像噪声:
图像噪声:引起较强视觉效果的孤立像素点或像素块。一般,噪声信号与要研究的对象不相关,它以无用的信息形式出现,扰乱图像的可观测信息。通俗的说就是噪声让图像不清楚。

归一化滤波:(均值滤波)
def blur(src, ksize, dst=None, anchor=None, borderType=None)
不要问我为啥和正常的那些不一样,我这里是按python的格式来举的例子,所以么缺少OutputArray -> dst 的参数。 src下面也不多说了,你可以输入图像数据,即Mat类的对象,
可以是多通道的,也可以是单通道哦的,不过图片的深度需要是定义的通道类型里面的(即CV_8UCx,CV_16UCx,CV_16SCx,CV_32FCx,CV_64FCx其中之一)

kSize:内核参数,其实就是图片进行卷积的时候相乘的那个矩阵,具体的卷积是如何算的,网上有很多,我这里就不介绍了,所得到的图像是模糊的,而且图像其实是按照原来的比例缺少了(原图像-内核参数+1)^2 个单元格

anchor:Point类型,即锚点,有默认值Point(-1,-1),当坐标为负值,就表示取核的中心。
borderType:Int类型,用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT.

高斯滤波:
def GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)
kSize:虽然在后面不想讲了,不过还是要在这里提及一下,均值滤波对kSize里面的参数是没有要求的,不过,高斯滤波,中值滤波的kSize只能是正奇数
sigmaX:Double类型的,表示高斯核函数在X方向的标准偏差
sigmaY:Double类型的,表示高斯核函数在Y方向的标准偏差,若simgaY为0,它的值就和sigmaX的值相同,如果sigmaX和sigmaY的值都为0,那么它就根据kSize的宽高来计算。

中值滤波
def medianBlur(src, ksize, dst=None)
这里的参数其实没啥好说的了···

双边滤波
def bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)
d:Int类型的,表示在过滤过程中,每个像素邻域的直径。如果这个值我们设其为非正数,那么OpenCV会根据sigmaSpace来计算它。
sigmaColor:Double类型的,颜色空间滤波器的sigma值。这个参数越大,就表明该像素邻域内由更宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
sigmaSpace:Double类型的,sigmaSpace坐标空间中的方差,他的数值越大,意味着越远的像素会受影响,从而使更大的区域足够相似的颜色获取相同的颜色,当d>0,d指定了邻域大小与邻域无关,否则,d和邻域成正比。

在这些图像的平滑处理中,高斯模糊最为常用,

OpenCV图像平滑处理(模糊)———滤波_第1张图片

这些图像中,第一行中第一个是原图,第二个是高斯模糊,第三个是中值滤波
第二行中第一个是进度条,第二个是双边滤波,第三个是均值滤波
我第三个图像的名称写错了,请见谅。

我们调整进度条到15的位置,我这里设置的总值为15

我们会发现高斯模糊和双边滤波跟原图像没有太大的区别,而中值滤波和均值滤波变得内部轮廓不清晰了,如果是想要轮廓的话,不失为一种可用的方法,如果要一些细节的提取的话,还是选择其他的或者将内核调整的较小一些,也可以保证图像不失真的。

我这里贴下代码:

import cv2

img = cv2.imread("C:/Users/DELL/Desktop/img3.jpg")

def onSizeChange(x):
    position = cv2.getTrackbarPos("cannyBar", "Bar")
    print(position)
    if (position <= 0):
        return
    blur_img = cv2.blur(img, (position, position))
    bilater_img = cv2.bilateralFilter(img, position, position, position)
    if(position%2 == 0):
        position = position + 1
    gauss_img = cv2.GaussianBlur(img, (position, position), 1)
    media_img = cv2.medianBlur(img, position)
    cv2.imshow("Canny", blur_img)
    cv2.imshow("Gauss", gauss_img)
    cv2.imshow("Media", media_img)
    cv2.imshow("Bilater", bilater_img)

cv2.namedWindow("Bar")
cv2.createTrackbar("cannyBar", "Bar", 0, 15, onSizeChange)
cv2.imshow("src", img)
cv2.waitKey(0)

其实也是无意间发现的,这个对比之前的就是前面的在方法里面使用了waitKey(0)。
暂时还不了解原因,不过,可以看到进度条上面的数值终于是自己想要的,还是觉得挺开心的。

你可能感兴趣的:(OpenCV图像平滑处理(模糊)———滤波)