【Python+OpenCV入门学习】十四、图像平滑处理

本篇文章介绍图像平滑处理,也称为模糊处理和低通滤波。图像平滑处理有利于降低噪声干扰。

主要学习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()

代码运行结果图如下:

                                

双边滤波在去除噪声的同时可以较好地保留边缘信息,但其处理速度相对较慢。

猜你喜欢

转载自blog.csdn.net/qq_18995069/article/details/84798295