Python调用OpenCV实现图像平滑处理

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 效果图

07dfee842d164431a1ede3b3ce3eef9d.png

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

2b7698899ade49ad9a6b46e7941b0488.png

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 效果图

0f556584ef62480f8a7cf567a36418b1.png

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 效果图

e737197bc4b847fe8bca78283055cc8a.png5 双边滤波

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 效果图

aa9703f5c8a14ef18c8be888dbb80440.png

6 测试项目

6.1 创建项目

创建测试项目、配置开发环境,具体可参考之前文章,这里就不多说了

Win10+Python3.10+OpenCV4.6.0加载显示图片_来灵的博客-CSDN博客

这次测试项目名称image_smoothing,VS2022种创建好的项目截图

796e6884f5ce4507af1909ec3f2c5b3f.png

文件目录截图

31aeeecea9894b0fb21e9389d32c0d1a.png

下边代码是四种滤波器的总代码,您也可以创建每个滤波器单独的代码,这里不再赘述。

# !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 效果图

cd1284d4f860472990bc835ce35b6d01.png

7 总结

最后对四种常用的图像滤波器用途做以总

滤波器类型

用途

均值滤波

降低高斯白噪声

中值滤波

降低椒盐噪声

高斯滤波

降低图像噪声

双边滤波

降低图像噪声、同时保护图像边界信息

8 参考文献

1 《Python OpenCV从入门到精通》明日科技

2 OpenCV: Image Filtering

猜你喜欢

转载自blog.csdn.net/chexlong/article/details/128081685