版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
01-图像降噪-平滑滤波-模板操作
1 模板操作
模板操作实现一种邻域运算,即某个像素点的结果不仅和本图像的灰度有关,而且和其邻域点的值有关。模板运算在数学上其实就是卷积运算。卷积处理的过程如下:
卷积运算中的卷积核就是模板运算中的模板,卷积就是做加权求和的过程。邻域中的每个像素分别与卷积核中的每一个元素相乘,乘积求和所得结果即为中心像素的新值。卷积核中的元素称作加权系数(亦称为卷积系数),改变卷积核中的加权系数会影响到总和的数值与符号,从而影响到所求像素的新值。
2 掩模消噪法
掩模消噪法可以用于消除随机噪声,是一种常用的线性低通滤波器,也称为均值滤波器。常见的模板有:
$
H_1 = \frac{1}{10} \begin{bmatrix}
1 & 1 & 1 \
1 & 2 & 1 \
1 & 1 & 1
\end{bmatrix}
$,
$
H_2 = \frac{1}{16} \begin{bmatrix}
1 & 2 & 1 \
2 & 4 & 2 \
1 & 2 & 1
\end{bmatrix}
$,
$
H_3 = \frac{1}{8} \begin{bmatrix}
1 & 1 & 1 \
1 & 0 & 1 \
1 & 1 & 1
\end{bmatrix}
$
如果模板的作用域越大,平滑作用就越明显,图像越模糊。
Python实现的代码如下:
import numpy as np
import scipy.signal as signal
%matplotlib inline
import matplotlib.pyplot as plt
import imageio
def convolve2d(img,fil,mode = 'same'): #分别提取三个通道
if mode == 'fill':
h = fil.shape[0] // 2
w = fil.shape[1] // 2
img = np.pad(img, ((h, h), (w, w),(0, 0)), 'constant')
conv_b = _convolve2d(img[:,:,0],fil) #然后去进行卷积操作
conv_g = _convolve2d(img[:,:,1],fil)
conv_r = _convolve2d(img[:,:,2],fil)
dstack = np.dstack([conv_b,conv_g,conv_r]) #将卷积后的三个通道合并
return dstack #返回卷积后的结果
def _convolve2d(img,fil):
fil_heigh = fil.shape[0] #获取卷积核(滤波)的高度
fil_width = fil.shape[1] #获取卷积核(滤波)的宽度
conv_heigh = img.shape[0] - fil.shape[0] + 1 #确定卷积结果的大小
conv_width = img.shape[1] - fil.shape[1] + 1
conv = np.zeros((conv_heigh,conv_width),dtype = 'uint8')
for i in range(conv_heigh):
for j in range(conv_width): #逐点相乘并求和得到每一个点
conv[i][j] = wise_element_sum(img[i:i + fil_heigh,j:j + fil_width ],fil)
return conv
def wise_element_sum(img,fil):
res = (img * fil).sum()
if(res < 0):
res = 0
elif res > 255:
res = 255
return res
src = imageio.imread('../../../../resources/images/f1.jpg')
kernel = np.array([[1.0,1.0,1.0],[1.0,2.0,1.0],[1.0,1.0,1.0]]) / 10.0
result = convolve2d(src,kernel,'fill')
原图像
plt.imshow(src)
程序运行结果
plt.imshow(result)