智能圖像處理:Python和OpenCV實(shí)現(xiàn)-課件 第六章 圖像頻域?yàn)V波_第1頁
智能圖像處理:Python和OpenCV實(shí)現(xiàn)-課件 第六章 圖像頻域?yàn)V波_第2頁
智能圖像處理:Python和OpenCV實(shí)現(xiàn)-課件 第六章 圖像頻域?yàn)V波_第3頁
智能圖像處理:Python和OpenCV實(shí)現(xiàn)-課件 第六章 圖像頻域?yàn)V波_第4頁
智能圖像處理:Python和OpenCV實(shí)現(xiàn)-課件 第六章 圖像頻域?yàn)V波_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第6章圖像頻域?yàn)V波頻域?yàn)V波

頻率域是指從函數(shù)的頻率角度出發(fā)分析函數(shù),和頻率域相對的是時(shí)間域。簡單說就是如果從時(shí)間域分析信號時(shí),時(shí)間是橫坐標(biāo),振幅是縱坐標(biāo)。而在頻率域分析的時(shí)候則是頻率是橫坐標(biāo),振幅是縱坐標(biāo)。在頻率域?qū)D像進(jìn)行濾波處理的目的一方面是因?yàn)闉V波在頻率域更為直觀,它可以解釋空間域?yàn)V波的某些性質(zhì);另一方面也是因?yàn)樵陬l率域中可以指定濾波器,進(jìn)行濾波,然后在空間域使用在頻域中濾波的結(jié)果在空間域進(jìn)行逆濾波,得到在空間域中的圖像,這時(shí)的圖像就是已經(jīng)濾掉噪聲雜波的干凈圖像。

相比于圖像的空間域處理,頻域圖像處理有許多優(yōu)點(diǎn),它可以通過頻域成分的特殊性質(zhì)完成一些空間域中無法完成的任務(wù),而且頻域圖像處理更利于信號處理的解釋,對于濾波過程產(chǎn)生的某些效果有著更直觀的解釋。目錄CONTENTS傅里葉變換01低通濾波02高通濾波03帶通和帶阻濾波04同態(tài)濾波056.1傅里葉變換傅里葉變換傅里葉是18世紀(jì)法國的一位偉大的數(shù)學(xué)家,他最大的貢獻(xiàn)在于指出任何周期函數(shù)都可以表示為不同頻率的正弦或余弦之和的形式。無論函數(shù)有多復(fù)雜,只要它是周期性的,并且滿足一定的數(shù)學(xué)條件,就一定可以用這樣的正弦或余弦和的形式來表示。甚至在有些情況下,非周期函數(shù)也可以用正弦或余弦和的形式來表示。用傅里葉變換表示的函數(shù)特征可以完全通過傅里葉反變換來重建,而不會丟失任何信息。傅里葉變換的核心貢獻(xiàn)在于如何求出每種正弦波和余弦波的頻率,以及在給定每種正弦波和余弦波的比例系數(shù)時(shí)可以恢復(fù)出原始信號。6.1.1Numpy中的傅里葉變換圖像二維傅里葉變換公式如6-1所示:

圖像二維傅里葉逆變換公式如6-2所示:其中圖像長M、寬N。f(x,y)表示時(shí)域圖像,F(xiàn)(u,v)表示頻域圖像。x的范圍為[0,M-1],y的范圍為[0,N-1]。

在Numpy庫中有FFT(快速傅里葉變換)函數(shù)來實(shí)現(xiàn)傅立葉變換。二維的傅里葉變換函數(shù)語法格式為:

np.fft.fft2(src,n=None,axis=-1,norm=None)其中第一個(gè)參數(shù)是輸入圖像,即灰度圖像。第二個(gè)參數(shù)是可選的,它決定輸出數(shù)組的大小。如果它大于輸入圖像的尺寸,則在計(jì)算FFT之前用零填充輸入圖像。如果小于輸入圖像,將裁切輸入圖像。如果未傳遞任何參數(shù),則輸出數(shù)組的大小將與輸入的大小相同。其余參數(shù)選擇默認(rèn)值即可。例6.1利用python的numpy庫實(shí)現(xiàn)圖像傅里葉變換及反變換。importcv2importnumpyasnpfrommatplotlibimportpyplotasplt#讀取圖像img=cv2.imread('d:\pics\lena.jpg',0)#傅里葉變換fft_img=np.fft.fft2(img)fft_shift=np.fft.fftshift(fft_img)fft_res=np.log(np.abs(fft_shift))#傅里葉逆變換ifft_shift=np.fft.ifftshift(fft_shift)ifft_img=np.fft.ifft2(ifft_shift)ifft_img=np.abs(ifft_img)#顯示圖像plt.subplot(131),plt.imshow(img,'gray')plt.title('OriginalImage'),plt.axis('off')plt.subplot(132),plt.imshow(fft_res,'gray')plt.title('FourierImage'),plt.axis('off')plt.subplot(133),plt.imshow(ifft_img,'gray')plt.title('InverseFourierImage'),plt.axis('off')plt.show()Numpy的FFT變換與逆變換圖像6.1.2

OpenCV中的傅里葉變換OpenCV提供了離散傅里葉變換函數(shù)cv2.dft()和離散傅里葉逆變換函數(shù)cv2.idft()。傅里葉變換函數(shù)cv2.dft()語法格式為:dft=cv2.dft(np.float32(img),flags=cv2.DFT_COMPLEX_OUTPUT)其中第一個(gè)參數(shù)輸入圖像應(yīng)轉(zhuǎn)換為np.float32格式。第二個(gè)參數(shù)flags=cv2.DFT_COMPLEX_OUTPUT表示進(jìn)行傅里葉變化的方法。輸出參數(shù)dft有兩個(gè)通道,一個(gè)通道是實(shí)部,另一個(gè)通道是虛部。傅里葉逆變換函數(shù)cv2.idft()的語法格式為:

iimg=cv2.idft(dft)求傅里葉逆變換后圖像的幅值函數(shù)cv2.magnitude()語法格式為:res2=cv2.magnitude(iimg[:,:,0],iimg[:,:,1])表6-1flags標(biāo)識符列表標(biāo)識符名稱意義DFT_INVERSE用一維或二維逆變換代替默認(rèn)的正向變換。DFT_SCALE縮放比例標(biāo)識符,輸出的結(jié)果都會以I/N進(jìn)行縮放,通常會結(jié)合DFT_INVERSE一起使用。DFT_ROWS對輸入矩陣的每行進(jìn)行正向或反向的變換,此標(biāo)識符可以在處理多種矢量的時(shí)候用于減小資源開銷,這些處理常常是三維或高維變換等復(fù)雜操作。DFT_COMPLEX_OUTPUT進(jìn)行一維或二維實(shí)數(shù)數(shù)組正變換。這樣的結(jié)果雖然是復(fù)數(shù)陣列,但擁有復(fù)數(shù)的共軛對稱性,所以可以被寫成一個(gè)擁有同樣尺寸的實(shí)數(shù)陣列。DFT_REAL_OUTPUT進(jìn)行一維或二維復(fù)數(shù)數(shù)組反變換。這樣的結(jié)果通常是一個(gè)大小相同的|復(fù)矩陣。如果輸入的矩陣有復(fù)數(shù)的共軛對稱性(比如是一個(gè)帶有DFT_COMPLEX_OUTPUT標(biāo)識符的正變換結(jié)果),便會輸出實(shí)矩陣。例6.2利用OpenCV提供了函數(shù)cv2.dft()和函數(shù)cv2.idft實(shí)現(xiàn)傅里葉變換和逆變換。importcv2importnumpyasnpfrommatplotlibimportpyplotasplt#讀取圖像img=cv2.imread('d:\pics\lena.jpg',0)#傅里葉變換dft=cv2.dft(np.float32(img),flags=cv2.DFT_COMPLEX_OUTPUT)dftshift=np.fft.fftshift(dft)res1=20*np.log(cv2.magnitude(dftshift[:,:,0],dftshift[:,:,1]))#傅里葉逆變換ishift=np.fft.ifftshift(dftshift)iimg=cv2.idft(ishift)res2=cv2.magnitude(iimg[:,:,0],iimg[:,:,1])#顯示圖像plt.subplot(131),plt.imshow(img,'gray')plt.title('OriginalImage'),plt.axis('off')plt.subplot(132),plt.imshow(res1,'gray')plt.title('FourierImage'),plt.axis('off')plt.subplot(133),plt.imshow(res2,'gray')plt.title('InverseFourierImage'),plt.axis('off')plt.show()OpenCV中的FFT變換與逆變換圖像6.2低通濾波低通濾波低通濾波是將頻域圖像中的高頻部分濾除而通過低頻部分。圖像的邊緣和噪聲對應(yīng)于頻域圖像中的高頻部分,而低通濾波的作用即是減弱這部分的能量,從而達(dá)到圖像平滑去噪的目的。對一幅圖像使用低通濾波器,可以使圖像比原始圖像少尖銳的細(xì)節(jié)部分而突出平滑過渡部分,典型效果就是有效控制圖像的模糊程度。常用的低通濾波器有理想低通濾波器、巴特沃斯低通濾波器和高斯低通濾波器。6.2.1理想低通濾波器最簡單的低通濾波器是理想低通濾波器,基本思想是給定一個(gè)頻率閾值,將高于該閾值的所有部分設(shè)置為0,而低于該頻率的部分保持不變。理想低通濾波器的傳遞函數(shù)如下所示:

其中D0表示通帶的半徑,D(u,v)表示頻域點(diǎn)(u,v)到頻域圖像原點(diǎn)的距離,稱為截止頻率。

