最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

opencv?傅里葉變換的實現(xiàn)

 更新時間:2022年06月06日 09:53:14   作者:暴風雨中的白楊  
本文主要介紹了opencv?傅里葉變換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧<BR>

傅里葉變換

圖像處理一般分為空間域處理和頻率域處理。

空間域處理是直接對圖像內的像素進行處理。

空間域處理主要劃分為灰度變換和空間濾波兩種形式。

  • 灰度變換是對圖像內的單個像素進行處理,比如調節(jié)對比度和處理閾值等。
  • 空間濾波涉及圖像質量的改變,例如圖像平滑處理??臻g域處理的計算簡單方便,運算速度更快。

頻率域處理是先將圖像變換到頻率域,然后在頻率域對圖像進行處理,最后再通過反變換將圖像從頻率域變換到空間域。

理論基礎

時間差,在傅里葉變換里就是相位。相位表述的是與時間差相關的信息。

在圖像處理過程中,傅里葉變換就是將圖像分解為正弦分量和余弦分量兩部分,即將圖像從空間域轉換到頻域。

數(shù)字圖像經過傅里葉變換后,得到的頻域值是復數(shù)。因此,顯示傅里葉變換的結果需要使用實數(shù)圖像(real image)加虛數(shù)圖像(complex image),或者幅度圖像(magnitude image)加相位圖像(phase image)的形式。

因為幅度圖像包含了原圖像中我們所需要的大部分信息,所以在圖像處理過程中,通常僅使用幅度圖像。

如果希望先在頻域內對圖像進行處理,再通過逆傅里葉變換得到修改后的空域圖像,就必須同時保留幅度圖像和相位圖像。

對圖像進行傅里葉變換后,會得到圖像中的低頻和高頻信息。

低頻信息對應圖像內變化緩慢的灰度分量。高頻信息對應圖像內變化越來越快的灰度分量,是由灰度的尖銳過渡造成的。

傅里葉變換的目的,就是為了將圖像從空域轉換到頻域,并在頻域內實現(xiàn)對圖像內特定對象的處理,然后再對經過處理的頻域圖像進行逆傅里葉變換得到空域圖像。

傅里葉變換在圖像處理領域發(fā)揮著非常關鍵的作用,可以實現(xiàn)圖像增強、圖像去噪、邊緣檢測、特征提取、圖像壓縮和加密等。

Numpy實現(xiàn)傅里葉變換

Numpy模塊中的fft2()函數(shù)可以實現(xiàn)圖像的傅里葉變換。

實現(xiàn)傅里葉變換

Numpy提供的實現(xiàn)傅里葉變換的函數(shù)是numpy.fft.fft2(),它的語法格式是:

返回值 = numpy.fft.fft2(原始圖像)

參數(shù)“原始圖像”的類型是灰度圖像,函數(shù)的返回值是一個復數(shù)數(shù)組(complex ndarray)。

經過該函數(shù)的處理,就能得到圖像的頻譜信息。

此時,圖像頻譜中的零頻率分量位于頻譜圖像(頻域圖像)的左上角

image-20220604151713378

為了便于觀察,通常會使用numpy.fft.fftshift()函數(shù)將零頻率成分移動到頻域圖像的中心位置。

函數(shù)numpy.fft.fftshift()的語法格式是:

返回值=numpy.fft.fftshift(原始頻譜) 

使用該函數(shù)處理后,圖像頻譜中的零頻率分量會被移到頻域圖像的中心位置,對于觀察傅里葉變換后頻譜中的零頻率部分非常有效。

對圖像進行傅里葉變換后,得到的是一個復數(shù)數(shù)組。

為了顯示為圖像,需要將它們的值調整到[0, 255]的灰度空間內,使用的公式為:

像素新值=20*np.log(np.abs(頻譜值))

用Numpy實現(xiàn)傅里葉變換,觀察得到的頻譜圖像。

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() 

image-20220604152158301

實現(xiàn)逆傅里葉變換

注意: 如果在傅里葉變換過程中使用了numpy.fft.fftshift()函數(shù)移動零頻率分量,那么在逆傅里葉變換過程中,需要先使用numpy.fft.ifftshift()函數(shù)將零頻率分量移到原來的位置,再進行逆傅里葉變換

函數(shù)numpy.fft.ifftshift()是numpy.fft.fftshift()的逆函數(shù),其語法格式為:

調整后的頻譜 = numpy.fft.ifftshift(原始頻譜)

numpy.fft.ifft2()函數(shù)可以實現(xiàn)逆傅里葉變換,返回空域復數(shù)數(shù)組。

它是numpy.fft.fft2()的逆函數(shù),該函數(shù)的語法格式為:

返回值=numpy.fft.ifft2(頻域數(shù)據(jù))

函數(shù)numpy.fft.ifft2()的返回值仍舊是一個復數(shù)數(shù)組(complex ndarray)。

