一、滤波器
滤波通常是指对图像中特定频率的分量进行过滤或抑制。
图像滤波是在尽可能保留图像细节特征的条件下对目标图像的噪声进行抑制,是常用的图像预处理操作。空间滤波器是由邻域和定义的操作构成的,滤波器规定了滤波时采用的邻域形状及该区域内像素值的处理方法。
滤波器也被称为 “核”、“模板”、“窗口”、“掩模”、“算子”,一般在信号处理中称为 “滤波器”,在数学领域称为 “核”。
线性滤波器就是指基于线性核的滤波,也就是卷积运算。
二、 Scipy 实现图像二维卷积
卷积运算(Convolution operation)是利用模板对图像进行邻域操作,只是把相关运算的模板旋转了 180度。
大小为 m*n 的核(模板) w 与图像 f(x,y) 的卷积运算 ( w ★ f ) ( x , y ) 的数学描述为:
- Scipy 中提供了函数 sp.convolve2d 实现二维离散卷积的计算。
三、函数
- 对于二维离散卷积的运算,Python的科学计算包Scipy提供了函数实现该功能:
convolve2d(in1, in2, mode="full", boundary="fill", fillvalue=0) → dst
- in1:进行卷积运算的图像,二维数组——只能处理单通道图像,如灰度图像
- in2:卷积操作的模板(卷积核),二维数组
- mode:卷积类型,‘full’、‘valid’、‘same’,默认值为 ‘full’
- boundary:边界扩充方式,‘fill’、‘wrap’、‘symm’,默认值为 ‘fill’
- ‘fill’:以常数(fillvalue)作为像素值进行扩充(vv | abcdefg | vv)
- ‘symm’:对称法,以图像边缘为轴进行对称填充(cba| abcdefg | gfe)
- ‘wrap’:用另一侧元素来填充这一侧的扩充边界(efg| abcdefg | ab)
- fillvalue:当 boundary=‘fill’ 时,以以常数(fillvalue)作为像素值进行扩充
四、例程
- 1.66:scipy.signal 实现图像的二维卷积
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 1.66 scipy.signal 实现图像的二维卷积
img = cv2.imread(r"e:/opencv/bgra.png", flags=0) # # flags=0 读取为灰度图像
kernel = np.array([[-3-3j,0-10j,+3-3j], [-10+0j,0+0j,+10+0j], [-3+3j,0+10j,+3+3j]]) # Gx + j*Gy
# scipy.signal 实现卷积运算
from scipy import signal
convFull = signal.convolve2d(img, kernel, boundary='symm', mode='full') # full 卷积
convValid = signal.convolve2d(img, kernel, boundary='symm', mode='valid') # valid 卷积
convSame = signal.convolve2d(img, kernel, boundary='symm', mode='same') # same 卷积
print(img.shape, convFull.shape, convValid.shape, convSame.shape) # 输出图像大小有区别
plt.figure(figsize=(9, 6))
plt.subplot(131), plt.axis('off'), plt.title('Original'), plt.axis('off')
plt.imshow(img, cmap='gray', vmin=0, vmax=255)
plt.subplot(132), plt.axis('off'), plt.title('Convolve (full)')
plt.imshow(np.absolute(convFull), cmap='gray', vmin=0, vmax=255)
plt.subplot(133), plt.axis('off'), plt.title('Convolve (same)')
plt.imshow(np.absolute(convSame), cmap='gray', vmin=0, vmax=255)
plt.tight_layout()
plt.show()
五、注意事项:
signal.convolve2d 只能对二维矩阵进行卷积操作,因此只能处理灰度图像。如果需要处理彩色图像,可以分别对每一通道进行卷积操作来实现。
signal.convolve2d 选择不同卷积类型 ‘full’、‘valid’、‘same’ 时,图像卷积效果的差别并不明显,但图像尺寸大小有区别,这与不同类型时采用不同的边界处理方式有关。
img.shape: (512, 512)
convFull.shape: (514, 514)
convValid.shape: (510, 510)
convSame.shape: (512, 512)
六、资料
youcans_的博客:
https://blog.csdn.net/youcans/article/details/121783234