📜  空间过滤器——图像处理中的平均过滤器和中值过滤器

📅  最后修改于: 2022-05-13 01:54:49.827000             🧑  作者: Mango

空间过滤器——图像处理中的平均过滤器和中值过滤器

空间过滤技术直接用于图像的像素。掩码通常被认为是在大小上添加的,以便它具有特定的中心像素。该遮罩在图像上移动,使得遮罩的中心穿过所有图像像素。
在本文中,我们将涵盖以下主题 -

  • 用Python编写程序来实现空间域平均滤波器,并在不使用内置函数的情况下观察其对图像的模糊效果
  • 用Python编写一个程序来实现空间域中值滤波器,以在不使用内置函数的情况下去除椒盐噪声

理论

  • 空间域中的邻域处理:在这里,为了修改一个像素,我们还考虑了直接相邻像素的值。为此,可以考虑 3X3、5X5 或 7X7 邻域掩码。下面显示了一个 3X3 蒙版的示例。
f(x-1, y-1) f(x-1, y) f(x-1, y+1)
f(x, y-1) f(x, y) f(x, y+1)
f(x+1, y-1) f(x+1, y) f(x+1, y+1)
  • 低通滤波:也称为平滑滤波器。它从图像中去除高频内容。它也用于模糊图像。低通平均滤波器掩模如图所示。
1/9 1/9 1/9
1/9 1/9 1/9
1/9 1/9 1/9
  • 高通滤波:它消除了低频区域,同时保留或增强了高频分量。高通滤波掩模如图所示。
-1/9 -1/9 -1/9
-1/9 8/9 -1/9
-1/9 -1/9 -1/9
  • 中值滤波:也称为非线性滤波。它用于消除椒盐噪声。这里像素值被相邻像素的中值代替。

下面是实现。

输入图像:

平均滤波器:

Python3
# Low Pass SPatial Domain Filtering
# to observe the blurring effect
 
 
import cv2
import numpy as np
  
     
# Read the image
img = cv2.imread('sample.png', 0)
 
# Obtain number of rows and columns
# of the image
m, n = img.shape
  
# Develop Averaging filter(3, 3) mask
mask = np.ones([3, 3], dtype = int)
mask = mask / 9
  
# Convolve the 3X3 mask over the image
img_new = np.zeros([m, n])
 
for i in range(1, m-1):
    for j in range(1, n-1):
        temp = img[i-1, j-1]*mask[0, 0]+img[i-1, j]*mask[0, 1]+img[i-1, j + 1]*mask[0, 2]+img[i, j-1]*mask[1, 0]+ img[i, j]*mask[1, 1]+img[i, j + 1]*mask[1, 2]+img[i + 1, j-1]*mask[2, 0]+img[i + 1, j]*mask[2, 1]+img[i + 1, j + 1]*mask[2, 2]
        
        img_new[i, j]= temp
         
img_new = img_new.astype(np.uint8)
cv2.imwrite('blurred.tif', img_new)


Python3
# Median Spatial Domain Filtering
 
 
import cv2
import numpy as np
 
 
# Read the image
img_noisy1 = cv2.imread('sample.png', 0)
 
# Obtain the number of rows and columns
# of the image
m, n = img_noisy1.shape
  
# Traverse the image. For every 3X3 area,
# find the median of the pixels and
# replace the center pixel by the median
img_new1 = np.zeros([m, n])
 
for i in range(1, m-1):
    for j in range(1, n-1):
        temp = [img_noisy1[i-1, j-1],
               img_noisy1[i-1, j],
               img_noisy1[i-1, j + 1],
               img_noisy1[i, j-1],
               img_noisy1[i, j],
               img_noisy1[i, j + 1],
               img_noisy1[i + 1, j-1],
               img_noisy1[i + 1, j],
               img_noisy1[i + 1, j + 1]]
         
        temp = sorted(temp)
        img_new1[i, j]= temp[4]
 
img_new1 = img_new1.astype(np.uint8)
cv2.imwrite('new_median_filtered.png', img_new1)


输出:

平均滤波图像处理

在上面的示例中,可以观察到过滤后的图像略微模糊。如果我们增加平均掩码的大小,可以获得更多的模糊。

中值滤波:

Python3

# Median Spatial Domain Filtering
 
 
import cv2
import numpy as np
 
 
# Read the image
img_noisy1 = cv2.imread('sample.png', 0)
 
# Obtain the number of rows and columns
# of the image
m, n = img_noisy1.shape
  
# Traverse the image. For every 3X3 area,
# find the median of the pixels and
# replace the center pixel by the median
img_new1 = np.zeros([m, n])
 
for i in range(1, m-1):
    for j in range(1, n-1):
        temp = [img_noisy1[i-1, j-1],
               img_noisy1[i-1, j],
               img_noisy1[i-1, j + 1],
               img_noisy1[i, j-1],
               img_noisy1[i, j],
               img_noisy1[i, j + 1],
               img_noisy1[i + 1, j-1],
               img_noisy1[i + 1, j],
               img_noisy1[i + 1, j + 1]]
         
        temp = sorted(temp)
        img_new1[i, j]= temp[4]
 
img_new1 = img_new1.astype(np.uint8)
cv2.imwrite('new_median_filtered.png', img_new1)

输出:

中值滤波图像处理

在上面的例子中,我们可以看到中值滤波后的图像得到了显着增强,其中几乎没有任何椒盐噪声。