使用Python,OpenCV进行平滑和模糊

  • 1. 效果图
  • 2. 原理
    • 2.1 依赖库及安装
    • 2.2 简单平均模糊
    • 2.3 高斯模糊
    • 2.4 中值模糊
    • 2.5 双边滤波
  • 3. 源代码
  • 参考

这篇博客将介绍如何使用OpenCV对图片进行平滑和模糊操作。
具体包括:

  • 简单平均模糊(cv2.blur)
  • 加权高斯模糊(cv2.GaussianBlur)
  • 中值滤波(cv2.medianBlur)
  • 双边滤波(cv2.bilateralFilter)

平滑和模糊是计算机视觉和图像处理中最常见的预处理步骤之一。

模糊是当相机拍摄的照片失去焦点时发生的事情。图像中更清晰的区域会丢失其细节。模糊意味着图像中的每个像素与其周围的像素强度混合。邻居中的一个“混合”像素成为模糊像素。

平滑能够减少高频内容,帮助忽略图像中较小的细节,而留下更多图像结果的内容。首先对图像平滑或模糊后,会使得阈值化、边缘检测能取得更好的效果。

1. 效果图

简单均值模糊——原始图 VS 3 * 3 VS 9 * 9 VS 15 * 15 效果图如下:

M * N(均为奇数)的内核取平均值作为中心像素的值,可以看到随着内核的增加,图像越来越模糊~
高斯模糊——原始图 VS 3 * 3 VS 9 * 9 VS 15 * 15 效果图如下:

M*N(均为奇数)的内核,不是简单的取平均值,而是取加权平均值。可以看到随着内核的增大,图像也会变得模糊,但能保存更多的图像边缘。

中值模糊——原始图 VS 3 * 3 VS 9 * 9 VS 15 * 15 效果图如下:

M * M(奇数,正方形)的内核,不取均值,也不取加权平均值,而是取邻域像素的中位数值,可以看到中值模糊不像高斯平滑那样的“自然模糊”,丢失了更多的细节和噪声。

模糊方法的目的是减少图像中的噪声和细节;然而,缺点是往往会失去图像的边缘。为了在保持边缘的同时减少噪声,可以使用双边模糊。双边模糊通过引入两个高斯分布来实现。

双边模糊——原始图 VS sc=21 VS sc=41 VS sc=61 效果图如下:
可以看到既模糊了图像,又极大的保持了边缘。

2. 原理

2.1 依赖库及安装

pip install opencv-contrib-python

opencv安装可参考

2.2 简单平均模糊

平均值过滤器:采用M* N(均为奇数)的标准化滤波器对图像进行卷积,取一个中心像素周围的像素区域,将所有这些像素平均在一起,并用平均值替换中心像素。

对于输入图像中的每个像素,这个内核将从左到右,从上到下滑动。要计算内核中心的像素(必须使用奇数,否则就不会有真正的“中心”)被设置为它周围所有其他像素的平均值。

  • 随着内核大小的增加,图像的模糊程度也会随之增加。简单地说:平滑内核越大,图像看起来就越模糊。 这很容易导致图像中对象的重要结构边缘的丢失。
  • 虽然平均平滑很容易理解,但它也会平均加权核心区域内的每个像素,这样做很容易使图像过度模糊,错过重要的边缘。可以通过应用高斯模糊来解决这个问题。

2.3 高斯模糊

高斯模糊类似于平均模糊,但使用的不是简单的平均值,而是加权平均值,即更接近中心像素的邻域像素对平均值贡献更多的“权重”。

  • 高斯平滑用于去除近似服从高斯分布的噪声。M * N(均为奇数)的内核,取加权平均值,使得能够保持图像中更多的边缘,看起来更“自然模糊。”

-当内核的大小增加时,应用于输出图像的模糊量也会增加。但是,模糊看起来更“自然”,比简单的平均平滑更能保留图像中的边缘。

2.4 中值模糊

**中值模糊方法在去除椒盐噪声时是最有效的。**想象一下拍照,把它放在你的餐桌上,然后在上面撒盐和胡椒。使用中值模糊方法,可以从图像中去除椒盐。

  • M * M(均为奇数,正方形的内核),在均值模糊、高斯模糊中,核大小可以是矩形的,而中值模糊的核大小必须是方形的。不同于取平均值,而是用邻域的中值代替中心像素。
  • 中值模糊在去除图像中的椒盐噪声方面更有效的原因是,每个中心像素总是被存在于图像中的像素强度所取代。由于中位数对异常值具有鲁棒性,因此椒盐噪声对中位数的影响将小于另一种统计方法,如平均值。
  • 平均和高斯等方法计算邻域的平均值或加权平均值-该平均像素强度可能存在于邻域中,也可能不存在于邻域中。但根据定义,中间像素必须存在于邻域中。
  • 通过将中心像素替换为中值而不是平均值,可以大大降低噪声。但也会丢失更多的细节。

