资讯专栏INFORMATION COLUMN

opencv python 图像平滑/2D卷积/图像平滑/平均值法/高斯模糊/中值模糊/双边滤波

Little_XM / 1400人阅读

摘要:卷积与一维信号一样,图像也可以使用各种低通滤波器,高通滤波器等进行滤波有助于消除噪声,模糊图像等滤波器有助于找到边缘图片将内核与图像进行卷积应用对图像进行平均过滤。它只取内核区域下所有像素的平均值并替换中心元素。

Smoothing Images

1 2D卷积

与一维信号一样,图像也可以使用各种低通滤波器(LPF),高通滤波器(HPF)等进行滤波.LPF有助于消除噪声,模糊图像等.HPF滤波器有助于找到边缘图片.

cv.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]]):将内核与图像进行卷积

应用

对图像进行平均过滤。 一个5x5的平均滤波器内核可以定义如下:

$$ K=frac{1}{25} left[ egin{matrix} 1 & 1 & 1 & 1 & 1 1 & 1 & 1 & 1 & 1 1 & 1 & 1 & 1 & 1 1 & 1 & 1 & 1 & 1 1 & 1 & 1 & 1 & 1 end{matrix} ight] $$

将此内核保持在像素上方,添加该内核下方的所有25个像素,取其平均值并用新的平均值替换中心像素.
代码

import cv2
import numpy as np
import matplotlib.pylab  as plt

img = cv2.imread("img.jpg")
kernel = np.ones((5,5),np.float32)/25
dst = cv2.filter2D(img,-1,kernel)

plt.subplot(121),plt.imshow(img),plt.title("Original")
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(dst),plt.title("Averaging")
plt.xticks([]), plt.yticks([])
plt.show()

2图像模糊(图像平滑)

通过将图像与低通滤波器内核卷积来实现图像模糊.它有助于消除噪音.它实际上从图像中去除了高频内容(例如:噪声,边缘).因此在此操作中边缘会模糊一点.(有模糊的技术,也不会模糊边缘).OpenCV主要提供四种模糊技术.

1平均法

过将图像与标准化的盒式过滤器进行卷积来完成的。它只取内核区域下所有像素的平均值并替换中心元素。这是由函数cv2.blur()cv2.boxFilter()完成的,3x3标准化的盒式过滤器如下所示:

$$ K=frac{1}{9} left[ egin{matrix} 1 & 1 & 1 1 & 1 & 1 1 & 1 & 1 end{matrix} ight] $$

NOTE:
如果不想使用规范化的框过滤器,请使用cv2.boxFilter().将参数normalize = False传递给函数.

应用

使用5x5大小的内核进行图像平滑:
代码

import cv2
import numpy as np
import matplotlib.pylab  as plt

img = cv2.imread("img.jpg")
blur = cv2.blur(img,(5,5))

plt.subplot(121),plt.imshow(img),plt.title("Original")
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title("Blurred")
plt.xticks([]), plt.yticks([])
plt.show()

2高斯模糊

cv2.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]])

应该指定内核的宽度和高度,它应该是正数和奇数.

还应该分别指定X和Y方向的标准偏差sigmaX和sigmaY.如果仅指定了sigmaX,则sigmaY与sigmaX相同.如果两者都为零,则根据内核大小计算它们.

高斯模糊在从图像中去除高斯噪声方面非常有效

可以使用函数cv2.getGaussianKernel()创建高斯内核

代码

import cv2
import numpy as np
import matplotlib.pylab  as plt

img = cv2.imread("img.jpg")
blur = cv2.GaussianBlur(img,(5,5),0)

plt.subplot(121),plt.imshow(img),plt.title("Original")
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title("Blurred")
plt.xticks([]), plt.yticks([])
plt.show()

3 中值模糊

cv2.medianBlur(src, ksize[, dst]):内核区域下所有像素的中值,并用该中值替换中心元素.对图像中的椒盐噪声非常有效.其内核大小应为正整数

