建設(shè)銀行境外購物網(wǎng)站2022年最火的新聞?wù)?/h1>
使用高通濾波器實(shí)現(xiàn)同態(tài)濾波
- 同態(tài)濾波基礎(chǔ)
- 實(shí)現(xiàn)同態(tài)濾波
- 相關(guān)鏈接
同態(tài)濾波基礎(chǔ)
同態(tài)濾波是一種去除圖像中乘性噪聲的技術(shù),常用于校正圖像中的不均勻照明。根據(jù)圖像形成的光照反射模型,圖像 f(x,y)f(x,y)f(x,y) 可以由以下兩個(gè)分量表征:
- 入射到場景中的光源量
- 場景中對象反射的光量
根據(jù)光照反射模型模型,圖像中像素的強(qiáng)度(即對象上的點(diǎn)反射的光)是場景照明和場景中對象反射的結(jié)果。傅立葉變換在加法下是線性關(guān)聯(lián)的,但在乘法下并不關(guān)聯(lián)。因此,傅立葉方法僅在將噪聲作為原始圖像的附加項(xiàng)建模時(shí),才適合從圖像中去除噪聲。
但是,如果圖像的缺陷(例如,不均勻的照明)必須建模為乘法而非加法,則直接應(yīng)用傅立葉變換并不合適。此時(shí),我們便需要使用同態(tài)濾波:首先,通過使用對數(shù)將乘法轉(zhuǎn)換為加法;然后,使用對數(shù)域中的 HPF
來刪除低頻照明分量,同時(shí)保留高頻反射率分量。
同態(tài)濾波的基本步驟如下,輸入圖像為 f(x,y)f(x,y)f(x,y),濾波器的輸出為 g(x,y)g(x,y)g(x,y):
實(shí)現(xiàn)同態(tài)濾波
在本節(jié)中,我們將學(xué)習(xí)如何使用 Butterworth HPF
實(shí)現(xiàn)同態(tài)濾波器。
(1) 首先,導(dǎo)入所需 Python
庫,并定義相關(guān)函數(shù):
import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage.color import rgb2gray
from skimage.filters import sobel, threshold_otsudef dft2(im):freq = cv2.dft(np.float32(im), flags = cv2.DFT_COMPLEX_OUTPUT)freq_shift = np.fft.fftshift(freq)mag, phase = freq_shift[:,:,0], freq_shift[:,:,1]return mag + 1j*phasedef idft2(freq):real, imag = freq.real, freq.imagback = cv2.merge([real, imag])back_ishift = np.fft.ifftshift(back)im = cv2.idft(back_ishift, flags=cv2.DFT_SCALE)im = cv2.magnitude(im[:,:,0], im[:,:,1])return imdef butterworth(sz, D0, n=1):h, w = szu, v = np.meshgrid(range(-w//2,w//2), range(-h//2,h//2)) #, sparse=True)return 1 / (1 + (D0/(0.01+np.sqrt(u**2 + v**2)))**(2*n))
(2) 定義同態(tài)濾波函數(shù),頻域 H(u,v)H(u,v)H(u,v) 中的同態(tài)濾波器如下所示:
H(u,v)=(γH?γL)(11+(D0D(u,v))2n)+γLH(u,v)=(\gamma_H-\gamma_L)(\frac 1 {1+(\frac {D_0} {D(u,v)})^{2n}})+\gamma_L H(u,v)=(γH??γL?)(1+(D(u,v)D0??)2n1?)+γL?
為了避免對數(shù)域中錯(cuò)誤操作,在輸入中添加常數(shù) 1
,以確保對數(shù)的輸入始終 ≥1
,最后,從輸出中減去 1
:
def homomorphic_filter(im, D0, g_l=0, g_h=1, n=1):im_log = np.log(im.astype(np.float)+1)im_fft = dft2(im_log)H = (g_h - g_l) * butterworth(im.shape, D0, n) + g_l#H = np.fft.ifftshift(H)im_fft_filt = H*im_fft#im_fft_filt = np.fft.ifftshift(im_fft_filt)im_filt = idft2(im_fft_filt)im = np.exp(im_filt.real)-1im = np.uint8(255*im/im.max())return im
(3) 讀取輸入圖像(帶有不均勻照明),將其轉(zhuǎn)換為灰度圖像(確保像素值在 0-255
范圍內(nèi)),然后通過調(diào)函數(shù) homomorphic_filter()
應(yīng)用同態(tài)濾波器。
其中,Butterworth
濾波器 n=2
階的截止頻率為 30
,γL\gamma_LγL? 和 γH\gamma_HγH? 參數(shù)分別設(shè)置為 0.3
和 1
:
image = rgb2gray(plt.imread('1.png'))
image_filtered = homomorphic_filter(image, D0=30, n=2, g_l=0.3, g_h=1)
(4) 使用 sobel
濾波器從原始圖像中提取邊緣,使用 OTSU
最佳閾值創(chuàng)建二值圖像如下:
image_edges = sobel(image)
image_edges = image_edges <= threshold_otsu(image_edges)
(5) 使用 sobel
濾波器通過從同態(tài)濾波器轉(zhuǎn)換的圖像中提取邊緣:
image_filtered_edges = sobel(image_filtered)
image_filtered_edges = image_filtered_edges <= threshold_otsu(image_filtered_edges)
(6) 最后,繪制輸入圖像和使用同態(tài)濾波器獲得的輸出圖像,以及提取的邊緣:
plt.figure(figsize=(21,17))
plt.gray()
plt.subplots_adjust(0,0,1,0.95,0.01,0.05)
plt.subplot(221), plt.imshow(image), plt.axis('off'), plt.title('original image', size=10)
plt.subplot(222), plt.imshow(image_filtered), plt.axis('off'), plt.title('filtered image', size=10)
plt.subplot(223), plt.imshow(image_edges), plt.axis('off'), plt.title('original image edges', size=10)
plt.subplot(224), plt.imshow(image_filtered_edges), plt.axis('off'), plt.title('filtered image edges', size=10)
plt.show()
輸出結(jié)果如下所示:
從上圖中可以看出,所獲得的輸出圖像中的光照更加均勻,從而可以看清楚原始圖像中黑暗區(qū)域的細(xì)節(jié)/邊緣。
相關(guān)鏈接
Python圖像處理【1】圖像與視頻處理基礎(chǔ)
Python圖像處理【2】探索Python圖像處理庫
Python圖像處理【3】Python圖像處理庫應(yīng)用
Python圖像處理【4】圖像線性變換
Python圖像處理【5】圖像扭曲/逆扭曲
Python圖像處理【7】采樣、卷積與離散傅里葉變換