2.5 双边滤波

双边滤波能很好的弥补尚需三种模糊方法的缺陷,能显著平滑图像的细节和纹理,同时仍然保留边界和边缘。
是通过俩个高斯核实现的。

  • diameter:定义像素邻域的直径——直径越大,模糊计算中包含的像素就越多,是一个正方形的内核大小。
  • sigmaColor: 颜色标准差——值越大,表示在计算模糊度时,将考虑邻域中的更多颜色。足够大——则只有颜色相似的像素才会对模糊产生显著影响。
  • sigmaSpace: 空间标准差——值越大意味着远离中心像素直径的像素将影响模糊计算。
    blurred = cv2.bilateralFilter(image, diameter, sigmaColor, sigmaSpace)

3. 源代码

# USAGE
# python blurring.py --image images/flower.jpg
# 对图像执行简单平均模糊、高斯模糊、中值模糊;# 导入必要的包
import argparseimport cv2
import imutils# 构建命令行参数及解析
# --image 要执行平滑和模糊操作的图像路径
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", type=str, default="adrian.png",help="path to input image")
args = vars(ap.parse_args())# 加载图像,展示它,初始化一个内核list,因此可以评估不同内核大小对模糊的影响
image = cv2.imread(args["image"])
image = imutils.resize(image, width=300)
cv2.imshow("Original", image)
kernelSizes = [(3, 3), (9, 9), (15, 15)]# 遍历内核
# 可以看到图像随着内核大小的增加而变得模糊。内核越大,图像就会越模糊。
for (kX, kY) in kernelSizes:# 应用当前内核执行简单平均模糊# 图像,高斯内核blurred = cv2.blur(image, (kX, kY))cv2.imshow("Average ({}, {})".format(kX, kY), blurred)cv2.waitKey(0)# 关闭所有窗口,清理屏幕
cv2.destroyAllWindows()
cv2.imshow("Original", image)# 遍历内核
for (kX, kY) in kernelSizes:# 对图像应用高斯平滑# 图像,高斯内核,sigma(标准偏差,0表示根据内核自动计算)blurred = cv2.GaussianBlur(image, (kX, kY), 0)cv2.imshow("Gaussian ({}, {})".format(kX, kY), blurred)cv2.waitKey(0)# 关闭所有窗口,清理屏幕
cv2.destroyAllWindows()
cv2.imshow("Original", image)# 遍历内核
for k in (3, 9, 15):# 应用中值模糊# 图像,内核blurred = cv2.medianBlur(image, k)cv2.imshow("Median {}".format(k), blurred)cv2.waitKey(0)# 关闭所有窗口,清理屏幕
cv2.destroyAllWindows()
cv2.imshow("Original", image)
params = [(11, 21, 7), (11, 41, 21), (11, 61, 39)]# 遍历双边滤波器的直径、颜色标准差、空间标准差
# diameter:定义像素邻域的直径——直径越大,模糊计算中包含的像素就越多,是一个正方形的内核大小。
# sigmaColor: 颜色标准差——值越大,表示在计算模糊度时,将考虑邻域中的更多颜色。足够大——则只有颜色相似的像素才会对模糊产生显著影响。
# sigmaSpace: 空间标准差——值越大意味着远离中心像素直径的像素将影响模糊计算。
for (diameter, sigmaColor, sigmaSpace) in params:# 应用当前设置参数执行双边滤波blurred = cv2.bilateralFilter(image, diameter, sigmaColor, sigmaSpace)# 展示输出图像及关联参数title = "Blurred d={}, sc={}, ss={}".format(diameter, sigmaColor, sigmaSpace)cv2.imshow(title, blurred)cv2.waitKey(0)cv2.destroyAllWindows()

参考

  • https://www.pyimagesearch.com/2021/04/28/opencv-smoothing-and-blurring/

