OpenCV实现图像平滑处理的方法汇总
作者:双子座断点 发布时间:2023-07-12 14:44:33
本文是OpenCV图像视觉入门之路的第10篇文章,本文详细的在图像上面进行了图像均值滤波、方框滤波 、高斯滤波、中值滤波、双边滤波、2D卷积等操作。
1 均值滤波
OpenCV 中的简单滤波(例如均值滤波或中值滤波)可能会使图像变得模糊,因为它们会平滑图像中的细节和边缘。如果滤波的程度过强,则可能会导致图像失真,使其看起来更差。因此,滤波的程度需要适当地控制,以获得最佳效果。
import cv2
import numpy as np
from numpy import unicode
if __name__ == '__main__':
img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg") # 读取彩色图像(BGR)
# 均值滤波
# 简单的平均卷积操作
img_blur1 = cv2.blur(img1, (3, 3)) # 使用3*3的卷积核
img_blur2 = cv2.blur(img1, (30, 30)) # 使用30*30的卷积核
cv2.imshow("blur1", img_blur1) # 显示叠加图像 dst
cv2.imshow("blur2", img_blur2) # 显示叠加图像 dst
cv2.imshow("image", img1) # 显示叠加图像 dst
cv2.waitKey(0)
cv2.destroyAllWindows()
2 方框滤波
方框滤波是一种图像平滑技术,在 OpenCV 中可以使用。方框滤波的主要作用是对图像进行去噪和平滑处理,使图像变得更加平滑,减少图像的锯齿状、噪声等不规则的部分。在图像处理中,方框滤波通常作为预处理步骤,以提高图像的质量和处理效果。
import cv2
import numpy as np
from numpy import unicode
if __name__ == '__main__':
img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg") # 读取彩色图像(BGR)
# 方框滤波
# 基本和均值一样,可以选择归一化
img_box1 = cv2.boxFilter(img1, -1, (3, 3), normalize=True)
img_box2 = cv2.boxFilter(img1, -1, (2, 2), normalize=False)
cv2.imshow("box1", img_box1) # 显示叠加图像 dst
cv2.imshow("box2", img_box2) # 显示叠加图像 dst
cv2.imshow("image", img1) # 显示叠加图像 dst
cv2.waitKey(0)
cv2.destroyAllWindows()
3 高斯滤波
高斯滤波是图像处理中一种常用的平滑处理方法。在使用OpenCV处理图像时,高斯滤波可以用于减少图像中的噪声和模糊不清的细节。此外,它还可以用于图像的边缘检测和图像分割,因为高斯滤波能够保留图像的主要特征,同时去除小的干扰。
import cv2
import numpy as np
from numpy import unicode
if __name__ == '__main__':
img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg") # 读取彩色图像(BGR)
# 高斯滤波
# 高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的
img_aussian1 = cv2.GaussianBlur(img1, (5, 5), 0, 0)
img_aussian2 = cv2.GaussianBlur(img1, (5, 5), 13, 13)
cv2.imshow("aussian1", img_aussian1) # 显示叠加图像 dst
cv2.imshow("aussian2", img_aussian2) # 显示叠加图像 dst
cv2.imshow("image", img1) # 显示叠加图像 dst
cv2.waitKey(0)
cv2.destroyAllWindows()
4 中值滤波
OpenCV 中值滤波是一种图像去噪方法,它通过在图像上选择一个掩码,并将其中的每个像素与周围像素值进行比较,以计算该像素的新值。新值是该像素周围像素值的中位数。这样,中值滤波能够有效去除图像中的噪声和椒盐噪声,使图像更清晰、更加稳定。
import cv2
import numpy as np
from numpy import unicode
if __name__ == '__main__':
img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg") # 读取彩色图像(BGR)
# 中值滤波
# 相当于用中值代替
img_median1 = cv2.medianBlur(img1, 3) # 中值滤波
img_median2 = cv2.medianBlur(img1, 9) # 中值滤波
cv2.imshow("median1", img_median1) # 显示叠加图像 dst
cv2.imshow("median2", img_median2) # 显示叠加图像 dst
cv2.imshow("image", img1) # 显示叠加图像 dst
cv2.waitKey(0)
cv2.destroyAllWindows()
5 双边滤波
双边滤波是一种图像模糊技术,它在保持图像边缘清晰的同时,对图像中的噪声进行有效去除。双边滤波算法通过比较图像上相邻像素的颜色差异和空间差异来确定每个像素的权重,从而决定每个像素的最终颜色值。在OpenCV中,双边滤波算法可用于处理图像的模糊、去噪、抗抖动等问题。
均值滤波、方框滤波、高斯滤波、中值滤波都是只单纯的考虑了像素点之间的空间信息而进行滤波的方式,这些方式都或多或少都会模糊图像的边缘信息,就是把图像里面的边缘线条弄模糊了,就是在去除图像噪音的同时把图像也弄模糊了,造成图像边界信息的部分丢失,这是这些方法的一个共同的缺点。
双边滤波就可以很好的规避这个缺点。因为双边滤波不仅考虑了像素的空间信息(距离越远权重越小)同时还考虑了像素的色彩信息(色彩差别越大,权重越小),这样就可以很好的去除噪声还可以较好的保护边缘信息,所以双边滤波器也是一个保边去噪的滤波器。
import cv2
import numpy as np
from numpy import unicode
if __name__ == '__main__':
img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg") # 读取彩色图像(BGR)
img_bilateralFilter1 = cv2.bilateralFilter(img1, 15, 150, 1000)
img_bilateralFilter2 = cv2.bilateralFilter(img1, 3, 255, 1000)
cv2.imshow("bilateralFilter2", img_bilateralFilter2) # 显示叠加图像 dst
cv2.imshow("bilateralFilter1", img_bilateralFilter1) # 显示叠加图像 dst
cv2.imshow("image", img1) # 显示叠加图像 dst
cv2.waitKey(0)
cv2.destroyAllWindows()
6 2D卷积(自定义卷积核实现卷积)
OpenCV 中的 2D 卷积的作用是图像滤波,它可以用来消除图像中的噪声、提取图像的特征、边缘检测等。它通过对图像中的每一个像素与一个固定的卷积核进行卷积操作来实现这些目的。
如果上面的均值滤波卷积核、方框滤波卷积核、高斯滤波卷积核、中值滤波卷积核、双边滤波卷积核都不能满足我们对图像的处理要求,此时我们就需要一个更加灵活的核——即我们自定义一个我们想要的核。如何实现呢?opencv中的cv2.filter2D()函数可以帮助我们实现:
cv2.filter2D(img, ddepth, kernel, anchor, delta, borderType)
img:要处理的原图
ddepth: 默认-1,表示与原图图像相同的深度
kernel: 卷积核,是一个单通道的数组。如果想处理彩图时,让每个通道使用不同的核,就必须先将彩图分解后再使用不同的核去卷积操作。
anchor: 默认值是(-1,-1),默认计算的结果位于核的中心位置。
delta:这个参数可写可不写。如果写,表示在卷积操作时,对应位置相乘相加后再加一个偏置,这个偏置就是delta。
borderType: 边界处理方式,一般用默认值即可。
import cv2
import numpy as np
from numpy import unicode
if __name__ == '__main__':
img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg") # 读取彩色图像(BGR)
kernel = np.ones((9, 9), np.float32) / 81 # 在实际中我们可以定义更复杂的卷积核,以实现自定义滤波操作
img_kernel1 = cv2.filter2D(img1, -1, kernel) # 这个滤波器就相当于均值滤波
kernel = np.ones((18, 18), np.float32) / 81 # 在实际中我们可以定义更复杂的卷积核,以实现自定义滤波操作
img_kernel2 = cv2.filter2D(img1, -1, kernel) # 这个滤波器就相当于均值滤波
cv2.imshow("kernel1", img_kernel1) # 显示叠加图像 dst
cv2.imshow("kernel2", img_kernel2) # 显示叠加图像 dst
cv2.imshow("image", img1) # 显示叠加图像 dst
cv2.waitKey(0)
cv2.destroyAllWindows()
来源:https://blog.csdn.net/qq_37529913/article/details/128825949