代码

import cv2
import numpy as np
import matplotlib.pylab  as plt

img = cv2.imread("img7.png")
blur = cv2.medianBlur(img,5)

plt.subplot(121),plt.imshow(img),plt.title("Original")
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title("Blurred")
plt.xticks([]), plt.yticks([])
plt.show()

4 双边滤波

cv2.bilateralFilter()在降低噪音方面非常有效,同时保持边缘清晰,但与其他过滤器相比,操作速度较慢.

NOTE:

高斯滤波器采用像素周围的邻域并找到其高斯加权平均值. 该高斯滤波器仅是空间的函数,即在滤波时考虑附近的像素, 没有考虑像素是否具有几乎相同的强度,不考虑像素是否是边缘像素,所以它也模糊了边缘.

双边滤波器在空间中也采用高斯滤波器,但是还有一个高斯滤波器是像素差的函数.空间的高斯函数确保仅考虑附近的像素用于模糊,而强度差的高斯函数确保仅考虑具有与中心像素相似的强度的像素用于模糊,因此它保留了边缘,因为边缘处的像素将具有较大的强度变化.

代码

import cv2
import numpy as np
import matplotlib.pylab  as plt

img = cv2.imread("img.jpg")
blur = cv2.bilateralFilter(img,9,75,75)

plt.subplot(121),plt.imshow(img),plt.title("Original")
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title("Blurred")
plt.xticks([]), plt.yticks([])
plt.show()

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41989.html

相关文章

  • 图像增强——空间域滤波

    摘要:能够有效去除椒盐噪声黑白点叠加在图像上去除噪声的同时,比较好地保留边缘空间域锐化滤波器高通滤波器锐化处理的主要目的是为了突出图像的边缘信息,增强图像的轮廓特征,以便于人眼的观察和机器的识别。 ...

    Cheriselalala 评论0 收藏1
  • 学习笔记-使用Python对含有椒盐噪声的图像进行均值滤波高斯滤波中值滤波

    摘要:我是分界线第一个参量为输入的图片,第二个是噪声占图片像素的百分比计算椒盐噪声点数量参数参数必须是整数函数返回值是参数和参数之间的任意整数生成随机位置浅度复制,复制的数不会随着被复制数的嵌套序列的元素的改变而改变从到图像长度之间的一个随机 import cv2 as cvfrom pylab ...

    Clect 评论0 收藏0
  • 2021-09-23 opencv学习笔记(图像变换,二值化,滤波器介绍及python实现)

    摘要:但是考虑一个双峰图像简单来说,双峰图像是一个直方图有两个峰值的图像。对于非双峰图像,二值化将不准确。在第三种情况下,我使用高斯核过滤图像以去除噪声,然后应用阈值。 ...

    CloudDeveloper 评论0 收藏0
  • Programming Computer Vision with Python (学习笔记五)

    摘要:下面是二维空间的高斯分布函数公式这个公式被称作高斯核。高斯模糊使用高斯平均算子来实现的图像模糊叫高斯模糊,也叫高斯平滑被认为是一种最优的图像平滑处理。 SciPy库 SciPy库,与之前我们使用的NumPy和Matplotlib,都是scipy.org提供的用于科学计算方面的核心库。相对NumPy,SciPy库提供了面向更高层应用的算法和函数(其实也是基于NumPy实现的),并以子模块...

    Rocko 评论0 收藏0
  • Programming Computer Vision with Python (学习笔记六)

    摘要:由所有边缘增强像素组成的新图像,称为边缘增强图像。交叉算子上述使用差分方法得出亮度变化梯度其实就是一阶微分的近似值。 边缘检测(edge detection)是最重要的图像处理技术之一,图像边缘检测大幅度地减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性,为后续图像理解方法提供了基础。 边缘检测方法 从视觉上看,图像中的边缘处亮度较周围强,比如对一垂直方向的边缘,...

    MageekChiu 评论0 收藏0

发表评论

0条评论

Little_XM

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<