使用Python,OpenCV进行平滑和模糊相关推荐

  1. (自己编写函数)Python + Opencv 图像边缘检测(模糊算法【老师给的ppt中原理是这样的,但是还有很多不明白,有很多参数老师没说怎么算,只说了每张图片不一样】)

    实验原理 1.首先,用重心法模糊推理图像中任意一像素点的边缘隶属方向,取其最大隶属度的方向为边缘隶属方向. 2.然后,在边缘隶属方向上根据像素点附近灰度分布的特点模糊推理该点的边缘隶属度,进而实现边缘 ...

  2. 计算机视觉开源库OpenCV之平滑、模糊和滤波

    平均模糊:过度模糊图像并忽略重要的边缘 blurred = cv2.blur(image, (kX, kY)) 参数1:模糊对象 参数2:矩阵大小 高斯模糊:保留更多的图像边缘 blurred = c ...

  3. Practical Python and OpenCV 3rd Edition读书笔记_Chapter8_Smoothing and Blurring平滑与模糊_思维导图

    <Practical Python and OpenCV 3rd Edition>真的是一本非常棒的入门书籍. 它也很薄,只有166页,虽然是纯英文的,如果静下心来认真看一两天就可以读完. ...

  4. Python OpenCV 图片模糊操作 blur 与 medianBlur

    Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧. Python OpenCV 基础知识铺垫 函数原型介绍 均值模糊 中值模糊 2D 卷积(图像滤波),自定义模糊 橡皮擦的小 ...

  5. OpenCv平滑与模糊

    OpenCv平滑与模糊 1.介绍 平滑与模糊 失去焦点,致使看不 图像细节,即像素点与周围的像素点混合了,在边缘检测方面很有用处 常用的平滑方法有均值.高斯.中值.双边. 2.代码部分 import ...

  6. OpenCV图像处理_2:平滑smoothing模糊blurring操作

    如之前所述,我个人在这个栏目下的所有文章大都是拷贝,拷贝和粘贴,有需要请阅读原文: OpenCV,OpenCV中文论坛,和Richard Szeliski写的Computer Vision: Algo ...

  7. Python+OpenCV图像处理实验

    目录 1.灰度化功能 2.反转功能 3.通道分离功能 4.噪音.滤波功能 5.高斯双边滤波功能 6.均值偏移滤波功能 7.图像二值化功能 8.Canny边缘检测功能 9.直线检测功能 10.圆形检测功 ...

  8. c++ opencv 识别车牌_小强学Python+OpenCV之-1.0开篇

    写在前面: 有没有想过使用Python + OpenCV来实现人脸识别? 想想就有点小兴奋吧. 小强也是不久前才了解到可以使用Python + OpenCV进行图像处理.觉得有趣就想学习一下. 在这里 ...

  9. Python+OpenCV:图像平滑

    Python+OpenCV:图像平滑 二维卷积(图像滤波) ###################################################################### ...

最新文章

  1. 条码扫描枪----针对MS3391扫码器的工作原理
  2. ASP.NET MVC 视图
  3. 双级减速器优化matlab,基于MATLAB的双级齿轮减速器优化设计
  4. ThhinkPHP5隐藏入口文件index.php
  5. 四轴PID控制算法详解(单环PID、串级PID)
  6. 200915阶段一C++模板
  7. java中0l 1_Java基础笔记1 - osc_0ltyoebk的个人空间 - OSCHINA - 中文开源技术交流社区...
  8. 安装sql server 2000时,提示:以前的某个程序安装已在安装计算机上创建挂起的文件操作,需重起...
  9. Struts标签入门
  10. 无监督和有监督的区别_机器学习和人工智能之间的区别
  11. C++11的std::declval与decltype
  12. 计算机语言缩写 dos,dos是什么意思 dos缩写中英全称是什么
  13. EPUB、CAJ 、PDF 格式的区别,有什么好用的安卓epub阅读器
  14. Java中的其他常用类(Math类,Scanner类、正则表达式)
  15. Window之删除云盘在设备和驱动器上的图标
  16. Matlab学习——曲柄滑块的运动仿真
  17. 一张图掌握薛兆丰经济学讲义的精华
  18. matlab求解振动学问题,振动力学基础与MATLAB应用
  19. AI无法低于1pt的细边框?解决办法
  20. java中的集合详解

热门文章

  1. RGB-D相机视觉SLAM
  2. 3D目标检测论文阅读多角度解析
  3. 2021年大数据Spark(三十二):SparkSQL的External DataSource
  4. Ubuntu 系统 Pycharm中无法使用中文输入法问题
  5. Python 用while 实现循环 到特定条件退出循环(input 输入错误之后重新输入)
  6. CSS盒模型( CSS margin 属性)
  7. 初级版python登录验证,上传下载文件加MD5文件校验
  8. JQ实现当前页面导航加效果(栏目页有效)
  9. php+文件+加密+原理,PHP的加密方式及原理
  10. xshell连接Linux、ngix部署