猜你喜欢
- 最近一段时间一直比较忙,已经有好几个月没有打理博客了。现将一个最近在项目中制作的一个菜单实例整理出来,共享一下。在后台或OA系统中最常用到的
- 本文实例讲述了python中的lambda表达式用法。分享给大家供大家参考,具体如下:这里来为大家介绍一下lambda函数。lambda 函
- K近邻法是有监督学习方法,原理很简单,假设我们有一堆分好类的样本数据,分好类表示每个样本都一个对应的已知类标签,当来一个测试样本要我们判断它
- 目前网络数据库的应用已经成为最为广泛的应用之一了,并且关于数据库的安全性,性能都是企业最为关心的事情。数据库渐渐成为企业的命脉,优化查询就解
- Python编程中类的概念可以比作是某种类型集合的描述,如“人类”可以被看作一个类,然后用人类这个类定义出每个具体的人——你、我、他等作为其
- 一:脚本需求利用Python3查询网站权重并自动存储在本地数据库(Mysql数据库)中,同时导出一份网站权重查询结果的EXCEL表格数据库类
- Math.min()和Math.max()用法相似。两个方法用来获取给定的一组数值中的最大值或最小值,但是却不接受数组作为参数。当然可以写个
- 作为python和机器学习的初学者,目睹了AI玩游戏的各种风骚操作,心里也是跃跃欲试。然后发现微信跳一跳很符合需求,因为它不需要处理连续画面
- 一、问题引发思考前阵子与同事探讨一个小需求时又遇到了按钮表示“动作”和表示“状态”间矛盾问题。想想这个问题多年前已经开始讨论了,所以在此整理
- A.动态页面第一步:创建转向控制页面,创建网站默认的首页文件(通常为"index.asp"或"default.
- profiling是个很好用的mysql性能分析工具,今儿就来试验下profiling的功能。感谢 有爱玫瑰的博文:mysql 的 sql
- 我就废话不多说了,大家还是直接看代码吧~old_record=numpy.load('exist.npy')temp_rec
- Etag是URL的Entity Tag,用于标示URL对象是否改变,区分不同语言和Session等等。具体内部含义是使服务器控制的,就像Co
- python 里有一个 threading 模块,其中提供了一个函数:threading.Thread(target=function, a
- 大家觉得在接手遗留代码时,见到什么东东是最让人感到不耐烦的?复杂无比的 UML ?我觉得不是。我的答案是,超过两个 else 的 if ,或
- 本文实例为大家分享了python模拟事件触发机制的具体代码,供大家参考,具体内容如下EventManager.py# -*- encodin
- 废话不多说了,直接给大家贴代码了。编写setup.py后$ python setup.py register$ python setup.p
- 本文实例主要是实现爬取一个网页上的图片地址,具体如下。读取一个网页的源代码:import urllib.requestdef getHtml
- pymysql写入中文直接写入中文会出现错误。根据网上的方法,设置my.ini不成功sql = "INSERT INTO comp
- 前言在写程序时,我们会经常碰到程序出现异常,这时候我们就不得不处理这些异常,以保证程序的健壮性。处理异常的版本有以下几种,你通常的做法是哪种