五种常见的图像滤波方式:线性滤波(方框滤波、均值滤波、高斯滤波);非线性滤波(中值滤波、双边滤波)。
图片来源于:https://blog.csdn.net/qq_27261889/article/details/80822270侵删
#给图像加噪声
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图片
im = cv2.imread('D:\pythonb\wx020.jpg')
rows, cols, chn = im.shape #把图像的行数返回给rows,列数返回给cols
#加噪声
for i in range(5000):
x = np.random.randint(0, rows)
y = np.random.randint(0, cols)
im[x, y, :] = 0
#等待显示
cv2.imshow("noise", im)
cv2.waitKey(0)
cv2.destroyAllWindows()
均值滤波:均值滤波是指任意一点的像素值,都是周围N*M个像素值的均值。核心函数为:result = cv2.blur(原始图像,核大小);核大小是以(宽度,高度)表示的元祖形式:
高斯滤波:在图像高斯平滑中,图像中不同位置的像素与其对应核中的权重相乘,然后再求和。与均值滤波不同的是,核中的权重大小不等。
下图是核分别为 3 * 3 和 5 * 5 的高斯滤波。
图片来源于:https://blog.csdn.net/Eastmount/article/details/82216380 侵删
核心函数为:dst = cv2.GaussianBlur(src, ksize, sigmaX)
src:原始图像名称,ksize:核大小,sigmaX表示X方向方差。核大小(N, N)必须是奇数。
中值滤波:选一个含有奇数点的窗口W,将这个窗口在图像上扫描,把窗口中所含的像素点按灰度级的升或降序排列,取位于中间的灰度值来代替该点的灰度值。
中值滤波对于消除孤立点和线段的干扰十分有用, 对于一些细节较多的复杂图像,可以多次使用不同的中值滤波
核心函数为:dst = cv2.medianBlur(src, ksize)
src: 图像名称,ksize: 核大小。核必须是大于1的奇数,如3、5、7等。
python运行代码如下:
#为后面标题加入中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc",size = 14)
#把BGR模式转换成RGB模式
img = cv2.cvtColor(im,cv2.COLOR_BGR2RGB)
# 均值滤波
img_mean = cv2.blur(img, (5,5)) #核大小是以(宽度,高度)表示的元祖形式:(5,5)
# 高斯滤波
img_Guassian = cv2.GaussianBlur(img,(5,5),0)
# 中值滤波
img_median = cv2.medianBlur(img, 5)
# 双边滤波
img_bilater = cv2.bilateralFilter(img,9,75,75)
# 展示不同的图片
titles = ['原图','均值滤波', '高斯滤波', '中值滤波', '中值滤波']
'bilateral']
imgs = [img, img_mean, img_Guassian, img_median, img_bilater]
for i in range(5):
plt.subplot(2,3,i+1) #注意,这和matlab中类似,没有0,数组下标从1开始
plt.imshow(imgs[i])
plt.title(titles[i], fontproperties= font)
plt.xticks([]), plt.yticks([])
plt.show()
运行结果如下图所示:
由上图可见,中值滤波对于去除椒盐噪声的处理效果最好.
以上文章参考博客:https://blog.csdn.net/qq_27261889/article/details/80822270
(by:dxz 2020 03 12 )