数字图像处理与Python实现-图像降噪-平滑滤波-模板操作

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/wujuxKkoolerter/article/details/102733001

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)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wujuxKkoolerter/article/details/102733001