逆傅里葉變換得到的空域信息是一個復數(shù)數(shù)組,需要將該信息調整至[0, 255]灰度空間內,使用的公式為:

iimg = np.abs(逆傅里葉變換結果)

在Numpy內實現(xiàn)傅里葉變換、逆傅里葉變換,觀察逆傅里葉變換的結果圖像。

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()

image-20220604152633404

高通濾波示例

一幅圖像內,同時存在著高頻信號和低頻信號。

  • 低頻信號對應圖像內變化緩慢的灰度分量。例如,在一幅大草原的圖像中,低頻信號對應著顏色趨于一致的廣袤草原。
  • 高頻信號對應圖像內變化越來越快的灰度分量,是由灰度的尖銳過渡造成的。如果在上面的大草原圖像中還有一頭獅子,那么高頻信號就對應著獅子的邊緣等信息。

濾波器能夠允許一定頻率的分量通過或者拒絕其通過,按照其作用方式可以劃分為低通濾波器和高通濾波器。

  • 允許低頻信號通過的濾波器稱為低通濾波器。低通濾波器使高頻信號衰減而對低頻信號放行,會使圖像變模糊。
  • 允許高頻信號通過的濾波器稱為高通濾波器。高通濾波器使低頻信號衰減而讓高頻信號通過,將增強圖像中尖銳的細節(jié),但是會導致圖像的對比度降低。

傅里葉變換可以將圖像的高頻信號和低頻信號分離。

通過對圖像的頻域處理,可以實現(xiàn)圖像增強、圖像去噪、邊緣檢測、特征提取、壓縮和加密等操作。

在Numpy內對圖像進行傅里葉變換,得到其頻域圖像。然后,在頻域內將低頻分量的值處理為0,實現(xiàn)高通濾波。最后,對圖像進行逆傅里葉變換,得到恢復的原始圖像。

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() 

image-20220604153041900

OpenCV實現(xiàn)傅里葉變換

OpenCV提供了函數(shù)cv2.dft()和cv2.idft()來實現(xiàn)傅里葉變換和逆傅里葉變換

實現(xiàn)傅里葉變換

函數(shù)cv2.dft()的語法格式為:

返回結果=cv2.dft(原始圖像,轉換標識)

在使用該函數(shù)時,需要注意參數(shù)的使用規(guī)范:

  • 對于參數(shù)“原始圖像”,要首先使用np.float32()函數(shù)將圖像轉換成np.float32格式。
  • “轉換標識”的值通常為“cv2.DFT_COMPLEX_OUTPUT”,用來輸出一個復數(shù)陣列。

函數(shù)cv2.dft()返回的結果與使用Numpy進行傅里葉變換得到的結果是一致的,但是它返回的值是雙通道的,第1個通道是結果的實數(shù)部分,第2個通道是結果的虛數(shù)部分。

經過函數(shù)cv2.dft()的變換后,得到了原始圖像的頻譜信息。

此時,零頻率分量并不在中心位置,為了處理方便需要將其移至中心位置,可以用函數(shù)numpy.fft.fftshift()實現(xiàn)。

例如,如下語句將頻譜圖像dft中的零頻率分量移到頻譜中心,得到了零頻率分量位于中心的頻譜圖像dftshift。

dftShift = np.fft.fftshift(dft) 

經過上述處理后,頻譜圖像還只是一個由實部和虛部構成的值。要將其顯示出來,還要做進一步的處理才行。

函數(shù)cv2.magnitude()可以計算頻譜信息的幅度。該函數(shù)的語法格式為:

返回值=cv2.magnitude(參數(shù)1,參數(shù)2)
  • 參數(shù)1:浮點型x坐標值,也就是實部。
  • 參數(shù)2:浮點型y坐標值,也就是虛部,它必須和參數(shù)1具有相同的size

函數(shù)cv2.magnitude()的返回值是參數(shù)1和參數(shù)2的平方和的平方根,公式為:

image-20220604153537762

得到頻譜信息的幅度后,通常還要對幅度值做進一步的轉換,以便將頻譜信息以圖像的形式展示出來。簡單來說,就是需要將幅度值映射到灰度圖像的灰度空間[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])) #兩個參數(shù),需要拆分通道print(result) 

用OpenCV函數(shù)對圖像進行傅里葉變換,并展示其頻譜信息。

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() 

實現(xiàn)逆傅里葉變換

在OpenCV中,使用函數(shù)cv2.idft()實現(xiàn)逆傅里葉變換,該函數(shù)是傅里葉變換函數(shù)cv2.dft()的逆函數(shù)。其語法格式為:

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

對圖像進行傅里葉變換后,通常會將零頻率分量移至頻譜圖像的中心位置。如果使用函數(shù)numpy.fft.fftshift()移動了零頻率分量,那么在進行逆傅里葉變換前,要使用函數(shù)numpy.fft.ifftshift()將零頻率分量恢復到原來位置。

注意: 在進行逆傅里葉變換后,得到的值仍舊是復數(shù),需要使用函數(shù)cv2.magnitude()計算其幅度。

