3.4 Python图像的频域图像增强-带通、带阻滤波器
文章目录
3.4 Python图像的频域图像增强-带通、带阻滤波器1 算法原理2 代码3 效果1 算法原理
带阻滤波器减弱(或减少)一定频率范围信号, 但容许频率低于於下限截止频率和高于上限截止频率的信号的通过。其中
其中H(u,v)和D(u,v)为:
消除以为 中心,D0为半径的区域内所有频率。
带通滤波器与带阻滤波器互补。带通滤波器容许一定频率范围信号通过, 但减弱(或减少)频率低于於下限截止频率和高于上限截止频率的信号的通过。如图:
H(u,v)公式为:
2 代码
运行代码说明
1.要改变代码中的图片地址(地址不能有中文)
更改
put(path)
函数中的路径put(r'../image/image1.jpg')
2.注意最后的
plt.savefig('1.new.jpg')
是保存plt图像,如果不使用可以注释掉
import mathimport osimport numpy as npimport cv2import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falsedef bandpass_filter(image, radius, w, n=1):"""带通滤波函数:param image: 输入图像:param radius: 带中心到频率平面原点的距离:param w: 带宽:param n: 阶数:return: 滤波结果"""# 对图像进行傅里叶变换,fft是一个三维数组,fft[:, :, 0]为实数部分,fft[:, :, 1]为虚数部分fft = cv2.dft(np.float32(image), flags=cv2.DFT_COMPLEX_OUTPUT)# 对fft进行中心化,生成的dshift仍然是一个三维数组dshift = np.fft.fftshift(fft)# 得到中心像素rows, cols = image.shape[:2]mid_row, mid_col = int(rows / 2), int(cols / 2)# 构建掩模,256位,两个通道mask = np.zeros((rows, cols, 2), np.float32)for i in range(0, rows):for j in range(0, cols):# 计算(i, j)到中心点的距离d = math.sqrt(pow(i - mid_row, 2) + pow(j - mid_col, 2))if radius - w / 2 < d < radius + w / 2:mask[i, j, 0] = mask[i, j, 1] = 1else:mask[i, j, 0] = mask[i, j, 1] = 0# 给傅里叶变换结果乘掩模fft_filtering = dshift * np.float32(mask)# 傅里叶逆变换ishift = np.fft.ifftshift(fft_filtering)image_filtering = cv2.idft(ishift)image_filtering = cv2.magnitude(image_filtering[:, :, 0], image_filtering[:, :, 1])# 对逆变换结果进行归一化(一般对图像处理的最后一步都要进行归一化,特殊情况除外)cv2.normalize(image_filtering, image_filtering, 0, 1, cv2.NORM_MINMAX)return image_filteringdef bandstop_filter(image, radius, w, n=1):"""带阻滤波函数:param image: 输入图像:param radius: 带中心到频率平面原点的距离:param w: 带宽:param n: 阶数:return: 滤波结果"""# 对图像进行傅里叶变换,fft是一个三维数组,fft[:, :, 0]为实数部分,fft[:, :, 1]为虚数部分fft = cv2.dft(np.float32(image), flags=cv2.DFT_COMPLEX_OUTPUT)# 对fft进行中心化,生成的dshift仍然是一个三维数组dshift = np.fft.fftshift(fft)# 得到中心像素rows, cols = image.shape[:2]mid_row, mid_col = int(rows / 2), int(cols / 2)# 构建掩模,256位,两个通道mask = np.zeros((rows, cols, 2), np.float32)for i in range(0, rows):for j in range(0, cols):# 计算(i, j)到中心点的距离d = math.sqrt(pow(i - mid_row, 2) + pow(j - mid_col, 2))if radius - w / 2 < d < radius + w / 2:mask[i, j, 0] = mask[i, j, 1] = 0else:mask[i, j, 0] = mask[i, j, 1] = 1# 给傅里叶变换结果乘掩模fft_filtering = dshift * np.float32(mask)# 傅里叶逆变换ishift = np.fft.ifftshift(fft_filtering)image_filtering = cv2.idft(ishift)image_filtering = cv2.magnitude(image_filtering[:, :, 0], image_filtering[:, :, 1])# 对逆变换结果进行归一化(一般对图像处理的最后一步都要进行归一化,特殊情况除外)cv2.normalize(image_filtering, image_filtering, 0, 1, cv2.NORM_MINMAX)return image_filteringdef put(path):image = cv2.imread(path, 1)# image = cv2.imread(os.path.join(base, path), 1)image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)image_bandpass_filtering5 = bandpass_filter(image, 30, 56, 1)image_bandstop_filtering5 = bandstop_filter(image, 30, 35, 1)plt.subplot(131)plt.axis('off')plt.title('原始图像')plt.imshow(image, cmap='gray')plt.subplot(132),plt.axis('off')plt.title('带通图像')plt.imshow(image_bandpass_filtering5, 'gray')plt.subplot(133)plt.axis('off')plt.imshow(image_bandstop_filtering5, 'gray')plt.title('带阻图像')# plt.savefig('4.new.jpg')plt.show()# 图像处理函数,要传入路径put(r'../image/image3.jpg')