写点什么

Python OpenCV 图片模糊操作 blur 与 medianBlur

发布于: 2021 年 04 月 09 日
Python OpenCV 图片模糊操作 blur 与 medianBlur

Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧。


基础知识铺垫

Python OpenCV 中模糊操作的原理是:


基于离散卷积、定义好每个卷积核、不同卷积核得到不同的卷积效果、模糊是卷积的一种表象。橡皮擦表示没看懂,先在脑子中有个大概印象就行,毕竟才学习 20 多天。


本篇博客要学习的模糊有


  1. 均值模糊:一般用来处理图像的随机噪声;

  2. 中值模糊:一般用来处理图像的椒盐噪声;

  3. 自定义模糊:对图像进行增强,锐化等操作。

函数原型介绍

均值模糊

概念:


均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围 8 个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。


哇哦,没看懂,直接看一下原型吧,先用起来,在复盘理论。


cv2.blur(src, ksize[, dst[, anchor[, borderType]]]) -> dst
复制代码


参数说明:


  • src:待处理图像,熟悉参数;

  • ksize:表示模糊内核大小。比如(5,5)表示生成的模糊内核是一个 5*5 的矩阵;

  • dst:表示输出与 src 相同大小和类型的图像;

  • anchor:可选参数

  • borderType:可选参数


测试代码如下:


import cv2 as cvimport numpy as np
def blur_demo(src): dst = cv.blur(src, (5, 5)) cv.imshow("blur_demo", dst)
if __name__ == "__main__": src = cv.imread("./1.jpg") blur_demo(src) cv.waitKey() cv.destroyAllWindows()
复制代码


中值模糊

概念(读一读就行了):


中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。


函数原型如下:


cv2.medianBlur(src, ksize[, dst]) -> dst
复制代码


参数说明:


  • src:待处理的输入图像;

  • ksize:参数表示滤波窗口尺寸,必须是奇数并且大于 1。比如这里是 5,中值滤波器就会使用 5×5 的范围来计算,即对像素的中心值及其 5×5 邻域组成了一个数值集,对其进行处理计算,当前像素被其中值替换掉;

  • dst:参数表示输出与 src 相同大小和类型的图像。


中值模糊一般用在存在一些躁声点图像,例如白噪声,可以去除。


首先通过下述代码制造一张椒盐图片。


import numpy as npimport randomimport cv2
def sp_noise(image, prob): output = np.zeros(image.shape, np.uint8) thres = 1 - prob for i in range(image.shape[0]): for j in range(image.shape[1]): rdn = random.random() if rdn < prob: output[i][j] = 0 elif rdn > thres: output[i][j] = 255 else: output[i][j] = image[i][j] return output
img = cv2.imread("./1.jpg")# 添加椒盐噪声,噪声比例 0.02out = sp_noise(img, prob=0.02)cv2.imshow("img", out)cv2.waitKey()
复制代码



对上述代码生成的图片进行中值模糊操作。


# 中值模糊 ,去椒盐噪声def median_blur_demo(src):    dst = cv.medianBlur(src, 3)    cv.imshow("dst", dst)
复制代码


2D 卷积(图像滤波),自定义模糊

概念:


图像作为一个一维信号,也可以通过多种低通过滤器(low-pass filters, LPF)和高通过滤器(high-pass filters, HPF)来过滤。低通过滤器可以去除噪声,或者模糊图像。高通过滤器可以帮助在一个图像中找出边界。


函数原型为:


cv2.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]]) -> dst
复制代码


参数说明:


  • src:待处理的输入图像;

  • ddepth:表示目标图像深度,输入值为-1 时,目标图像和原图像深度保持一致;

  • kernel::卷积核(或者是相关核),一个单通道浮点型矩阵。修改 kernel 矩阵即可实现不同的模糊;

  • anchor:可选参数,内核的锚点,指示内核中过滤点的相对位置;锚应位于内核中;默认值(-1,-1)表示锚位于内核中心;

  • detal :可选参数,在将它们存储在 dst 中之前,将可选值添加到已过滤的像素中。类似于偏置;

  • borderType:可选参数,像素外推法


测试代码如下:


# 模糊操作def filter2D_demo(src):  # 除以 25 是防止溢出    kernel = np.ones([5,5],np.float32)/25    dst = cv.filter2D(src,-1,kernel=kernel)    cv.imshow("dst",dst)
复制代码


运行效果:

使用 filter2D 函数,实现锐化。


def filter2D_demo(src):
# 当kernel总和为 1 时:增强锐化 # 当kernel总和为 0 时:边缘梯度 kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32) dst = cv.filter2D(src, -1, kernel=kernel) cv.imshow("dst", dst)
复制代码


注意上述代码中 kernel 对应的数组中,各个值都为奇数,总和要等于 1,才是锐化。

橡皮擦的小节

本系列博客为学习之旅,部分概念在没有学到,或者必须彻底掌握前,不做扩展学习。保持每天 1 个小时的学习时间即可。


1 个小时又过去了,对 Python OpenCV 相关的知识点,你掌握了吗?


做为初学者,还有很多地方学习的不深入,希望你与我一起坚持下去。

推荐阅读

空闲之余,可以订阅橡皮擦的爬虫百例课程学习爬虫知识。


想学 Python 爬虫,可以订阅橡皮擦专栏哦~ 🈲🈲🈲🈲 点击发现惊喜 🈲🈲🈲🈲




如果你想跟博主建立亲密关系,可以关注同名公众号 <font color="red">梦想橡皮擦</font>,近距离接触一个逗趣的互联网高级网虫。博主 ID:梦想橡皮擦,希望大家<font color="red">点赞</font>、<font color="red">评论</font>、<font color="red">收藏</font>。

发布于: 2021 年 04 月 09 日阅读数: 45
用户头像

爬虫 100 例作者,蓝桥签约作者,博客专家 2021.02.06 加入

6 年产品经理+教学经验,3 年互联网项目管理经验; 互联网资深爱好者; 沉迷各种技术无法自拔,导致年龄被困在 25 岁; CSDN 爬虫 100 例作者。 个人公众号“梦想橡皮擦”。

评论

发布
暂无评论
Python OpenCV 图片模糊操作 blur 与 medianBlur