您的位置:首页 > 编程语言 > Python开发

opencv-python(10):图像平滑

2017-10-14 16:32 453 查看
学习使用不同的低通滤波器对图像进行模糊

使用自定义的滤波器对图像进行卷积

1、2D卷积

与信号一样,我们可以对2D图像实施低通滤波(LPF),高通滤波(HPF)等。LPF帮助我们去除噪音,模糊图像。HPF帮助我们找到图像的边缘。

OpenCV提供cv2.filter2D()对图像进行卷积操作。下面我们将对一副图像使用平均滤波器。下面是一个5x5的平均滤波器。



操作如下:将核放在图像的一个像素A上,求与核对应的图像上25(5x5)个像素的和,然后取平均值,用这个平均数代替像素A的值。重复以上操作直到将图像的每个像素值都更新一遍。代码如下:

import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('C:\\Users\\WLX\\Desktop\\9.jpg',cv2.IMREAD_COLOR)
kernel=np.ones((5,5),np.float32)/25
dst=cv2.filter2D(img,-1,kernel)
plt.subplot(121),plt.imshow(img),plt.title('Original Image')
plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(dst),plt.title('Average')
plt.xticks([]),plt.yticks([])
plt.show()
结果:



图像模糊(图像平滑)

使用低通滤波器可以达到图像模糊的目的。这对去除噪音有很大帮助。事实上就是去除图像中的高频部分。所以边界也会被模糊一些。opencv提高了四种模糊技术。

2、平均

这是由一个归一化卷积框完成的。他只是用卷积框覆盖区域所有像素的平均值来代替中心元素。可以使用cv2.blur()和cv2.boxFilter()来完成。

代码:

import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('C:\\Users\\WLX\\Desktop\\9.jpg',cv2.IMREAD_COLOR)
blur=cv2.blur(img,(5,5))
blur2=cv2.boxFilter(img,-1,(5,5))
plt.subplot(131),plt.imshow(img),plt.title('Original Image')
plt.xticks([]),plt.yticks([])
plt.subplot(132),plt.imshow(blur),plt.title('Blur')
plt.xticks([]),plt.yticks([])
plt.subplot(133),plt.imshow(blur2),plt.title('blur2')
plt.xticks([]),plt.yticks([])
plt.show()
结果:



3、高斯模糊

现在把卷积核换成高斯核。实现的函数是cv2.GaussianBlur()。我们需要知道高斯核的宽和高(必须是奇数)。以及高斯函数沿X,Y方向的标准差。如果我们只制定了X方向的标准差,Y方向也会取同样的值。如果两个标准差都是0,那函数会根据核函数的大小自己计算。高斯滤波可以有效的从图像中去除高斯噪音。

代码:

import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('C:\\Users\\WLX\\Desktop\\9.jpg',cv2.IMREAD_COLOR)
blur=cv2.GaussianBlur(img,(5,5),0)
plt.subplot(121),plt.imshow(img),plt.title('Original Image')
plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title('Gauss')
plt.xticks([]),plt.yticks([])
plt.show()
结果:



4、中值模糊

顾名思义就是用与卷积框对应像素的中值来代替中心像素的值。这个滤波器经常用来去除椒盐噪声。前面的滤波器都是用计算得到的新值来取代中心像素的值,而中值滤波用中心像素周围的值来取代他,能有效的去除噪声。卷积核的大小应该是一个奇数。

代码:

import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('C:\\Users\\WLX\\Desktop\\18.jpg',cv2.IMREAD_COLOR)
medianblur=cv2.medianBlur(img,5)
plt.subplot(121),plt.imshow(img),plt.title('Original Image')
plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(medianblur),plt.title('median blur')
plt.xticks([]),plt.yticks([])
plt.show()
结果:



5、双边滤波

双边滤波cv2.bilaterFilter()能保持边界清晰的情况下有效的去除噪音。但这种操作相对于其他滤波器会比较慢。

代码:

import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('C:\\Users\\WLX\\Desktop\\45.jpg',cv2.IMREAD_COLOR)
blur=cv2.bilateralFilter(img,9,75,75)
#9是邻域直径,第一个75是空间高斯函数标准差,第二个75是灰度值相似性高斯函数标准韩
plt.subplot(121),plt.imshow(img),plt.title('Original Image')
plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title('双边 blur')
plt.xticks([]),plt.yticks([])
plt.show()
结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv python