图像平滑处理

图像滤波是图像处理和计算机视觉中最常用、最基本的操作。主要是去除图像中的噪声,因为图像平滑处理过程中往往会使得图像变的模糊,因此又叫模糊处理。

基本原理

图像平滑的基本原理是,将噪声所在像素点的像素值处理为其周围临近像素点的值的近似值。

图像平滑处理的方法有很多,比如均值滤波,方框滤波,高斯滤波,中值滤波,双边滤波。

(这里就不讲公式推导了)

1均值滤波

在进行均值滤波的时候要考虑需要对周围多少个像素去平均值,即确定核 的大小,通常情况下都是以当前像素点为中心,读行数和列数相等的一块区域内的所有像素点求平均。将计算得到的结果作为该点的像素。

图像平滑处理_第1张图片

原始图像像素

当前像素点为226的位置,我们对其周围5x5区域内像素点求平均计算方法为:

新值=(197+25+106+156+159+149+40+107+5+71+163+198+226+223+156+222+37+68+233+157+75+193+250+2+42)/25

计算得到的新值即为226像素点位置的新的像素。其中均值滤波的核如下所示

 图像平滑处理_第2张图片

1.1函数语法

在OpenCV中,实现均值滤波的函数是cv2.blur(),语法格式如下:

dst=cv2.blur(src,ksize,anchor,borderType)

dst是返回值,表示进行均值滤波后得到的结果

src是需要处理的图像,即原始图像,图像的深度有CV_8U,CV_16U,CV16S,CV32F,CV_64F.

ksize是核 的大小,

anchor是锚点,一般情况该值直接默认即可

borderType是边界样式,该值决定以何种方式处理边界,一般情况下不需要考虑该值的取值,直接默认即可。

因此函数cv2.blur()的一般形式为:

dst=cv2.blur(src,ksize)

接下来看一段程序

import cv2 as cv

img=cv.imread(r'F:\AI\photo\test\lena.jpg')

blurImg=cv.blur(img,(5,5))

print('imgshape',img.shape)
print('blurImg',blurImg.shape)
cv.imshow('img',img)
cv.imshow('blurImg',blurImg)
cv.waitKey()
cv.destroyAllWindows()

 图像平滑处理_第3张图片

 原始图像

图像平滑处理_第4张图片

均值滤波后的图像 

2.高斯滤波

均值滤波中,其邻域内每个像素的权重都是一样的,在高斯滤波中,中心点的权重值加大,远离中心点的权重值减少,在此基础上计算邻域内各个像素值不同权重的和。

图像平滑处理_第5张图片

高斯滤波卷积核示例

2.1函数语法

dst=cv2.GaussianBlur(src,ksize,sigmaX,sigmaY,borderType)

式中:

dst为高斯滤波后得到的结果

src是需要处理的图像,

ksize是滤波卷积核。需要注意的是滤波核 的值必须是奇数

sigmaX是卷积在水平方向的标准差,或者X方向求导

sigmaY是卷积在垂直方向的标准差,或者说Y方向上

bordenType是边界类型

因此高斯滤波的一般形式为

dst=cv2.GaussianBlur(src,ksize,0,0)

程序演示:

import cv2 as cv

img=cv.imread(r'F:\AI\photo\test\lena.jpg')

GS_blurImg=cv.GaussianBlur(img,(5,5),1,1)

print('imgshape',img.shape)
print('blurImg',GS_blurImg.shape)
cv.imshow('img',img)
cv.imshow('GS_blurImg',GS_blurImg)
cv.waitKey()
cv.destroyAllWindows()

 

相比原始图像,高斯滤波处理后的图像模糊了一些,但是相对于均值滤波来说,要好一些,这是因为高斯滤波卷积核在中心点的权重更高。

3.中值滤波

中值滤波就是将当前像素点及其邻域内的像素点排序后取中间值作为当前值的像素点。

图像平滑处理_第6张图片

中值滤波的处理过程为:将226像素点周期的8个像素点一起排序即5,37,40,68,107,198,223,223,226,所以226像素点的新 的像素值为107.

3.1函数语法

dscv2.medianBlur(src,ksize)

其中需要注意的是ksize核的大小必须是比1大的奇数,比如3,5,7等

import cv2 as cv

img=cv.imread(r'F:\AI\photo\test\lena.jpg')

medianblurImg=cv.medianBlur(img,5)


cv.imshow('img',img)
cv.imshow('medianblurImg',medianblurImg)
cv.waitKey()
cv.destroyAllWindows()

在中值滤波处理中,噪声成分很难被选中,所以可以在几乎不影响原有图像的情况下去除所有的噪声,但是由于需要进行排序等操作,中值滤波需要的运算较大。中值滤波对椒盐噪声去除效果较明显,下次补充,还有双边滤波以及方框滤波后面补充。 

你可能感兴趣的:(图像处理,计算机视觉,算法)