首先加载一张照片
import cv2 # BGR
import matplotlib.pyplot as plt
import numpy as np
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
img = cv2.imread('lena.jpg')
cv_show('lena',img)
显然可知,图像上存在大量的椒盐噪声
均值滤波
# 均值滤波
# 简单平均卷积操作
blur = cv2.blur(img,(3,3))
cv_show('lena',blur)
在这里插入代码片
改善并不好,相反图像变模糊了
高斯滤波
# 高斯滤波
# 高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的
gaussian = cv2.GaussianBlur(img,(5,5),1)
cv_show('lena',gaussian)
稍稍改善一点
中值滤波
# 中值滤波
# 相当于取中值
median = cv2.medianBlur(img,5)
cv_show('lena',median)
# 可以发现,中值滤波效果最好
可以看出效果最好
现在我想比较三幅图,有一种方法比较好,如下:
# 这里给大家说一个比较好的方法,一起显示以上,进行效果对比
ret = np.hstack((blur,gaussian,median))
cv_show('ret',ret)
plt.subplot(131),plt.imshow(blur),plt.title('blur')
plt.subplot(132),plt.imshow(gaussian),plt.title('gaussian')
plt.subplot(133),plt.imshow(median),plt.title('median')
但是有一个很怪的现象,图像色彩变了,那是因为图像先matplit中是BGR,而不是我们常说的RGB,因此会出现上面的情况,于是可以修改一下,编写一个小函数进行改变。
def BGR_RGB(img):
R,G,B = cv2.split(img)
RGB = cv2.merge((B,G,R))
return RGB
# img = BGR_RGB(blur)
# ret = np.hstack((blur,gaussian,median))
# img = BGR_RGB(ret)
# cv_show('ret',img)
img = BGR_RGB(blur)
plt.imshow(img)
plt.show()
# name = [blur,gaussian,median]
title = ["blur","gaussian","median"]
for i in range(1,4):
img = BGR_RGB(name[i-1])
print(i)
plt.subplot(1,3,i),plt.imshow(img),plt.title(title[i-1])
(完)