1.平均滤波
import cv2
import matplotlib.pyplot as plt
import numpy as np
# 最简单的平均卷积操作,把周边的元素求平均值得到的平均值作为元素值
img = cv2.imread('jiao.jpg')
blur = cv2.blur(img, (3, 3))
plt.figure(figsize=(25, 12))
plt.subplot(2, 3, 1), plt.imshow(img[:, :, ::-1],aspect='auto'), plt.title('original')
plt.subplot(2, 3, 2), plt.imshow(blur[:, :, ::-1],aspect='auto'), plt.title('blur')
可以看到椒盐点变模糊了,但是依旧存在,毕竟计算的是平均值
2.方框滤波
import cv2
import matplotlib.pyplot as plt
import numpy as np
# 方框滤波和均值滤波很像,只不过均值滤波是求了这九个元素的平均值,方框则是不求平均值 ( normalize=False的时候 )
# 如果相加超过了255,就按照255来计算
# 若normalize=True 开启了归一化,也就是如果这个值是True就和平均滤波一样了
img = cv2.imread('jiao.jpg')
box = cv2.boxFilter(img, -1, (3, 3), normalize=False)
plt.figure(figsize=(25, 12))
plt.subplot(2, 3, 1), plt.imshow(img[:, :, ::-1]), plt.title('original')
plt.subplot(2, 3, 2), plt.imshow(box[:, :, ::-1]), plt.title('blur')
这里如果normalize = False 那么效果如下
可以看到他的效果太差了,如果我们改为 True那么就是平均滤波了
3.高斯滤波
import cv2
import matplotlib.pyplot as plt
import numpy as np
# 高斯滤波的分布曲线就是一个高斯分布, 越靠近目标点, 权值越大
img = cv2.imread('jiao.jpg')
gauss = cv2.GaussianBlur(img, (5, 5), 1)
plt.figure(figsize=(25, 12))
plt.subplot(2, 3, 1), plt.imshow(img[:, :, ::-1]), plt.title('original')
plt.subplot(2, 3, 2), plt.imshow(gauss[:, :, ::-1]), plt.title('gauss')
高斯滤波也是做了一定的权重来计算的,所以椒盐斑点依旧在
4. 中值滤波
import cv2
import matplotlib.pyplot as plt
import numpy as np
# 中值滤波十分好理解,就是求中间值
img = cv2.imread('jiao.jpg')
median = cv2.medianBlur(img, 5)
plt.figure(figsize=(25, 12))
plt.subplot(2, 3, 1), plt.imshow(img[:, :, ::-1]), plt.title('original')
plt.subplot(2, 3, 2), plt.imshow(median[:, :, ::-1]), plt.title('median')
可以看到中值滤波的效果最好,毕竟他是取得中间值,对于斑点位置的数据都会作为极值而抛弃
5.平均, 高斯, 中值三种滤波效果对比
import cv2
import matplotlib.pyplot as plt
import numpy as np
res = np.hstack((img, blur, gauss, median)) # 该函数可以把多个图像进行合并
plt.figure(figsize=(70, 110))
plt.subplot(2, 3, 2), plt.imshow(res[:, :, ::-1]), plt.title('result')