日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

opencv学习笔记22:傅里叶变换,高通滤波,低通滤波

發布時間:2024/9/30 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv学习笔记22:傅里叶变换,高通滤波,低通滤波 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

傅里葉變換原理

任何連續的周期信號,都可以由一組適當的正弦曲線組合而成。
下列左上圖由其他三圖構成。

左圖經過傅里葉變換,由時域圖轉換到頻域圖。相互可逆

相位:不是同時開始的一組余弦函數,在疊加時要體現剛開始的時間。

sin(wx+a)中a是相位

numpy實現傅里葉變換

numpy.fft.fft2()
實現傅里葉變換,返回的是一個復數數組。
numpy.fft.fftshift()
將零頻域分量移到頻譜中心
白色為fft.fft2得到的低頻部分。將低頻部分移到中心。

20*np.log(np.abs(fshift))
傅里葉得到有負數數據,重新設置頻譜的范圍如【0-255】,否則圖像無法展示。

import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('lena.bmp',0) f = np.fft.fft2(img)@#傅里葉變換 fshift = np.fft.fftshift(f)#移動低頻到中間 magnitude_spectrum = 20*np.log(np.abs(fshift))#設置頻譜到【0-255】 plt.subplot(121) plt.imshow(img, cmap = 'gray') plt.title('original') plt.axis('off') plt.subplot(122) plt.imshow(magnitude_spectrum, cmap = 'gray') plt.title('result') plt.axis('off') plt.show()


傅里葉變換能得到高頻,低頻信息。針對低頻,高頻處理能得到不同的目的。

傅里葉變換是可逆的,逆傅里葉變換能得到原始圖像。
在頻域對圖像進行處理后,在頻域處理的結果能反映到逆傅里葉變換圖像上。

numpy實現逆傅里葉變換

numpy.fft.ifftshift()
numpy.fft.fftshift()的逆操作
numpyfft.ifft2().
逆傅里葉變換
iimg = np.abs(逆傅里葉變換結果)
逆傅里葉變換也有負數,調整至的范圍為[0-255}

import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('boat.bmp',0) f = np.fft.fft2(img)#傅里葉變換 fshift = np.fft.fftshift(f)#移動位置 ishift = np.fft.ifftshift(fshift)#逆移動位置 iimg = np.fft.ifft2(ishift)#逆傅里葉變換 print(iimg) iimg = np.abs(iimg)#取絕對值 print(iimg) plt.subplot(121),plt.imshow(img, cmap = 'gray') plt.title('original'),plt.axis('off') plt.subplot(122),plt.imshow(iimg, cmap = 'gray') plt.title('iimg'),plt.axis('off') plt.show()

高通濾波,低通濾波

低頻對應圖像中變化緩慢的灰度分量,例如在一幅草原圖上,低頻對應著廣袤的顏色趨于一致額草原。
高頻對應著圖像內變化越來越快的灰度分量,是由灰度的過度尖銳造成的。如對應草原圖中獅子的邊緣信息。

濾波
接受或者拒絕一定頻率的分量
通過低頻的濾波器叫低通濾波器
通過高頻的濾波器叫高通濾波器
頻域濾波
修改傅里葉變換達到特殊目的,然后計算IDFT返回圖像域
特殊目的:圖像增強,圖像去噪,邊緣檢測,特征提取,壓縮,加密等。

低通濾波:衰減高頻通低頻,會模糊一張圖。
高通濾波:衰減低頻通高頻,增強圖像尖銳細節,但是會造成圖像對比度下降。

高通濾波numpy實現

高通濾波:將頻譜圖像的中心的位置區域設置為0(中心部位為低頻,之前傅里葉變換將低頻移到中心位置啦,由前文得知低頻為白色)

import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('lena.bmp',0) f = np.fft.fft2(img) fshift = np.fft.fftshift(f) rows, cols = img.shape crow,ccol = int(rows/2) , int(cols/2) fshift[crow-30:crow+30, ccol-30:ccol+30] = 0 ishift = np.fft.ifftshift(fshift) iimg = np.fft.ifft2(ishift) iimg = np.abs(iimg) plt.subplot(121),plt.imshow(img, cmap = 'gray') plt.title('original'),plt.axis('off') plt.subplot(122),plt.imshow(iimg, cmap = 'gray') plt.title('iimg'),plt.axis('off') plt.show()