例6.3對一幅圖像進(jìn)行不同范圍頻域的理想低通濾波,觀察效果。importcv2importnumpyasnpfrommatplotlibimportpyplotasplt#第一步讀入圖像img=cv2.imread('d:\pics\lena.jpg',0)#第二步:進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換img_float=np.float32(img)#第三步:使用cv2.dft進(jìn)行傅里葉變換dft=cv2.dft(img_float,flags=cv2.DFT_COMPLEX_OUTPUT)#第四步:使用np.fft.fftshift將低頻轉(zhuǎn)移到圖像中心dft_center=np.fft.fftshift(dft)#第五步:定義掩模:生成的掩模中間為1,周圍為0#求得圖像的中心點(diǎn)位置crow,ccol=int(img.shape[0]/2),int(img.shape[1]/2)#設(shè)置掩模區(qū)域?yàn)?0*40的正方形mask=np.zeros((img.shape[0],img.shape[1],2),np.uint8)mask[crow-20:crow+20,ccol-20:ccol+20]=1#設(shè)置掩模區(qū)域?yàn)?00*100的正方形mask1=np.zeros((img.shape[0],img.shape[1],2),np.uint8)mask1[crow-50:crow+50,ccol-50:ccol+50]=1#第六步:將掩模與傅里葉變化后圖像相乘,保留中間部分mask_img=dft_center*maskmask1_img=dft_center*mask1#第七步:使用np.fft.ifftshift將低頻移動到原來的位置img_idf=np.fft.ifftshift(mask_img)img1_idf=np.fft.ifftshift(mask1_img)#第八步:使用cv2.idft進(jìn)行傅里葉的反變換img_idf=cv2.idft(img_idf)img1_idf=cv2.idft(img1_idf)#第九步:使用cv2.magnitude轉(zhuǎn)換為空間域img_idf=cv2.magnitude(img_idf[:,:,0],img_idf[:,:,1])img1_idf=cv2.magnitude(img1_idf[:,:,0],img1_idf[:,:,1])#第十步:輸出圖像plt.subplot(131),plt.title('OriginImage')plt.imshow(img,cmap='gray'),plt.axis('off')plt.subplot(132),plt.title('Lowpassmask=20')plt.imshow(img_idf,cmap='gray'),plt.axis('off')plt.subplot(133),plt.title('Lowpassmask=50')plt.imshow(img1_idf,cmap='gray'),plt.axis('off')plt.show()程序運(yùn)行結(jié)果如圖所示。從結(jié)果看,圖中左邊為原圖像,中間圖像為在傅里葉變換頻域上截取40ⅹ40正方形的低通區(qū)域,逆變換后的得到的圖像,可以看出圖像變得模糊、丟失了許多細(xì)節(jié)、有振鈴現(xiàn)象,這也是理想低通濾波的特點(diǎn)。右邊圖像為在傅里葉變換頻域上截取100ⅹ100正方形的低通區(qū)域,逆變換后的得到的圖像,這時(shí)圖像看起來與原圖像基本差不多了,這也是對圖像進(jìn)行有損壓縮的原理。不同掩模下的低通濾波圖像6.2.2巴特沃斯低通濾波(Butterworthfilter)

例6.4對一幅圖像進(jìn)行巴特沃斯低通濾波,觀察結(jié)果。importcv2importnumpyasnpdefcombine_images(images):#濾波后圖像與頻域圖組合在一起

shapes=np.array([mat.shapeformatinimages])rows=np.max(shapes[:,0])copy_imgs=[cv2.copyMakeBorder(img,0,rows-img.shape[0],0,0,cv2.BORDER_CONSTANT,(0,0,0))forimginimages]returnnp.hstack(copy_imgs)deffft(img):#傅里葉變換

rows,cols=img.shape[:2]nrows=cv2.getOptimalDFTSize(rows)#得到傅里葉最優(yōu)尺寸大小

ncols=cv2.getOptimalDFTSize(cols)nimg=np.zeros((nrows,ncols))nimg[:rows,:cols]=imgfft_mat=cv2.dft(np.float32(nimg),flags=cv2.DFT_COMPLEX_OUTPUT)returnnp.fft.fftshift(fft_mat)deffft_image(fft_mat):log_mat=cv2.log(1+cv2.magnitude(fft_mat[:,:,0],fft_mat[:,:,1]))cv2.normalize(log_mat,log_mat,0,255,cv2.NORM_MINMAX)returnnp.uint8(np.around(log_mat))defifft(fft_mat):#逆傅里葉變換

f_ishift_mat=np.fft.ifftshift(fft_mat)img_back=cv2.idft(f_ishift_mat)img_back=cv2.magnitude(*cv2.split(img_back))cv2.normalize(img_back,img_back,0,255,cv2.NORM_MINMAX)returnnp.uint8(np.around(img_back))deffft_distances(m,n):u=np.array([iifi<=m/2elsem-iforiinrange(m)],dtype=np.float32)v=np.array([iifi<=m/2elsem-iforiinrange(m)],dtype=np.float32)v.shape=n,1ret=np.sqrt(u*u+v*v)returnnp.fft.fftshift(ret)defBWfilter(rows,cols,d0,n):#巴特沃斯低通濾波

