滤波一词借助于频域处理。低通滤波器的最终效果是模糊(平滑)图像,也可以使用空间滤波器(也成为空格键掩模、核、模板和窗口)直接作用于图像本身而完成类似的平滑。
- 空间滤波机理
空间滤波器由一个领域(典型的是一个较小矩形),对该领域包围的图像像素执行的预定义操作组成。滤波产生一个新像素,该像素的坐标等于领域中心的坐标,像素的值是滤波操作的结果。滤波器的中心访问输入图像中的每个像素,就生成了处理后的图像。如果在图像上执行的是线性操作,则该滤波器称为线性空间滤波器。否则为非线性空间滤波器。
import numpy as np
import cv2
import matplotlib.pyplot as plt
def MyCopyMakrBorder(str, kernelSize):
size = kernelSize // 2
dir = np.zeros((str.shape[0] + size * 2, str.shape[1] + size * 2))
dir[size:dir.shape[0]-size, size:dir.shape[1]-size] = str
return dir
def MeanKernel(size=3):
return np.ones((size, size)) / (size * size)
#kernel size为N*N
def MenaFilter(path, kernel):
pic = cv2.imread(path, 0)
n = kernel.shape[0]
#m = kernel.shape[1]
border = MyCopyMakrBorder(pic, n)
#kernel = MyCopyMakrBorder(3)
out_pic = pic
for i in range(pic.shape[0]):
for j in range(pic.shape[1]):
temp = border[i:i+n, j:j+n]
out_pic[i, j] = np.sum(temp * kernel)
return out_pic
def opencv_use(path):
pic = cv2.imread(path, 0)
out_pic = cv2.blur(pic, (3, 3))
return out_pic
show = MenaFilter('picture/histogram.png', MeanKernel(3))
plt.subplot(2, 1, 1)
plt.imshow(show, cmap = "gray")
opencv_show = opencv_use('picture/histogram.png')
plt.subplot(2, 1, 2)
plt.imshow(opencv_show, cmap = "gray")
plt.show()
- 空间相关与卷积
相关是滤波模板移过图像并计算每个位置乘积之和的处理。
卷积的机理类似,但滤波器首先需要旋转180°。
3.空间平滑滤波器
平滑滤波器用于模糊处理和降低噪声。模糊处理经常用于预处理任务,例如在目标提取之前去除图像中的一些琐碎细节,以及桥接直线或曲线的缝隙。通过线性滤波和非线性滤波模糊处理,可以降低噪声。
均值滤波、加权均值滤波、中值滤波
4.锐化空间滤波器
锐化处理的主要目的是突出灰度的过度部分。均值处理与里分类似,锐化处理可由空间微分来实现。基本上,微分算子的相应强度与图像在用算子操作的这一点的突变程度成正比,这样,图像微分增强边缘和其他突变(如噪声),而削弱灰度变化幻魔的区域。
一阶微分:
二阶微分:
二阶微分-拉普拉斯算子:
拉普拉斯增强方法:
5. 非锐化掩码和高提升滤波
在印刷和出版界使用多年的图像锐化处理过程是从原图中减去一幅非锐化(平滑过的)版本。步骤如下:
①模糊图像
②从原图像中减去模糊图像(产生的差值图像称为模板)
③将模板加到原图像上
k>=0,当k>1时,该处理为高提升滤波。k<1时不强调非锐化模板的贡献。
6.使用一阶微分对图像锐化–梯度
图像处理中的一阶微分是用梯度来实现。
在实际应用中使用绝对值近似平方和平方根跟适合计算。