1. 程式人生 > >數字影象處理筆記(八):頻域高通濾波銳化影象

數字影象處理筆記(八):頻域高通濾波銳化影象

1 - 引言

在筆記(七)中,我們通過衰減影象的傅立葉變換的高頻成分來平滑物件,因為邊緣和其他灰度的急劇變化與高頻分量有關,所以影象的銳化可在頻域通過高通濾波來實現。
一個高通濾波器是從給定的低通濾波器用下式得到:
H H P (

u , v ) = 1 H L
P
( u , v ) H_{HP}(u,v)=1-H_{LP}(u,v)
其中, H L P ( u v ) H_{LP}(u,v) 是低通濾波器的傳遞函式,也就是說之前介紹的三種低通濾波器:理想、布特沃斯、高斯低通濾波器可以通過上面的式子快速的轉變為高通濾波器。接下來,我們介紹其他的高通濾波器

2 - 頻率域的拉普拉斯運算元

拉普拉斯運算元可使用如下濾波器在頻率域中實現:
H ( u , v ) = 4 π 2 ( u 2 + v 2 ) H(u,v)=-4\pi^2(u^2+v^2)
在關於頻率矩形的中心,使用如下濾波器:
H ( u , v ) = 4 π 2 [ ( u p / 2 ) 2 + ( v Q / s ) 2 ] = 4 π 2 D 2 ( u , v ) H(u,v)=-4\pi^2[(u-p/2)^2+(v-Q/s)^2]=-4\pi^2D^2(u,v)
其中,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 - 高頻強調濾波

使用頻率域方法,模板由下式:
g m a s k ( x , y ) = f ( x , y ) f L P ( x , y ) g_mask(x,y)=f(x,y)-f_{LP}(x,y)

f L P ( x , y ) = 1 [ H L P ( u , v ) F ( u , v ) ] f_{LP}(x,y)=\Im^{-1}[H_{LP}(u,v)F(u,v)]
其中, H L P ( u , v ) H_{LP}(u,v) 是一個低通濾波器, F ( u , v ) F(u,v) 是f(x,y)的傅立葉變換。 f L P ( x , y ) f_{LP}(x,y) 是平滑後的影象,類似於f(x,y)。然後又 g ( x , y ) = f ( x , y ) + k g m a s k ( x , y ) g(x,y)=f(x,y)+k*g_{mask}(x,y)
該表示式定義了k=1時的鈍化模板和k>1時的高提升濾波器。
g ( x , y ) = 1 { [ 1 + k [ 1 H L P ( u , v ) ] ] F ( u , v ) } g(x,y)=\Im^{-1}\left \{ [1+k*[1-H_{LP}(u,v)]]F(u,v) \right \}
H H P ( u , v ) = 1 H L P ( u , v ) H_{HP}(u,v)=1-H_{LP}(u,v)
g ( x , y ) = 1 { [ 1 + k H H P ( u , v ) ] ] F ( u , v ) } g(x,y)=\Im^{-1}\left \{ [1+k*H_{HP}(u,v)]]F(u,v) \right \}
方括號中的表示式,即 1 + k H H P ( u , v ) 1+k*H_{HP}(u,v) 成為高頻強調濾波器。
高頻強調濾波器更一般的公式為
g ( x , y ) = 1 { [ k 1 + k 2 H H P ( u , v ) ] ] F ( u , v ) } g(x,y)=\Im^{-1}\left \{ [k_1+k_2*H_{HP}(u,v)]]F(u,v) \right \}

其中, k 1 0 k_1\geq 0 給出了控制距原點的偏移量, k 2 k_2\geq 控制高頻的貢獻。

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_