前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV 滤波与卷积之 —— 平滑

OpenCV 滤波与卷积之 —— 平滑

作者头像
为为为什么
发布2022-08-09 14:56:25
8000
发布2022-08-09 14:56:25
举报
文章被收录于专栏:又见苍岚

本文摘录OpenCV 中的卷积、滤波相关操作内容,重点介绍 Opencv 中的平滑滤波操作。

平滑

平滑一般也称“模糊”,是一种简单而又常用的图像处理操作。平滑图像的目的有很多,但通常都是为了减少噪声和伪影。在降低图像分辨率的时候,平滑也是十分重要的。OpenCV 提供5种不同的平滑操作,每种操作都有对应的函数实现,这些操作平滑的结果有着细微的差别。

1. cv2.blur()

简单模糊,官网链接

  • 函数使用
代码语言:javascript
复制
cv.blur(src, ksize[, dst[, anchor[, borderType]]]) -> dst

blur 函数执行平均的核卷积图像操作,卷积核为:

  • 示例代码
代码语言:javascript
复制
img = mt.cv_rgb_imread('img1.jpg', gray=True)
res = cv2.blur(img, [17, 17])
PIS(img, res)

2. cv2.boxFilter()

OpenCV中的函数cv2.boxFilter()是一种一般化的形式,而cv2.blur()是一种特殊化的形式。两者之间根本的区别主要是前者可以以非归一化形式调用,并且输出图像深度可以控制(cv2.blur()输出图像的深度与源图像保持一致)。假如变量ddepth的值设为-1,目标图像的深度将于源图像保持一致。

  • 函数使用
代码语言:javascript
复制
cv2.boxFilter(
	src, 			# 源图像
	ddepth, 		# 输出图像深度
	ksize, 			# 核尺寸
	anchor, 		# 中心锚点位置
	normalize = True)		# 是否归一化,如果 True,结果会除以核面积

  • 示例代码
代码语言:javascript
复制
img = mt.cv_rgb_imread('img1.jpg', gray=False)
res = cv2.boxFilter(img, 3, [17, 17])
PIS(img, res)

3. cv2.medianBlur()

中值滤波,官网链接 中值滤波器是一种非线性核的实例,无法以图形形式表示。

  • 函数使用
代码语言:javascript
复制
cv2.medianBlur(src, ksize[, dst]) ->	dst

中值滤波器(Median Filter)将每个像素替换为围绕这个像素的矩形邻域内的中值或“中值”像素(相对于平均像素)。通过平均的简单模糊对噪声图像,尤其是有较大孤立的异常值(比如数字影像中的拍摄噪声)非常敏感。少量具有较大偏差的点也会严重影响到均值滤波。中值滤波可以采用取中间点的方式来消除异常值。

  • 示例代码
代码语言:javascript
复制
img = mt.cv_rgb_imread('img1.jpg', gray=False)
res = cv2.medianBlur(img, 17)
PIS(img, res)

4. cv2.GaussianBlur()

使用高斯滤波器模糊图像。该函数卷积具有指定高斯核的源图像。 官方链接

  • 函数使用
代码语言:javascript
复制
cv.GaussianBlur(
    src, 				# 源图像
    ksize, 				# 高斯核尺寸
    sigmaX[, 			# X 方向的高斯核标准差。
    dst[, 
    sigmaY[, 			# X 方向的高斯核标准差。如果 sigmaY 是0,那么它将被设置为 sigmaX。
    					#如果两个 sigmas 都是零,那么它们将分别从 ksize.width 和 ksize.height 计算出来
    borderType]
    ]]) -> dst

  • 两个 sigmas 都是零,高斯参数计算公式:

$$ \begin{array}{c}

\sigma_{x}=\left(\frac{n_{x}-1}{2}\right) \cdot 0.30+0.80, n_{x}=k size. width -1\ \sigma_{y}=\left(\frac{n_{y}-1}{2}\right) \cdot 0.30+0.80, n_{y}=k size .height -1 \end{array} $$

  • 高斯核示例
  • OpenCV实现的高斯平滑还为几个常用的内核提供性能上的优化。3×3、5×5以及7×7的标准sigma核(sigmaX=0.0) 相对其他核性能更优。
  • 示例代码
代码语言:javascript
复制
img = mt.cv_rgb_imread('img1.jpg', gray=False)
res = cv2.GaussianBlur(img, [17, 17], 10, 10)
PIS(img, res)

5. cv2.bilateralFilter()

双边滤波 官网链接

  • 函数使用
代码语言:javascript
复制
cv2.bilateralFilter(
	src, 				# 源图像
	d, 					# 像素邻域的直径
	sigmaColor, 		# 颜色空间滤波器的sigma值
	sigmaSpace[, 		# 坐标空间中滤波器的sigma值
	dst[, 
	borderType]]) -> dst

相似于高斯平滑,双边滤波对每个像素及其领域内的像素进行了加权平均。其权重由两部分组成,第一部分同高斯平滑;第二部分也是高斯权重,不同的是它不是基于空间距离而是色彩强度差计算而来,在多通道(彩色)图像上强度差由各分量的加权累加代替。

可以把双边滤波当作是高斯平滑,只是相似程度更高的像素权值更高,边缘更明显,对比度更高。双边滤波的效果就是将源图像变成一幅水彩画,这种效果在多次迭代后更加显著,因此这种方法在图像分割领域十分有用。

代码语言:javascript
复制
img = mt.cv_rgb_imread('img1.jpg', gray=False)
res = cv2.bilateralFilter(img, 9, 100, 1000)
PIS(img, res)

示例源码

参考资料

  • 《学习 OpenCV3》 第十章
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年3月14日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 平滑
    • 1. cv2.blur()
      • 2. cv2.boxFilter()
        • 3. cv2.medianBlur()
          • 4. cv2.GaussianBlur()
            • 5. cv2.bilateralFilter()
            • 示例源码
            • 参考资料
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档