數字影象處理筆記(八):頻域高通濾波銳化影象
阿新 • • 發佈:2018-12-23
1 - 引言
在筆記(七)中,我們通過衰減影象的傅立葉變換的高頻成分來平滑物件,因為邊緣和其他灰度的急劇變化與高頻分量有關,所以影象的銳化可在頻域通過高通濾波來實現。
一個高通濾波器是從給定的低通濾波器用下式得到:
其中,
是低通濾波器的傳遞函式,也就是說之前介紹的三種低通濾波器:理想、布特沃斯、高斯低通濾波器可以通過上面的式子快速的轉變為高通濾波器。接下來,我們介紹其他的高通濾波器
2 - 頻率域的拉普拉斯運算元
拉普拉斯運算元可使用如下濾波器在頻率域中實現:
在關於頻率矩形的中心,使用如下濾波器:
其中,D(u,v)是距離函式。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('images/12.jpg',0) #直接讀為灰度影象
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
s1 = np.log(np.abs(fshift))
def LaplaceFilter(image,d):
f = np.fft.fft2(image)
fshift = np.fft.fftshift(f)
def make_transform_matrix(d):
transfor_matrix = np.zeros(image.shape)
center_point = tuple(map(lambda x:(x-1)/2,s1.shape))
for i in range(transfor_matrix.shape[0]):
for j in range(transfor_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))
transfor_matrix[i,j] = -4*(np.pi**2)*(dis**2)
return transfor_matrix
d_matrix = make_transform_matrix(d)
new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_matrix)))
return new_img
img_d1 = LaplaceFilter(img,10)
plt.title('D_1 10')
plt.imshow(img_d1,cmap="gray")
plt.show()
3 - 高頻強調濾波
使用頻率域方法,模板由下式:
和
其中,
是一個低通濾波器,
是f(x,y)的傅立葉變換。
是平滑後的影象,類似於f(x,y)。然後又
該表示式定義了k=1時的鈍化模板和k>1時的高提升濾波器。
由
得
方括號中的表示式,即
成為高頻強調濾波器。
高頻強調濾波器更一般的公式為
其中, 給出了控制距原點的偏移量, 控制高頻的貢獻。
import cv2
import numpy as np
import matplotlib.pyplot as plt
#解決中文顯示問題
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
img = cv2.imread('images/test_5.jpg',0) #直接讀為灰度影象
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
s1 = np.log(np.abs(fshift))
def GaussianLowFilter(image,d,flag=None):
f = np.fft.fft2(image)
fshift = np.fft.fftshift(f)
def make_transform_matrix(d):
transfor_matrix = np.zeros(image.shape)
center_point = tuple(map(lambda x:(x-1)/2,s1.shape))
for i in range(transfor_matrix.shape[0]):
for j in range(transfor_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))
if flag == 0:
transfor_matrix[i,j] =0.5+0.75*(1-np.exp(-(dis**2)/(2*(d**2))))
else:
transfor_matrix[i, j] = 1 - np.exp(-(dis ** 2) / (2 * (d ** 2)))
return transfor_matrix
d_matrix = make_transform_matrix(d)
new_