用OpenCV函數(shù)對圖像進行傅里葉變換、逆傅里葉變換,并展示原始圖像及經過逆傅里葉變換后得到的圖像。

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() 

低通濾波示例

在一幅圖像內,低頻信號對應圖像內變化緩慢的灰度分量。圖像進行低通濾波后會變模糊。

image-20220604154405895

實現(xiàn)的中間步驟

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 

然后,將其與頻譜圖像進行運算,實現(xiàn)低通濾波。這里采用的運算形式是:

fShift = dftShift*mask

使用函數(shù)cv2.dft()對圖像進行傅里葉變換,得到其頻譜圖像。然后,在頻域內將其高頻分量的值處理為0,實現(xiàn)低通濾波。最后,對圖像進行逆傅里葉變換,得到恢復的原始圖像。

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() 

image-20220604154752683

經過低通濾波后,圖像的邊緣信息被削弱了。

時域卷積 --> 頻域乘積

到此這篇關于opencv 傅里葉變換的實現(xiàn)的文章就介紹到這了,更多相關opencv 傅里葉變換內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python中l(wèi)ogging.NullHandler 的使用教程

    Python中l(wèi)ogging.NullHandler 的使用教程

    這篇文章主要介紹了Python中l(wèi)ogging.NullHandler 的使用教程,非常不錯,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2018-11-11
  • Python中求對數(shù)方法總結

    Python中求對數(shù)方法總結

    這篇文章主要介紹了Python中求對數(shù)方法總結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • Python遞歸函數(shù)特點及原理解析

    Python遞歸函數(shù)特點及原理解析

    這篇文章主要介紹了Python遞歸函數(shù)特點及原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • 關于pycharm找不到MySQLdb模塊的解決方法

    關于pycharm找不到MySQLdb模塊的解決方法

    MySQLdb是用于Python鏈接Mysql數(shù)據(jù)庫的接口,它實現(xiàn)了Python數(shù)據(jù)庫API規(guī)范V2.0,基于MySql C API上建立的,本文給大家介紹pycharm找不到MySQLdb模塊解決方法,需要的朋友參考下吧
    2021-06-06
  • Pytorch的安裝過程之pip、conda、Docker容器安裝

    Pytorch的安裝過程之pip、conda、Docker容器安裝

    PyTorch是一個基于Python的開源深度學習框架,可用于訓練和預測深度學習模型,PyTorch支持多種安裝方法,這篇文章主要介紹了Pytorch的安裝----pip、conda、Docker容器,需要的朋友可以參考下
    2023-04-04
  • Django 實現(xiàn)下載文件功能的示例

    Django 實現(xiàn)下載文件功能的示例

    這篇文章主要介紹了Django 實現(xiàn)下載文件功能的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • 15個最近才知道的Python實用操作

    15個最近才知道的Python實用操作

    這篇文章主要和大家分享了15個最近才知道的Python實用操作,文中的示例代碼講解詳細,對我們深入了解Python有一定的幫助,感興趣的小伙伴可以了解一下
    2023-04-04
  • Python實現(xiàn)常見的4種坐標互相轉換

    Python實現(xiàn)常見的4種坐標互相轉換

    主流被使用的地理坐標系并不統(tǒng)一,常用的有WGS84、GCJ02(火星坐標系)、BD09(百度坐標系)以及百度地圖中保存矢量信息的web墨卡托,本文利用Python編寫相關類以實現(xiàn)4種坐標系統(tǒng)之間的互相轉換,希望對大家有所幫助
    2023-02-02
  • Python使用asyncio處理異步編程的代碼示例

    Python使用asyncio處理異步編程的代碼示例

    在 Python 中,異步編程可以使用 asyncio 庫,該庫提供了一些工具和功能來編寫異步代碼,本文介紹了處理異步編程的幾個關鍵概念和示例,需要的朋友可以參考下
    2024-07-07
  • Python操作PDF圖片的基本方法(增刪改查)

    Python操作PDF圖片的基本方法(增刪改查)

    PDF文件中的圖片可以豐富文檔內容,提升用戶的閱讀體驗,除了在PDF中添加圖片外,有時也需要替換或刪除其中的圖片,文本將提供三個示例,介紹如何使用Python?操作PDF文件中的圖片,需要的朋友可以參考下
    2024-04-04

最新評論

杭州市| 邯郸县| 波密县| 沙坪坝区| 土默特左旗| 喀什市| 彭州市| 衡南县| 望都县| 漳浦县| 南京市| 马山县| 罗城| 津南区| 遂溪县| 渝中区| 集安市| 长治市| 武乡县| 板桥市| 梨树县| 元氏县| 米林县| 咸丰县| 调兵山市| 如皋市| 沾化县| 东光县| 灵台县| 汝城县| 运城市| 凯里市| 黄山市| 平山县| 茌平县| 平安县| 三门峡市| 溧水县| 永新县| 南涧| 辰溪县|