Python OpenCV 图片模糊操作 blur 与 medianBlur

梦想橡皮擦 2021-01-21 10:35:21
Python OpenCV 图片 操作 模糊


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 cv
import 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()

Python OpenCV 图片模糊操作 blur 与 medianBlur

中值模糊

概念(读一读就行了):

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

函数原型如下:

cv2.medianBlur(src, ksize[, dst]) -> dst

参数说明:

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

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

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

import numpy as np
import random
import 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.02
out = sp_noise(img, prob=0.02)
cv2.imshow("img", out)
cv2.waitKey()

Python OpenCV 图片模糊操作 blur 与 medianBlur

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

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

Python OpenCV 图片模糊操作 blur 与 medianBlur

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)

运行效果:
Python OpenCV 图片模糊操作 blur 与 medianBlur
使用 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,才是锐化。
Python OpenCV 图片模糊操作 blur 与 medianBlur

橡皮擦的小节

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

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

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

推荐阅读

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

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


今天是持续写作的第 60 / 100 天。
如果你有想要交流的想法、技术,欢迎在评论区留言。


如果你想跟博主建立亲密关系,可以关注博主,或者关注博主公众号 “非本科程序员”,了解一个非本科程序员是如何成长的。
博主 ID:梦想橡皮擦,希望大家点赞、评论、收藏

版权声明
本文为[梦想橡皮擦]所创,转载请带上原文链接,感谢
https://dream.blog.csdn.net/article/details/112909678

  1. Python批量 png转ico
  2. 使用line_profiler对python代码性能进行评估优化
  3. 使用line_profiler对python代码性能进行评估优化
  4. Getting started with Python 3 flash in win environment
  5. Common ways to write configuration files in Python
  6. Python会在2021年死去吗? Python 3.9最终版本的回顾
  7. Python batch PNG to ICO
  8. Using line_ Profiler evaluates and optimizes the performance of Python code
  9. Using line_ Profiler evaluates and optimizes the performance of Python code
  10. Will Python die in 2021? A review of the final version of Python 3.9
  11. Python3 SMTP send mail
  12. Understanding closures in Python: getting started with closures
  13. Python日志实践
  14. Python logging practice
  15. [python opencv 计算机视觉零基础到实战] 十、图片效果毛玻璃
  16. [python opencv 计算机视觉零基础到实战] 九、模糊
  17. 10. Picture effect ground glass
  18. [Python opencv computer vision zero basis to actual combat] 9. Fuzzy
  19. 使用line_profiler對python程式碼效能進行評估優化
  20. Using line_ Profiler to evaluate and optimize the performance of Python code
  21. LeetCode | 0508. 出现次数最多的子树元素和【Python】
  22. Leetcode | 0508
  23. LeetCode | 0530. 二叉搜索树的最小绝对差【Python】
  24. LeetCode | 0515. 在每个树行中找最大值【Python】
  25. Leetcode | 0530. Minimum absolute difference of binary search tree [Python]
  26. Leetcode | 0515. Find the maximum value in each tree row [Python]
  27. 我来记笔记啦-搭建python虚拟环境
  28. Let me take notes - building a python virtual environment
  29. LeetCode | 0513. 找树左下角的值【Python】
  30. Leetcode | 0513. Find the value in the lower left corner of the tree [Python]
  31. Python OpenCV 泛洪填充,取经之旅第 21 天
  32. Python opencv flood fill, day 21
  33. Python爬虫自学系列(二)
  34. Python crawler self study series (2)
  35. 【python】身份证号码有效性检验
  36. [Python] validity test of ID number
  37. Python ORM - pymysql&sqlalchemy
  38. Python ORM - pymysql&sqlalchemy
  39. centos7 安装python3.8
  40. centos7 安装python3.8
  41. Centos7 installing Python 3.8
  42. Centos7 installing Python 3.8
  43. Django——图书管理系统(六)
  44. Django——图书管理系统(五)
  45. Django -- library management system (6)
  46. Django -- library management system (5)
  47. python批量插入数据小脚本
  48. Python batch insert data script
  49. ZoomEye-python 使用指南
  50. Zoomeye Python User's Guide
  51. 用Python写代码,一分钟搞定一天工作量,同事直呼:好家伙 - 知乎
  52. Using Python to write code, one minute to complete a day's workload, colleagues call: good guy - Zhihu
  53. Python 上的可视化库——PyG2Plot
  54. Pyg2plot: a visualization library on Python
  55. Python 上的可视化库——PyG2Plot
  56. Python实用代码-无限级分类树状结构生成算法
  57. Pyg2plot: a visualization library on Python
  58. Python utility code - infinite classification tree structure generation algorithm
  59. 奇技淫巧,还是正统功夫?Python推导式最全用法
  60. Pandas 的这个知识点,估计 80% 的人都得挂!