opencv實現傅里葉變換

返回結果=cv2.dft(原始圖像,轉換標識)
返回結果:是雙通道的,第一個為結果的實數部分。第二個為結果的虛數部分。
原始圖像:要求圖像格式是np.float32。得首先轉換np.float32(img)
轉換標識: 一般使用flags = cv2.DFT_COMPLEX_OUTPUT,輸出的是一個復數陣列。
numpy.fft.fftshift(dft)
仍然使用這個將頻破譜譜圖像低頻移到中心位置
返回值=cv2.magnitude(參數1,參數2)
使用這個函數將數值轉換到8位數值形式(圖像形式)

result = 20*np.log(cv2.magnitude(dftShift[:,:,0],dftShift[:,:,1]))
使用這個將值轉換到【0-255】

import numpy as np import cv2 import matplotlib.pyplot as plt img = cv2.imread('lena.bmp',0) dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT) dftShift = np.fft.fftshift(dft) result = 20*np.log(cv2.magnitude(dftShift[:,:,0],dftShift[:,:,1])) plt.subplot(121),plt.imshow(img, cmap = 'gray') plt.title('original'),plt.axis('off') plt.subplot(122),plt.imshow(result, cmap = 'gray') plt.title('result'), plt.axis('off') plt.show()

opencv實現逆傅里葉變換

返回結果=cv2.idft(原始數據)

cv2.dft()的逆操作.
返回結果:取決于原始數據的類型和大小。
原始數據:實數或者復數均可。

返回值=cv2.magnitude(參數1,參數2)

使用這個將值轉換到【0-255】即把這個數值轉換到8位數值形式
ishift = np.fft.ifftshift(dftShift)
將中間低頻部分,移動會原處。numpy.fft.fftshift(dft)的逆操作

import numpy as np import cv2 import matplotlib.pyplot as plt img = cv2.imread('lena.bmp',0) dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT) dftShift = np.fft.fftshift(dft) ishift = np.fft.ifftshift(dftShift) iImg = cv2.idft(ishift) iImg= cv2.magnitude(iImg[:,:,0],iImg[:,:,1]) plt.subplot(121),plt.imshow(img, cmap = 'gray') plt.title('original'), plt.axis('off') plt.subplot(122),plt.imshow(iImg, cmap = 'gray') plt.title('inverse'), plt.axis('off') plt.show()

低通濾波opencv實現
前面實現了高通濾波
這里實現低通濾波。用opencv。也可以用numpy,參考前面高通濾波numpy實現.
低頻是大量細節,高頻是邊緣。
低通濾波:相當于把下面右圖中心部分白色保留,周圍黑色舍棄。

實現方法

低通濾波器構造

import numpy as np import cv2 import matplotlib.pyplot as plt img = cv2.imread('lena.bmp',0) #傅里葉變換 dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)#傅里葉變換 dftShift = np.fft.fftshift(dft)#移動低頻部分到中心 #低通濾波器構造 rows, cols = img.shape crow,ccol = int(rows/2) , int(cols/2) mask = np.zeros((rows,cols,2),np.uint8) mask[crow-30:crow+30, ccol-30:ccol+30] = 1 #兩個通道,與頻譜圖像匹配 fShift = dftShift*mask #逆傅里葉變換 ishift = np.fft.ifftshift(fShift)#移動中心位低頻到原處 iImg = cv2.idft(ishift)#逆傅里葉變換 iImg= cv2.magnitude(iImg[:,:,0],iImg[:,:,1])#將數值變換到8位二進制數值圖像格式 #圖像顯示 plt.subplot(121),plt.imshow(img, cmap = 'gray') plt.title('original'), plt.axis('off') plt.subplot(122),plt.imshow(iImg, cmap = 'gray') plt.title('result'), plt.axis('off') plt.show()


總目錄鏈接:
python3+opencv學習筆記匯總目錄(適合基礎入門學習)
電氣專業的計算機小白,寫博文不容易。如果你覺得本文不錯。請點個贊支持下。謝謝

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的opencv学习笔记22:傅里叶变换,高通滤波,低通滤波的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。