3.3 Python图像的频域图像增强-特殊高通滤波器
1 算法原理
特殊高通滤波器(高频增强滤波器、高频提升滤波器)
1.1高频增强滤波器
高频滤波将低频分量滤掉,导致增强图像中的边缘得到加强,但平坦区域灰度很暗,接近黑色。
高频增强滤波器对频域里的高通滤波器的转移函数加一个常数,将一些低频分量加回去,保持光滑区域的灰度,又改善边缘区域的对比度。高频增强滤波器对频域里的高通滤波器的转移函数加一个常数,将一些低频分量加回去,保持光滑区域的灰度,又改善边缘区域的对比度。高频增强滤波器的传递函数如下:
其中 a>=0,b>a,Hhp(u,v)表示高通滤波器,本算法 Hhp(u,v)选用巴特沃斯高通滤波器:
这个高频增强滤波器在保留高频分量的同时,也加入了背景的低频成分。这样就可以做到在原始图像的基础上叠加一些高频成分,既保留了原图的灰度层次,又锐化了边缘。本次算法实现,a 设置为 0.5,b 设置为 0.8。
1.2高频提升滤波器
数字图像处理中图像提升增强算法中常用非锐化掩蔽。
对于某些图像锐化过程中,经典的 sobel 算子和 canny 算子等会提取到一些多余的边缘,高提升滤波可以增强图像边缘,通过增大局部灰度差异来增强对比度而,不影响图像整体对比度
非锐化掩蔽:
顾名思义即减去平滑后的图像,其原理流程图如下:
2 代码
运行代码说明
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.cvtColor(img, cv2.COLOR_BGR2GRAY)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
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.show()
put(r'../image/image3.jpg')
3 效果
|