Bootstrap

python学opencv|读取图像(五十五)使用cv2.medianBlur()函数实现图像像素中值滤波处理

【1】引言

在前述学习过程中,已经探索了取平均值的形式进行图像滤波处理。

均值滤波的具体的执行对象是一个nXn的像素核,对这个像素核内所有像素点的BGR值取平均值,然后把这个平均的BGR值直接赋给像素核中心位置的核心像素点,由此实现图像滤波。

实质上,这让图像变得更加模糊。

相关文章链接为:

python学opencv|读取图像(五十四)使用cv2.blur()函数实现图像像素均值处理-CSDN博客

既然有均值滤波,就会有中值滤波,这就是本次文章所要讲述的内容。

中值滤波调用的函数为:cv2.medianBlur()。

【2】官网教程

点击下方链接,直达cv2.medianBlur()函数的官网教程:OpenCV: Image Filtering

官网页面的解释为:

图1  cv2.medianBlur()函数的官网说明

官网对cv2.medianBlur()函数的参数解释为:

void cv::medianBlur     (    

        InputArray     src,               #输入图像
        OutputArray     dst,            #输出图像
        int     ksize )                       #像素核大小

【3】代码测试

首先是引入模块和初始图像:

import cv2 as cv  # 引入CV模块

# 读取图片
srcm = cv.imread('srcx.png')  # 读取图像srcx.png

然后进行中值滤波操作:

#滤波计算
src1 = cv.medianBlur(srcm,3)  # 图像取平均值,像素核大小为(3,3)
src2 = cv.medianBlur(srcm,5)  # 图像取平均值,像素核大小为(5,5)
src3 = cv.medianBlur(srcm,7)  # 图像取平均值,像素核大小为(7,7)

之后显示和保存图像:

# 显示结果
cv.imshow('srcm ', srcm)
cv.imshow('src1 ', src1)
cv.imshow('src2 ', src2)
cv.imshow('src3 ', src3)
cv.imwrite('src1.png',src1)
cv.imwrite('src2.png',src2)
cv.imwrite('src3.png',src3)
# 窗口控制
cv.waitKey()  # 图像不关闭
cv.destroyAllWindows()  # 释放所有窗口

代码运行相关的图像有:

图2 初始图像srcx.png

图3 中值滤波图像src1.png

图4 中值滤波图像src2.png

图5 中值滤波图像src3.png

和调用cv2.blur()函数使用均值滤波处理一样,调用cv2.medianBlur()函数进行中值滤波处理后,由图2到图5可见,随着像素核的增大,图像越来越模糊。这提醒我们,控制像素核的大小,可以进一步控制图像的模糊程度。

【4】细节说明

和调用cv2.blur()函数使用均值滤波处理不同,cv2.blur()函数需要给出(nXn)大小的像素核,调用cv2.medianBlur()函数进行中值滤波处理使用的像素核只需要写出边长n,但这个边长也应该是奇数,cv2.medianBlur()函数会自动根据这个边长划定一个正方形的像素核。

像素核使用奇数大小会比较好,因为奇数大小会在最中间围成一个方格,这个方格就是核心方格,中值计算的值直接赋给这个核心方格。

图6 滤波方式对比

【5】总结

掌握了使用python+opencv实现调用cv2.medianBlur()函数进行中值滤波处理图像的技巧。

 

;