赞
踩
特殊高通滤波器(高频增强滤波器、高频提升滤波器)
高频滤波将低频分量滤掉,导致增强图像中的边缘得到加强,但平坦区域灰度很暗,接近黑色。
高频增强滤波器对频域里的高通滤波器的转移函数加一个常数,将一些低频分量加回去,保持光滑区域的灰度,又改善边缘区域的对比度。高频增强滤波器对频域里的高通滤波器的转移函数加一个常数,将一些低频分量加回去,保持光滑区域的灰度,又改善边缘区域的对比度。高频增强滤波器的传递函数如下:
其中 a>=0,b>a,Hhp(u,v)表示高通滤波器,本算法 Hhp(u,v)选用巴特沃斯高通滤波器:
这个高频增强滤波器在保留高频分量的同时,也加入了背景的低频成分。这样就可以做到在原始图像的基础上叠加一些高频成分,既保留了原图的灰度层次,又锐化了边缘。本次算法实现,a 设置为 0.5,b 设置为 0.8。
数字图像处理中图像提升增强算法中常用非锐化掩蔽。
对于某些图像锐化过程中,经典的 sobel 算子和 canny 算子等会提取到一些多余的边缘,高提升滤波可以增强图像边缘,通过增大局部灰度差异来增强对比度而,不影响图像整体对比度
非锐化掩蔽:
顾名思义即减去平滑后的图像,其原理流程图如下:
1平滑原图像:f->s;
2从原图像中减去模糊图像,产生的差值图像称为模板:m=f-s;
3将模板加到原图像中:
运行代码说明
1.要改变代码中的图片地址(地址不能有中文)
更改
put(path)
函数中的路径put(r'../image/image1.jpg')
2.注意最后的
plt.savefig('1.new.jpg')
是保存plt图像,如果不使用可以注释掉
import os import numpy as np import cv2 import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False #高频增强滤波器 (滤波器选择巴特沃斯高通滤波器) def Enhance_PassFilter(image, d, n,s1): f = np.fft.fft2(image) fshift = np.fft.fftshift(f) def make_transform_matrix(d): transform_matrix = np.zeros(image.shape) center_point = tuple(map(lambda x: (x - 1) / 2, s1.shape)) for i in range(transform_matrix.shape[0]): for j in range(transform_matrix.shape[1]): def cal_distance(pa, pb): from math import sqrt dis = sqrt((pa[0] - pb[0]) ** 2 + (pa[1] - pb[1]) ** 2) return dis dis = cal_distance(center_point, (i, j)) transform_matrix[i, j] = 1 / (1 + (d / dis) ** (2 * n)) return transform_matrix d_matrix = make_transform_matrix(d) d_matrix = 0.8*d_matrix+0.5 new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift * d_matrix))) return new_img # 捕获异常 class imageSizeError(Exception): def __init__(self): self.value = "图片大小错误" def __str__(self): return self.value # 矩阵减法 def decreaseArray(image1, image2): if image1.shape == image2.shape: image = image1.copy() for i in range(image1.shape[0] - 1): for j in range(image1.shape[1] - 1): image[i][j] = image1[i][j] - image2[i][j] return image else: raise imageSizeError() # 矩阵加法 def increaseArray(image1, image2): if image1.shape == image2.shape: image = image1.copy() for i in range(image1.shape[0] - 1): for j in range(image1.shape[1] - 1): image[i][j] = image1[i][j] + image2[i][j] return image else: raise imageSizeError() def put(path): img = cv2.imread(path, 1) # img = cv2.imread(os.path.join(base, path), 1) img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) f = np.fft.fft2(img) fshift = np.fft.fftshift(f) # 取绝对值后将复数变化为实数 # 取对数的目的是将数据变换到0~255 s1 = np.log(np.abs(fshift)) plt.subplot(231) plt.axis('off') plt.title('原始图像') plt.imshow(img, cmap='gray') plt.subplot(232) plt.axis('off') plt.title('高频增强滤波10') butter_100_1 = Enhance_PassFilter(img, 30, 1, s1) plt.imshow(butter_100_1, cmap='gray') # 高频提升滤波 imageAver3 = cv2.blur(img, (3, 3)) # 线性平滑滤波 unsharpMask = decreaseArray(img, imageAver3) # 非锐化掩模 imageSharp = increaseArray(img, unsharpMask) # 将模板加到原图像 plt.subplot(233) plt.axis('off') plt.title('3×3平滑滤波结果图像') plt.imshow(imageAver3, cmap='gray') plt.subplot(234) plt.axis('off') plt.title('非锐化掩模') plt.imshow(unsharpMask, cmap='gray') plt.subplot(235) plt.axis('off') plt.title('高频提升滤波结果') plt.imshow(imageSharp, cmap='gray') # plt.savefig('3.new.jpg') plt.show() # 处理函数,要传入路径 put(r'../image/image3.jpg')
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。