本篇文章介绍图像平滑处理,也称为模糊处理和低通滤波。图像平滑处理有利于降低噪声干扰。
主要学习filter2D()等函数的使用。
环境:Windows 7(64) Python 3.6 OpenCV3.4.2
一、均值滤波
1.1 blur()、boxFilter()、filter2D()函数介绍
blur()函数形式如下:
dst = cv.blur( src, ksize[, dst[, anchor[, borderType]]] )
功能:使用标准化的盒式滤波器模糊图像。
参数:
src:输入图像,可以是灰度图像,可以是彩色图像。
dst:输出图像。
ksize:核大小。
anchor:锚点,默认值Point(-1,-1)表示锚点位于内核中心。
borderType:边界填充类型。
borderType参数取值如下:
cv.BORDER_CONSTAN
cv.BORDER_REPLICATE
cv.BORDER_REFLECT
cv.BORDER_WRAP
cv.BORDER_REFLECT_101
cv.BORDER_TRANSPARENT
cv.BORDER_REFLECT101
cv.BORDER_DEFAULT
cv.BORDER_ISOLATED
boxFilter()函数形式如下:
dst = cv.boxFilter( src, ddepth, ksize[, dst[, anchor[, normalize[, borderType]]]] )
功能:使用盒式滤波器模糊图像。
参数:
src:输入图像,可以是灰度图像,可以是彩色图像。
dst:输出图像。
ddepth:输出图像的深度,-1表示使用原图像的深度
ksize:核大小。
anchor:锚点,默认值Point(-1,-1)表示锚点位于内核中心。
normalize:标志,指定是否标准化。
borderType:边界填充类型。
filter2D函数函数形式如下:
dst = cv.filter2D( src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]] )
功能:将原始图像与kernel进行卷积,从而达到滤波效果。可以产生不同的hernel进行不同效果的滤波。
参数:
src:输入图像,可以是灰度图像,可以是彩色图像。
ddepth:指定输出图像的深度
kernel:卷积核,是一个浮点型矩阵,
dst:输出图像。
anchor:锚点,默认值Point(-1,-1)表示锚点位于内核中心。
delta:在将它们存储在dst中之前,将可选值添加到已过滤的像素中。
borderType:边界填充类型。
1.2编程测试
代码如下:
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('src.jpg')
#filter2D处理
kernel = np.ones((5, 5), np.float32) / 25 #此为均值滤波卷积核
dstFilter2D = cv.filter2D(img, -1, kernel)
#blur处理
dstBlur = cv.blur(img,(5,5))
#boxFilter处理
dstBoxFilter = cv.boxFilter(img,-1, (5, 5))
#显示
plt.subplot(221),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(222),plt.imshow(dstFilter2D),plt.title('Filter2D')
plt.xticks([]), plt.yticks([])
plt.subplot(223),plt.imshow(dstBlur),plt.title('Blur')
plt.xticks([]), plt.yticks([])
plt.subplot(224),plt.imshow(dstBoxFilter),plt.title('BoxFilter')
plt.xticks([]), plt.yticks([])
plt.show()
程序运行结果如下:
二、高斯、中值、双边滤波
2.1 GaussianBlur()、medianBlur()、bilateralFilter()函数介绍
GaussianBlur()函数形式如下:
dst = cv.GaussianBlur( src, ksize, sigmaX[, dst[, sigmaY[, borderType]]] )
功能:采用高斯滤波模糊图像,即核为高斯核。
参数:
src:输入图像,可以是灰度图像,可以是彩色图像。
dst:输出图像。
ksize:核大小。
sigmaX:X轴方向上的标准差
sigmaY:Y轴方向上的标准差。如果为0,则让它等于sigmaX,若sigmaX==sigmaY==0,则由ksize.width和ksize.height计算所得。
borderType:边界填充类型。
medianBlur()函数形式如下:
dst = cv.medianBlur( src, ksize[, dst] )
功能:采用中值滤波模糊图像。
参数:
src:输入图像,可以是灰度图像,可以是彩色图像。
dst:输出图像。
ksize:核大小。
bilateralFilter()函数形式如下:
dst = cv.bilateralFilter( src, d, sigmaColor, sigmaSpace[, dst[, borderType]] )
功能:采用双边滤波模糊图像。降低噪声效果不错,并能很好的保存边缘信息。
参数:
src:输入图像,可以是灰度图像,可以是彩色图像。
dst:输出图像。
d:每个像素邻域的直径。
sigmaColor:在颜色空间中过滤sigma.
sigamaSpace:在坐标空间中过滤sigma
borderType:边界填充类型。
2.2 编程测试
代码如下:
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('src.jpg')
#ausssianBlur
dstGaussianBlur = cv.GaussianBlur(img, (11, 11), 0)
#MedianBlur
dstMedianBlur = cv.medianBlur(img, 11)
#BilateralFilter
dstBilateralFilter = cv.bilateralFilter(img, 9, 75, 75)
plt.subplot(221),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(222),plt.imshow(dstGaussianBlur),plt.title('GaussianBlur')
plt.xticks([]), plt.yticks([])
plt.subplot(223),plt.imshow(dstMedianBlur),plt.title('MedianBlur')
plt.xticks([]), plt.yticks([])
plt.subplot(224),plt.imshow(dstBilateralFilter),plt.title('BilateralFilter')
plt.xticks([]), plt.yticks([])
plt.show()
代码运行结果图如下:
双边滤波在去除噪声的同时可以较好地保留边缘信息,但其处理速度相对较慢。