<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
影象處理一般分為空間域處理和頻率域處理。
空間域處理是直接對影象內的畫素進行處理。
空間域處理主要劃分為灰度變換和空間濾波兩種形式。
頻率域處理是先將影象變換到頻率域,然後在頻率域對影象進行處理,最後再通過反變換將影象從頻率域變換到空間域。
時間差,在傅立葉變換裡就是相位。相位表述的是與時間差相關的資訊。
在影象處理過程中,傅立葉變換就是將影象分解為正弦分量和餘弦分量兩部分,即將影象從空間域轉換到頻域。
數位影像經過傅立葉變換後,得到的頻域值是複數。因此,顯示傅立葉變換的結果需要使用實數影象(real image)加虛數影象(complex image),或者幅度影象(magnitude image)加相點陣影象(phase image)的形式。
因為幅度影象包含了原影象中我們所需要的大部分資訊,所以在影象處理過程中,通常僅使用幅度影象。
如果希望先在頻域內對影象進行處理,再通過逆傅立葉變換得到修改後的空域影象,就必須同時保留幅度影象和相點陣影象。
對影象進行傅立葉變換後,會得到影象中的低頻和高頻資訊。
低頻資訊對應影象內變化緩慢的灰度分量。高頻資訊對應影象內變化越來越快的灰度分量,是由灰度的尖銳過渡造成的。
傅立葉變換的目的,就是為了將影象從空域轉換到頻域,並在頻域內實現對影象內特定物件的處理,然後再對經過處理的頻域影象進行逆傅立葉變換得到空域影象。
傅立葉變換在影象處理領域發揮著非常關鍵的作用,可以實現影象增強、影象去噪、邊緣檢測、特徵提取、影象壓縮和加密等。
Numpy模組中的fft2()函數可以實現影象的傅立葉變換。
Numpy提供的實現傅立葉變換的函數是numpy.fft.fft2(),它的語法格式是:
返回值 = numpy.fft.fft2(原始影象)
引數“原始影象”的型別是灰度影象,函數的返回值是一個複數陣列(complex ndarray)。
經過該函數的處理,就能得到影象的頻譜資訊。
此時,影象頻譜中的零頻率分量位於頻譜影象(頻域影象)的左上角
為了便於觀察,通常會使用numpy.fft.fftshift()函數將零頻率成分移動到頻域影象的中心位置。
函數numpy.fft.fftshift()的語法格式是:
返回值=numpy.fft.fftshift(原始頻譜)
使用該函數處理後,影象頻譜中的零頻率分量會被移到頻域影象的中心位置,對於觀察傅立葉變換後頻譜中的零頻率部分非常有效。
對影象進行傅立葉變換後,得到的是一個複數陣列。
為了顯示為影象,需要將它們的值調整到[0, 255]的灰度空間內,使用的公式為:
畫素新值=20*np.log(np.abs(頻譜值))
用Numpy實現傅立葉變換,觀察得到的頻譜影象。
import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('./img/hand1.png',0) f = np.fft.fft2(img) fshift = np.fft.fftshift(f) magnitude_spectrum = 20*np.log(np.abs(fshift)) 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.fft.fftshift()函數移動零頻率分量,那麼在逆傅立葉變換過程中,需要先使用numpy.fft.ifftshift()函數將零頻率分量移到原來的位置,再進行逆傅立葉變換
函數numpy.fft.ifftshift()是numpy.fft.fftshift()的逆函數,其語法格式為:
調整後的頻譜 = numpy.fft.ifftshift(原始頻譜)
numpy.fft.ifft2()函數可以實現逆傅立葉變換,返回空域複數陣列。
它是numpy.fft.fft2()的逆函數,該函數的語法格式為:
返回值=numpy.fft.ifft2(頻域資料)
函數numpy.fft.ifft2()的返回值仍舊是一個複數陣列(complex ndarray)。
逆傅立葉變換得到的空域資訊是一個複數陣列,需要將該資訊調整至[0, 255]灰度空間內,使用的公式為:
iimg = np.abs(逆傅立葉變換結果)
在Numpy內實現傅立葉變換、逆傅立葉變換,觀察逆傅立葉變換的結果影象。
import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('./img/hand1.png',0) f = np.fft.fft2(img) fshift = np.fft.fftshift(f) 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()
一幅影象內,同時存在著高頻訊號和低頻訊號。
濾波器能夠允許一定頻率的分量通過或者拒絕其通過,按照其作用方式可以劃分為低通濾波器和高通濾波器。
傅立葉變換可以將影象的高頻訊號和低頻訊號分離。
通過對影象的頻域處理,可以實現影象增強、影象去噪、邊緣檢測、特徵提取、壓縮和加密等操作。
在Numpy內對影象進行傅立葉變換,得到其頻域影象。然後,在頻域內將低頻分量的值處理為0,實現高通濾波。最後,對影象進行逆傅立葉變換,得到恢復的原始影象。
import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('./img/hand1.png',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()和cv2.idft()來實現傅立葉變換和逆傅立葉變換
實現傅立葉變換
函數cv2.dft()的語法格式為:
返回結果=cv2.dft(原始影象,轉換標識)
在使用該函數時,需要注意引數的使用規範:
函數cv2.dft()返回的結果與使用Numpy進行傅立葉變換得到的結果是一致的,但是它返回的值是雙連結的,第1個通道是結果的實數部分,第2個通道是結果的虛數部分。
經過函數cv2.dft()的變換後,得到了原始影象的頻譜資訊。
此時,零頻率分量並不在中心位置,為了處理方便需要將其移至中心位置,可以用函數numpy.fft.fftshift()實現。
例如,如下語句將頻譜影象dft中的零頻率分量移到頻譜中心,得到了零頻率分量位於中心的頻譜影象dftshift。
dftShift = np.fft.fftshift(dft)
經過上述處理後,頻譜影象還只是一個由實部和虛部構成的值。要將其顯示出來,還要做進一步的處理才行。
函數cv2.magnitude()可以計算頻譜資訊的幅度。該函數的語法格式為:
返回值=cv2.magnitude(引數1,引數2)
函數cv2.magnitude()的返回值是引數1和引數2的平方和的平方根,公式為:
得到頻譜資訊的幅度後,通常還要對幅度值做進一步的轉換,以便將頻譜資訊以影象的形式展示出來。簡單來說,就是需要將幅度值對映到灰度影象的灰度空間[0, 255]內,使其以灰度影象的形式顯示出來。
這裡使用的公式為:
result = 20*np.log(cv2.magnitude(實部,虛部))
import numpy as np import cv2 img = cv2.imread('./img/hand1.jpg',0) dft = cv2.dft(np.float32(img), flags = cv2.DFT_COMPLEX_OUTPUT) print(dft) dftShift = np.fft.fftshift(dft) print(dftShift) result = 20*np.log(cv2.magnitude(dftShift[:, :,0], dftShift[:, :,1])) #兩個引數,需要拆分通道print(result)
用OpenCV函數對影象進行傅立葉變換,並展示其頻譜資訊。
import numpy as np import cv2 import matplotlib.pyplot as plt img = cv2.imread('./img/hand1.png',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.idft(原始資料)
對影象進行傅立葉變換後,通常會將零頻率分量移至頻譜影象的中心位置。如果使用函數numpy.fft.fftshift()移動了零頻率分量,那麼在進行逆傅立葉變換前,要使用函數numpy.fft.ifftshift()將零頻率分量恢復到原來位置。
注意: 在進行逆傅立葉變換後,得到的值仍舊是複數,需要使用函數cv2.magnitude()計算其幅度。
用OpenCV函數對影象進行傅立葉變換、逆傅立葉變換,並展示原始影象及經過逆傅立葉變換後得到的影象。
import numpy as np import cv2 import matplotlib.pyplot as plt img = cv2.imread('./img/hand1.png',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()
在一幅影象內,低頻訊號對應影象內變化緩慢的灰度分量。影象進行低通濾波後會變模糊。
實現的中間步驟
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
使用函數cv2.dft()對影象進行傅立葉變換,得到其頻譜影象。然後,在頻域內將其高頻分量的值處理為0,實現低通濾波。最後,對影象進行逆傅立葉變換,得到恢復的原始影象。
import numpy as np import cv2 import matplotlib.pyplot as plt img = cv2.imread('./img/hand1.png',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]) 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 傅立葉變換內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45