duv=fft_distances(*fft_mat.shape[:2])filter_mat=1/(1+np.power(duv/d0,2*n))filter_mat=cv2.merge((filter_mat,filter_mat))returnfilter_matdefdo_filter(_=None):d0=cv2.getTrackbarPos('D0',filter_win)n=cv2.getTrackbarPos('n',filter_win)filter_mat=BWfilter(fft_mat.shape[0],fft_mat.shape[1],d0,n)filtered_mat=filter_mat*fft_matimg_back=ifft(filtered_mat)cv2.imshow(image_win,combine_images([img_back,fft_image(filter_mat)]))if__name__=='__main__':img=cv2.imread('d:\pics\lena.jpg',0)rows,cols=img.shape[:2]filter_win='FilterParameters'image_win='ButterworthLowPassFilteredImage'dWindow(filter_win)dWindow(image_win)cv2.createTrackbar('D0',filter_win,20,min(rows,cols)//4,do_filter)cv2.createTrackbar('n',filter_win,1,5,do_filter)fft_mat=fft(img)do_filter()cv2.resizeWindow(filter_win,512,20)cv2.waitKey(0)cv2.destroyAllWindows()當(dāng)D0=30、n=2時(shí)程序運(yùn)行結(jié)果如圖6-4所示??梢酝ㄟ^調(diào)整濾波器參數(shù)D0和n,看到濾波器參數(shù)D0和n的變換對圖像濾波的影響效果。當(dāng)濾波半徑D0越大,濾波效果越好,圖像越清晰;當(dāng)濾波器階數(shù)越大,圖像變得越模糊。因?yàn)榘吞匚炙沟屯V波器在高、低頻間的過渡平滑,因此沒有出現(xiàn)明顯的振鈴效應(yīng)。巴特沃斯低通濾波器參數(shù)D0、n調(diào)整巴特沃斯低通濾波后的結(jié)果巴特沃斯低通濾波器6.3高斯低通濾波(GaussianLowPassFilter)

例6.5對一幅圖像進(jìn)行高斯低通濾波,觀察結(jié)果。importcv2importnumpyasnpdefcombine_images(images):shapes=np.array([mat.shapeformatinimages])rows=np.max(shapes[:,0])copy_imgs=[cv2.copyMakeBorder(img,0,rows-img.shape[0],0,0,cv2.BORDER_CONSTANT,(0,0,0))forimginimages]returnnp.hstack(copy_imgs)deffft(img):rows,cols=img.shape[:2]nrows=cv2.getOptimalDFTSize(rows)ncols=cv2.getOptimalDFTSize(cols)nimg=np.zeros((nrows,ncols))nimg[:rows,:cols]=imgfft_mat=cv2.dft(np.float32(nimg),flags=cv2.DFT_COMPLEX_OUTPUT)returnnp.fft.fftshift(fft_mat)deffft_image(fft_mat):log_mat=cv2.log(1+cv2.magnitude(fft_mat[:,:,0],fft_mat[:,:,1]))cv2.normalize(log_mat,log_mat,0,255,cv2.NORM_MINMAX)returnnp.uint8(np.around(log_mat))defifft(fft_mat):f_ishift_mat=np.fft.ifftshift(fft_mat)img_back=cv2.idft(f_ishift_mat)img_back=cv2.magnitude(*cv2.split(img_back))cv2.normalize(img_back,img_back,0,255,cv2.NORM_MINMAX)returnnp.uint8(np.around(img_back))deffft_distances(m,n):u=np.array([iifi<=m/2elsem-iforiinrange(m)],dtype=np.float32)v=np.array([iifi<=m/2elsem-iforiinrange(m)],dtype=np.float32)v.shape=n,1ret=np.sqrt(u*u+v*v)returnnp.fft.fftshift(ret)defglpfilter(rows,cols,d0,n):#高斯低通濾波

duv=fft_distances(*fft_mat.shape[:2])filter_mat=np.exp(-(duv*duv)/(2*d0*d0))filter_mat=cv2.merge((filter_mat,filter_mat))returnfilter_matdefdo_filter(_=None):d0=cv2.getTrackbarPos('D0',filter_win)n=cv2.getTrackbarPos('n',filter_win)filter_mat=glpfilter(fft_mat.shape[0],fft_mat.shape[1],d0,n)filtered_mat=filter_mat*fft_matimg_back=ifft(filtered_mat)cv2.imshow(image_win,combine_images([img_back,fft_image(filter_mat)]))if__name__=='__main__':img=cv2.imread('d:\pics\lena.jpg',0)rows,cols=img.shape[:2]filter_win='FilterParameters'image_win='GaussianLowPassFilteredImage'dWindow(filter_win)dWindow(image_win)cv2.createTrackbar('D0',filter_win,20,min(rows,cols)//4,do_filter)cv2.createTrackbar('n',filter_win,1,5,do_filter)fft_mat=fft(img)do_filter()cv2.resizeWindow(filter_win,512,20)cv2.waitKey(0)cv2.destroyAllWindows()當(dāng)D0=30、n=3時(shí)程序運(yùn)行結(jié)果如圖6-5所示。可以通過調(diào)整濾波器參數(shù)D0、n,看到D0、n的變換對圖像的影響效果。高斯低通濾波器參數(shù)D0、n調(diào)整高斯低通濾波后的結(jié)果高斯低通濾波器6.3高通濾波高通濾波高通濾波是使高頻通過而使低頻衰減的濾波,高通濾波器能削弱一幅圖像的傅里葉變換里的低頻分量,而增強(qiáng)高頻分量(或保持它們不變)。被高通濾波的圖像比原始圖像少灰度級的平滑過渡而突出邊緣等細(xì)節(jié)部分。6.3.1理想高通濾波只保留圖像的高頻部分,濾波過程與理想低通濾波一樣,構(gòu)造的掩模中間為0,邊緣為1,然后與傅里葉變化后的圖像結(jié)合,保留高頻部分,去除低頻部分如下所示:其中D0表示通帶的半徑,D(u,v)表示頻域點(diǎn)(u,v)到頻域圖像原點(diǎn)的距離,稱為截止頻率。

例6.對一幅圖像進(jìn)行范圍大小不同的頻域高通濾波,使用掩模只保留高通部分,觀察效果。importcv2importnumpyasnpfrommatplotlibimportpyplotasplt#第一步讀入圖片img=cv2.imread('d:\pics\lena.jpg',0)#第二步:進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換img_float=np.float32(img)#第三步:使用cv2.dft進(jìn)行傅里葉變換dft=cv2.dft(img_float,flags=cv2.DFT_COMPLEX_OUTPUT)#第四步:使用np.fft.fftshift將低頻轉(zhuǎn)移到圖像中心dft_center=np.fft.fftshift(dft)#第五步:定義掩模:生成的掩模中間為0周圍為1#求得圖像的中心點(diǎn)位置crow,ccol=int(img.shape[0]/2),int(img.shape[1]/2)#設(shè)置掩模區(qū)域?yàn)?0*10的正方形mask=np.ones((img.shape[0],img.shape[1],2),np.uint8)mask[crow-5:crow+5,ccol-5:ccol+5]=0

#設(shè)置掩模區(qū)域?yàn)?0*60的正方形mask1=np.ones((img.shape[0],img.shape[1],2),np.uint8)mask1[crow-30:crow+30,ccol-30:ccol+30]=0#第六步:將掩模與傅里葉變化后圖像相乘,保留中間部分mask_img=dft_center*maskmask1_img=dft_center*mask1#第七步:使用np.fft.ifftshift將低頻移動到原來的位置img_idf=np.fft.ifftshift(mask_img)img1_idf=np.fft.ifftshift(mask1_img)#第八步:使用cv2.idft進(jìn)行傅里葉的反變換img_idf=cv2.idft(img_idf)img1_idf=cv2.idft(img1_idf)#第九步:使用cv2.magnitude轉(zhuǎn)換為空間域img_idf=cv2.magnitude(img_idf[:,:,0],img_idf[:,:,1])img1_idf=cv2.magnitude(img1_idf[:,:,0],img1_idf[:,:,1])#第十步:顯示結(jié)果圖像plt.subplot(131),plt.title('OriginImage')plt.imshow(img,cmap='gray'),plt.axis('off')plt.subplot(132),plt.title('Highpassmask=5')plt.imshow(img_idf,cmap='gray'),plt.axis('off')plt.subplot(133),plt.title('Highpassmask=30')plt.imshow(img1_idf,cmap='gray'),plt.axis('off')plt.show()程序運(yùn)行結(jié)果如圖所示。左圖為原始圖像,中圖為10ⅹ10像素的頻域高通濾波后的圖像,右圖為30ⅹ30像素的頻域高通濾波后的圖像。從圖中可以看出高頻部分對圖像的重要性,減少了高頻部分,圖像的邊緣變得模糊,圖像不清晰。理想高通濾波后的圖像6.3.2巴特沃斯高通濾波巴特沃斯高通濾波的函數(shù)表達(dá)式如下所示:其中n稱為Butterworth高通濾波器的階數(shù)。從函數(shù)表達(dá)式可知,巴特沃斯高通濾波沒有理想高通濾波器那么劇烈。在巴特沃斯高通濾波中,階數(shù)越高,濾波器過度越劇烈,振鈴現(xiàn)象越明顯。

例6.7對一幅圖像進(jìn)行巴特沃斯高通濾波,調(diào)節(jié)濾波半徑和階數(shù),觀察效果。importcv2importnumpyasnpdefcombine_images(images):shapes=np.array([mat.shapeformatinimages])rows=np.max(shapes[:,0])copy_imgs=[cv2.copyMakeBorder(img,0,rows-img.shape[0],0,0,cv2.BORDER_CONSTANT,(0,0,0))forimginimages]returnnp.hstack(copy_imgs)deffft(img):rows,cols=img.shape[:2]nrows=cv2.getOptimalDFTSize(rows)ncols=cv2.getOptimalDFTSize(cols)nimg=np.zeros((nrows,ncols))nimg[:rows,:cols]=imgfft_mat=cv2.dft(np.float32(nimg),flags=cv2.DFT_COMPLEX_OUTPUT)returnnp.fft.fftshift(fft_mat)deffft_image(fft_mat):log_mat=cv2.log(1+cv2.magnitude(fft_mat[:,:,0],fft_mat[:,:,1]))cv2.normalize(log_mat,log_mat,0,255,cv2.NORM_MINMAX)returnnp.uint8(np.around(log_mat))defifft(fft_mat):f_ishift_mat=np.fft.ifftshift(fft_mat)img_back=cv2.idft(f_ishift_mat)img_back=cv2.magnitude(*cv2.split(img_back))cv2.normalize(img_back,img_back,0,255,cv2.NORM_MINMAX)returnnp.uint8(np.around(img_back))deffft_distances(m,n):u=np.array([iifi<=m/2elsem-iforiinrange(m)],dtype=np.float32)v=np.array([iifi<=m/2elsem-iforiinrange(m)],dtype=np.float32)v.shape=n,1ret=np.sqrt(u*u+v*v)returnnp.fft.fftshift(ret)defBhpfilter(rows,cols,d0,n):duv=fft_distances(rows,cols)duv[rows//2,cols//2]=0.000001filter_mat=1/(1+np.power(d0/duv,2*n))filter_mat=cv2.merge((filter_mat,filter_mat))returnfilter_matdefdo_filter(_=None):d0=cv2.getTrackbarPos('D0',filter_win)n=cv2.getTrackbarPos('n',filter_win)filter_mat=Bhpfilter(fft_mat.shape[0],fft_mat.shape[1],d0,n)filtered_mat=filter_mat*fft_matimg_back=ifft(filtered_mat)cv2.imshow(image_win,combine_images([img_back,fft_image(filter_mat)]))if__name__=='__main__':img=cv2.imread('d:\pics\lena.jpg',0)rows,cols=img.shape[:2]filter_win='FilterParameters'image_win='ButterworthHighPassFilteredImage'dWindow(filter_win)dWindow(image_win)cv2.createTrackbar('D0',filter_win,20,min(rows,cols)//4,do_filter)cv2.createTrackbar('n',filter_win,1,5,do_filter)fft_mat=fft(img)do_filter()cv2.resizeWindow(filter_win,512,20)cv2.waitKey(0)cv2.destroyAllWindows()當(dāng)D0=20、n=2時(shí)程序運(yùn)行結(jié)果如圖所示。巴特沃斯高通濾波器參數(shù)D0、n調(diào)整巴特沃斯高通濾波后的圖像巴特沃斯高通濾波器6.3.3高斯高通濾波高斯高通濾波的函數(shù)表達(dá)式如下所示:其中D0表示通帶的半徑,D(u,v)表示頻域點(diǎn)(u,v)到頻域圖像原點(diǎn)的距離。由于高斯高通濾波器的過渡是非常平坦的,不會產(chǎn)生振鈴現(xiàn)象。

例6.8對一幅圖像進(jìn)行高斯高通濾波,調(diào)節(jié)D0和n,觀察效果。importcv2importnumpyasnpdefcombine_images(images):shapes=np.array([mat.shapeformatinimages])rows=np.max(shapes[:,0])copy_imgs=[cv2.copyMakeBorder(img,0,rows-img.shape[0],0,0,cv2.BORDER_CONSTANT,(0,0,0))forimginimages]returnnp.hstack(copy_imgs)deffft(img):rows,cols=img.shape[:2]nrows=cv2.getOptimalDFTSize(rows)ncols=cv2.getOptimalDFTSize(cols)nimg=np.zeros((nrows,ncols))nimg[:rows,:cols]=imgfft_mat=cv2.dft(np.float32(nimg),flags=cv2.DFT_COMPLEX_OUTPUT)returnnp.fft.fftshift(fft_mat)deffft_image(fft_mat):log_mat=cv2.log(1+cv2.magnitude(fft_mat[:,:,0],fft_mat[:,:,1]))cv2.normalize(log_mat,log_mat,0,255,cv2.NORM_MINMAX)returnnp.uint8(np.around(log_mat))defifft(fft_mat):f_ishift_mat=np.fft.ifftshift(fft_mat)img_back=cv2.idft(f_ishift_mat)img_back=cv2.magnitude(*cv2.split(img_back))cv2.normalize(img_back,img_back,0,255,cv2.NORM_MINMAX)returnnp.uint8(np.around(img_back))deffft_distances(m,n):u=np.array([iifi<=m/2elsem-iforiinrange(m)],dtype=np.float32)v=np.array([iifi<=m/2elsem-iforiinrange(m)],dtype=np.float32)v.shape=n,1ret=np.sqrt(u*u+v*v)returnnp.fft.fftshift(ret)defghpfilter(rows,cols,d0,n):duv=fft_distances(*fft_mat.shape[:2])filter_mat=1-np.exp(-(duv*duv)/(2*d0*d0))filter_mat=cv2.merge((filter_mat,filter_mat))returnfilter_matdefdo_filter(_=None):d0=cv2.getTrackbarPos('D0',filter_win)n=cv2.getTrackbarPos('n',filter_win)filter_mat=ghpfilter(fft_mat.shape[0],fft_mat.shape[1],d0,n)filtered_mat=filter_mat*fft_matimg_back=ifft(filtered_mat)cv2.imshow(image_win,combine_images([img_back,fft_image(filter_mat)]))if__name__=='__main__':img=cv2.imread('d:\pics\lena.jpg',0)rows,cols=img.shape[:2]filter_win='FilterParameters'image_win='GaussianHighPassFilteredImage'dWindow(filter_win)dWindow(image_win)cv2.createTrackbar('D0',filter_win,20,min(rows,cols)//4,do_filter)cv2.createTrackbar('n',filter_win,1,5,do_filter)fft_mat=fft(img)do_filter()cv2.resizeWindow(filter_win,512,20)cv2.waitKey(0)cv2.destroyAllWindows()當(dāng)D0=10、n=2時(shí)程序運(yùn)行結(jié)果如圖所示。高斯低通濾波器參數(shù)D0、n調(diào)整高斯高通濾波后圖像高斯高通濾波器6.4帶通和帶阻濾波帶通和帶阻濾波在頻域內(nèi)進(jìn)行濾波時(shí),可能遇在某一范圍的頻域受到了雜波的干擾,需要對其濾除掉,這時(shí)就用到了帶通或帶阻濾波。6.4.1帶通濾波帶通濾波器是只保留某一范圍區(qū)域的頻率帶,頻率范圍外的信息過濾掉,選擇圖像的部分信息。常用的帶通濾波器包括理想帶通濾波器、巴特沃斯帶通濾波器、高斯帶通濾波器。假設(shè)BW代表帶寬,D0代表帶寬的徑向中心,則三種帶通濾波器可以表示為:理想帶通濾波器:

例6.9對一幅圖像分別進(jìn)行理想帶通濾波器、巴特沃斯帶通濾波器、高斯帶通濾波器頻域的帶通濾波,調(diào)整參數(shù),觀察效果。importcv2importnumpyasnpdefcreateBPFilter(shape,center,bandCenter,bandWidth,lpType,n=2):rows,cols=shape[:2]r,c=np.mgrid[0:rows:1,0:cols:1]c-=center[0]r-=center[1]d=np.sqrt(np.power(c,2.0)+np.power(r,2.0))lpFilter_matrix=np.zeros(shape,np.float32)iflpType==0:#理想帶通濾波器

lpFilter=np.copy(d)lpFilter[:,:]=1lpFilter[d>(bandCenter+bandWidth/2)]=0lpFilter[d<(bandCenter-bandWidth/2)]=0eliflpType==1:#巴特沃斯帶通濾波器

lpFilter=1.0-1.0/(1+np.power(d*bandWidth/(d-pow(bandCenter,2)),2*n))eliflpType==2:#高斯帶通濾波器lpFilter=np.exp(-pow((d-pow(bandCenter,2))/(d*bandWidth),2))lpFilter_matrix[:,:,0]=lpFilterlpFilter_matrix[:,:,1]=lpFilterreturnlpFilter_matrixdefstdFftImage(img_gray,rows,cols):fimg=np.copy(img_gray)fimg=fimg.astype(np.float32)#1.圖像矩陣乘以(-1)^(r+c),中心化

forrinrange(rows):forcinrange(cols):if(r+c)%2:fimg[r][c]=-1*img_gray[r][c]img_fft=fftImage(fimg,rows,cols)returnimg_fftdeffftImage(img_gray,rows,cols):#離散傅里葉變換

rPadded=cv2.getOptimalDFTSize(rows)cPadded=cv2.getOptimalDFTSize(cols)imgPadded=np.zeros((rPadded,cPadded),dtype=np.float32)imgPadded[:rows,:cols]=img_grayimg_fft=cv2.dft(imgPadded,flags=cv2.DFT_COMPLEX_OUTPUT)returnimg_fftdefgraySpectrum(fft_img):#幅度、頻譜

real=np.power(fft_img[:,:,0],2.0)imaginary=np.power(fft_img[:,:,1],2.0)amplitude=np.sqrt(real+imaginary)spectrum=np.log(amplitude+1.0)spectrum=cv2.normalize(spectrum,0,1,norm_type=cv2.NORM_MINMAX,\dtype=cv2.CV_32F)spectrum*=255returnamplitude,spectrumdefnothing(args):passif__name__=="__main__":img_file=r"d:\pics\lena.jpg"img_gray=cv2.imread(img_file,0)#1.快速傅里葉變換

rows,cols=img_gray.shape[:2]img_fft=stdFftImage(img_gray,rows,cols)amplitude,_=graySpectrum(img_fft)minValue,maxValue,minLoc,maxLoc=cv2.minMaxLoc(amplitude)#中心化后頻譜的最大值在圖像中心位置處

dWindow("tracks")max_radius=np.sqrt(pow(rows,2)+pow(cols,2))cv2.createTrackbar("BandCenter","tracks",0,int(max_radius),nothing)cv2.createTrackbar("BandWidth","tracks",0,int(max_radius),nothing)cv2.createTrackbar("Filtertype","tracks",0,2,nothing)whileTrue:#2.構(gòu)建帶通濾波器

bandCenter=cv2.getTrackbarPos("BandCenter","tracks")bandWidth=cv2.getTrackbarPos("BandWidth","tracks")lpType=cv2.getTrackbarPos("Filtertype","tracks")nrows,ncols=img_fft.shape[:2]ilpFilter=createBPFilter(img_fft.shape,maxLoc,bandCenter,bandWidth,lpType)#3.帶通濾波器濾波

img_filter=ilpFilter*img_fft_,gray_spectrum=graySpectrum(img_filter)#觀察濾波器的變化

#4.傅里葉反變換,取實(shí)部進(jìn)行裁剪,并去除中心化

img_ift=cv2.dft(img_filter,flags=cv2.DFT_INVERSE+cv2.DFT_REAL_OUTPUT+cv2.DFT_SCALE)ori_img=np.copy(img_ift[:rows,:cols])forrinrange(rows):forcinrange(cols):if(r+c)%2:ori_img[r][c]=-1*ori_img[r][c]#截?cái)喔叩椭?/p>

ifori_img[r][c]<0:ori_img[r][c]=0ifori_img[r][c]>255:ori_img[r][c]=255ori_img=ori_img.astype(np.uint8)#5.帶通濾波器的輸出

cv2.imshow("Origin_img",img_gray)cv2.imshow("Filter_spectrum",gray_spectrum)cv2.imshow("BWF_image",ori_img)key=cv2.waitKey(1)ifkey==27:breakcv2.destroyAllWindows()理想濾波參數(shù)例6.9程序運(yùn)行結(jié)果如圖所示。理想帶通濾波器理想帶通濾波后圖像巴特沃斯濾波參數(shù)巴特沃斯帶通濾波器巴特沃斯帶通濾后圖像高斯濾波參數(shù)高斯帶通濾波器高斯帶通濾波后圖像6.4.2帶阻濾波

例6.10對一幅圖像分別進(jìn)行理想帶阻濾波器、巴特沃斯帶阻濾波器、高斯帶阻濾波器頻域的帶阻濾波,調(diào)整參數(shù),觀察效果。importcv2importnumpyasnpdefcreateBRFilter(shape,center,bandCenter,bandWidth,lpType,n=2):rows,cols=shape[:2]r,c=np.mgrid[0:rows:1,0:cols:1]c-=center[0]r-=center[1]d=np.sqrt(np.power(c,2.0)+np.power(r,2.0))lpFilter_matrix=np.zeros(shape,np.float32)iflpType==0:#理想帶阻濾波器

lpFilter=np.copy(d)lpFilter[:,:]=0lpFilter[d>(bandCenter+bandWidth/2)]=1lpFilter[d<(bandCenter-bandWidth/2)]=1eliflpType==1:#巴特沃斯帶阻濾波器

lpFilter=1.0/(1+np.power(d*bandWidth/(d-pow(bandCenter,2)),2*n))eliflpType==2:#高斯帶阻濾波器lpFilter=1-np.exp(-pow((d-pow(bandCenter,2))/(d*bandWidth),2))lpFilter_matrix[:,:,0]=lpFilterlpFilter_matrix[:,:,1]=lpFilterreturnlpFilter_matrixdefstdFftImage(img_gray,rows,cols):fimg=np.copy(img_gray)fimg=fimg.astype(np.float32)#圖像矩陣乘以(-1)^(r+c),中心化

forrinrange(rows):forcinrange(cols):if(r+c)%2:fimg[r][c]=-1*img_gray[r][c]img_fft=fftImage(fimg,rows,cols)returnimg_fftdeffftImage(img_gray,rows,cols):rPadded=cv2.getOptimalDFTSize(rows)cPadded=cv2.getOptimalDFTSize(cols)imgPadded=np.zeros((rPadded,cPadded),dtype=np.float32)imgPadded[:rows,:cols]=img_grayimg_fft=cv2.dft(imgPadded,flags=cv2.DFT_COMPLEX_OUTPUT)returnimg_fftdefgraySpectrum(fft_img):real=np.power(fft_img[:,:,0],2.0)imaginary=np.power(fft_img[:,:,1],2.0)amplitude=np.sqrt(real+imaginary)spectrum=np.log(amplitude+1.0)spectrum=cv2.normalize(spectrum,0,1,norm_type=cv2.NORM_MINMAX,dtype=cv2.CV_32F)spectrum*=255returnamplitude,spectrumdefnothing(args):passif__name__=="__main__":img_file=r"d:\pics\lena.jpg"img_gray=cv2.imread(img_file,0)#1.快速傅里葉變換

rows,cols=img_gray.shape[:2]img_fft=stdFftImage(img_gray,rows,cols)amplitude,_=graySpectrum(img_fft)minValue,maxValue,minLoc,maxLoc=cv2.minMaxLoc(amplitude)#中心化后頻譜的最大值在圖片中心位置處

dWindow("tracks")max_radius=np.sqrt(pow(rows,2)+pow(cols,2))cv2.createTrackbar("BandCenter","tracks",0,int(max_radius),nothing)cv2.createTrackbar("BandWidth","tracks",0,int(max_radius),nothing)cv2.createTrackbar("Filtertype","tracks",0,2,nothing)whileTrue:#2.構(gòu)建帶阻濾波器

bandCenter=cv2.getTrackbarPos("BandCenter","tracks")bandWidth=cv2.getTrackbarPos("BandWidth","tracks")lpType=cv2.getTrackbarPos("Filtertype","tracks")nrows,ncols=img_fft.shape[:2]ilpFilter=createBRFilter(img_fft.shape,maxLoc,bandCenter,bandWidth,lpType)#3.帶阻濾波器濾波

img_filter=ilpFilter*img_fft_,gray_spectrum=graySpectrum(img_filter)#觀察濾波器的變化

#4.傅里葉反變換,并取實(shí)部進(jìn)行裁剪,并去中心化

img_ift=cv2.dft(img_filter,flags=cv2.DFT_INVERSE+\cv2.DFT_REAL_OUTPUT+cv2.DFT_SCALE)ori_img=np.copy(img_ift[:rows,:cols])ori_img[ori_img<0]=0ori_img[

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論