1 前言
上一节,我们介绍了C++调用OpenCV接口,如何实现对图像的平滑处理,本节我们介绍一下在Python环境下调用OPenCV接口,如何对图像进行平滑模糊处理。接下来我们依次介绍均值滤波器、中值滤波器、高斯滤波器和双边滤波器的Python代码实现。其原理介绍,请参见C++调用OpenCV实现图像平滑处理,本节不再重复描述。
2 均值滤波
2.1 关键接口
Python调用OpenCV实现均值滤波的关键函数原型:
dst = cv.blur(src, ksize, anchor, borderType)
参数说明:
参数1:被处理的图像
参数2:滤波核大小,其格式为(高度,宽度),建议使用(3,3),(5,5),(7,7)等宽、高相等的奇数边长。滤波核越大,处理之后的图像越模糊
参数3:滤波核的锚点,建议采用默认值,可以自动计算锚点
参数4:边界样式,建议采用默认值
返回值:均值滤波处理之后的图像
2.2 代码实现
示例代码采用5 x 5的滤波核,对图像进行均值滤波处理:
# !usr/bin/env python
# -*- coding: utf-8 -*-
import cv2
from skimage import util
#均值滤波平滑处理图像
def blur(colorPath):
#定义滤波核大小
size = 5
#打开彩色原始图像
imgColor = cv2.imread(colorPath)
#打开失败
if imgColor is None:
print("Error opening image...")
return -1
#均值滤波降低图像噪声
blurImg = cv2.blur(imgColor, (size, size))
#显示图像
cv2.imshow('src', imgColor)
cv2.imshow('blur', blurImg)
#保存处理后的图像
cv2.imwrite('blur.jpg', blurImg)
#按下任何键盘按键后退出
cv2.waitKey()
#销毁所有窗口
cv2.destroyAllWindows()
if __name__ == '__main__':
colorPath = "flower.jpg"
blur(colorPath)
2.3 效果图
3 中值滤波
3.1 关键接口
Python调用OpenCV实现中值滤波的关键函数原型:
dst = cv2.medianBlur(src, ksize)
参数说明:
参数1:待处理的图像
参数2:滤波核大小,其值表示边长,必须是大于1的奇数 3,5,7等
返回值:中值滤波处理后的图像
在这里我们使用Python中的skimage图像处理模块,给图片添加椒盐噪声,然后用中值滤波去掉椒盐噪声。
添加噪声接口函数原型:
skimage.util.random_noise(image, mode, seed=None, clip=True, **kwargs)
参数说明:
参数1:输入图像数据,类型为ndarray,输入后将转换为float64格式
参数2:选择添加噪声的类别。字符串str类型,取值如下:
‘gaussian’ 高斯加性噪声
‘poisson’ 泊松分布的噪声
‘salt’ 盐噪声,随机用1替换像素。属于高灰度噪声
‘peppe’ 胡椒噪声,随机用0或-1替换像素。属于低灰度噪声
‘s&p’ 椒盐噪声,盐噪声和胡椒噪声同时出现,呈现出黑白杂点
‘localvar’ 高斯加性噪声,每点具有特定的局部方差
‘speckle’ 使用 out = image + n *image 的乘法噪声,其中n是具有指定均值和方差的均匀噪声
参数3:int类型。 将在生成噪声之前设置随机种子,以进行有效的伪随机比较
参数4:bool类型。若为True则在加入噪声后进行剪切以保证图像数据点都在[0,1]或[-1.1]之间。若为False,则数据可能超出这个范围
在使用skimage库之前,需要先安装scikit-image。打开PowerShell,输入安装命令:
pip install scikit-image
3.2 代码实现
# !usr/bin/env python
# -*- coding: utf-8 -*-
import cv2
from skimage import util
#中值滤波平滑处理图像
def medianBlur(colorPath):
#定义滤波核大小
size = 5
#打开彩色原始图像
imgColor = cv2.imread(colorPath)
#打开失败
if imgColor is None:
print("Error opening image...")
return -1
#给图像添加椒盐噪声,处理后图像变为float64格式
imgSpNoise = util.random_noise(imgColor, mode="s&p")
#将图像转换为uint8格式,否则保存后是全黑的
imgSpNoise = cv2.normalize(imgSpNoise, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U)
#中值滤波降低图像噪声
medianblurImg = cv2.medianBlur(imgSpNoise, size)
#显示图像
cv2.imshow('src', imgColor)
cv2.imshow('sp noise', imgSpNoise)
cv2.imshow('medianBlur', medianblurImg)
#保存处理后的图像
cv2.imwrite('sp noise.jpg', imgSpNoise)
cv2.imwrite('medianBlur.jpg', medianblurImg)
#按下任何键盘按键后退出
cv2.waitKey()
#销毁所有窗口
cv2.destroyAllWindows()
if __name__ == '__main__':
colorPath = "flower.jpg"
medianBlur(colorPath)
3.3 效果图
4 高斯滤波
4.1 关键接口
Python调用OpenCV实现高斯滤波的关键函数原型:
dst = cv2.GaussianBlur(src, ksize, sigmaX, sigmaY, borderType)
参数说明:
参数1:待处理的图像
参数2:滤波核的大小,宽高必须是奇数,与均值滤波相同
参数3:卷积核水平方向的标准差,建议填0,会根据滤波核的大小自动计算合适的权重比例
参数4:卷积核垂直方向的标准差,建议填0,会根据滤波核的大小自动计算合适的权重比例
参数5:边界样式,建议使用默认值
返回值:高斯滤波处理之后的图像
4.2 代码实现
# !usr/bin/env python
# -*- coding: utf-8 -*-
import cv2
from skimage import util
#高斯滤波平滑处理图像
def GaussianBlur(colorPath):
#定义滤波核大小
size = 5
#打开彩色原始图像
imgColor = cv2.imread(colorPath)
#打开失败
if imgColor is None:
print("Error opening image...")
return -1
#给图像添加高斯加性噪声,处理后图像变为float64格式
imgGaussNoise = util.random_noise(imgColor, mode="gaussian")
#将图像转换为uint8格式,否则保存后是全黑的
imgGaussNoise = cv2.normalize(imgGaussNoise, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U)
#高斯滤波5x5降噪
gaussImg = cv2.GaussianBlur(imgGaussNoise, (size, size), 0, 0)
#显示图像
cv2.imshow('src', imgColor)
cv2.imshow('GaussNoise', imgGaussNoise)
cv2.imshow('Gauss', gaussImg)
#保存处理后的图像
cv2.imwrite('GaussNoise.jpg', imgGaussNoise)
cv2.imwrite('Gauss.jpg', gaussImg)
#按下任何键盘按键后退出
cv2.waitKey()
#销毁所有窗口
cv2.destroyAllWindows()
if __name__ == '__main__':
colorPath = "flower.jpg"
GaussianBlur(colorPath)
4.3 效果图
5 双边滤波
5.1 关键接口
Python调用OpenCV实现高斯滤波的关键函数原型:
dst = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, borderType)
参数说明:
参数1:待处理的图像
参数2:以当前像素为中心的整个滤波区域的直径。如果d<0,则自动根据sigmaSpace参数计算得到。该值与保留的边缘信息数量成正比,与方法运行效率成反比
参数3:参与计算的颜色范围,这个值是像素颜色值与周围颜色值的最大差值,只有颜色值之差小于这个值时,周围的像素才进行滤波计算。值为255时,表示所有颜色都参与计算
参数4:坐标空间的σ(sigma)值,该值越大,参与计算的像素数量就越多
参数5:边界样式,建议默认值
返回值:双边滤波处理后的图像
5.2 代码实现
# !usr/bin/env python
# -*- coding: utf-8 -*-
import cv2
from skimage import util
#双边滤波平滑处理图像
def bilateralFilter(colorPath):
#定义滤波区域直径大小
d = 5
#打开彩色原始图像
imgColor = cv2.imread(colorPath)
#打开失败
if imgColor is None:
print("Error opening image...")
return -1
#双边滤波平滑处理
bfImg = cv2.bilateralFilter(imgColor, d, 2 * d, d / 2)
#显示图像
cv2.imshow('src', imgColor)
cv2.imshow('bilateral', bfImg)
#保存处理后的图像
cv2.imwrite('bilateral.jpg', bfImg)
#按下任何键盘按键后退出
cv2.waitKey()
#销毁所有窗口
cv2.destroyAllWindows()
if __name__ == '__main__':
colorPath = "flower.jpg"
bilateralFilter(colorPath)
5.3 效果图
6 测试项目
6.1 创建项目
创建测试项目、配置开发环境,具体可参考之前文章,这里就不多说了
Win10+Python3.10+OpenCV4.6.0加载显示图片_来灵的博客-CSDN博客
这次测试项目名称image_smoothing,VS2022种创建好的项目截图
文件目录截图
下边代码是四种滤波器的总代码,您也可以创建每个滤波器单独的代码,这里不再赘述。
# !usr/bin/env python
# -*- coding: utf-8 -*-
import cv2
def img_smoothing(colorPath):
print("start testing...")
#定义滤波核大小
size = 5
#定义滤波区域直径大小
d = 5
#打开彩色原始图像
imgColor = cv2.imread(colorPath)
#打开失败
if imgColor is None:
print("Error opening image...")
return
#均值滤波降低图像噪声
blurImg = cv2.blur(imgColor, (size, size))
#中值滤波降低图像噪声
medianblurImg = cv2.medianBlur(imgColor, size)
#高斯滤波5x5降噪
gaussImg = cv2.GaussianBlur(imgColor, (size, size), 0, 0)
#双边滤波平滑处理
bfImg = cv2.bilateralFilter(imgColor, d, 2 * d, d / 2)
#显示图像
cv2.imshow('src', imgColor)
cv2.imshow('blur', blurImg)
cv2.imshow('medianBlur', medianblurImg)
cv2.imshow('GaussianBlur', gaussImg)
cv2.imshow('bilateralFilter', bfImg)
#保存处理后的图像
cv2.imwrite('blur.jpg', blurImg)
cv2.imwrite('medianBlur.jpg', medianblurImg)
cv2.imwrite('gauss.jpg', gaussImg)
cv2.imwrite('bilateral.jpg', bfImg)
#按下任何键盘按键后退出
cv2.waitKey()
#销毁所有窗口
cv2.destroyAllWindows()
print("stop testing...")
if __name__ == '__main__':
colorPath = "flower.jpg"
img_smoothing(colorPath)
6.2 效果图
7 总结
最后对四种常用的图像滤波器用途做以总
滤波器类型 |
用途 |
均值滤波 |
降低高斯白噪声 |
中值滤波 |
降低椒盐噪声 |
高斯滤波 |
降低图像噪声 |
双边滤波 |
降低图像噪声、同时保护图像边界信息 |
8 参考文献
1 《Python OpenCV从入门到精通》明日科技