国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

OpenCV-Python中的圖像處理-傅里葉變換

這篇具有很好參考價值的文章主要介紹了OpenCV-Python中的圖像處理-傅里葉變換。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

傅里葉變換

  • 傅里葉變換經(jīng)常被用來分析不同濾波器的頻率特性。我們可以使用 2D 離散傅里葉變換 (DFT) 分析圖像的頻域特性。實現(xiàn) DFT 的一個快速算法被稱為快速傅里葉變換( FFT)。
  • 對于一個正弦信號:x (t) = A sin (2πft), 它的頻率為 f,如果把這個信號轉(zhuǎn)到它的頻域表示,我們會在頻率 f 中看到一個峰值。如果我們的信號是由采樣產(chǎn)生的離散信號組成,我們會得到類似的頻譜圖,只不過前面是連續(xù)的,現(xiàn)在是離散。你可以把圖像想象成沿著兩個方向采集的信號。所以對圖像同時進行 X 方向和 Y 方向的傅里葉變換,我們就會得到這幅圖像的頻域表示(頻譜圖)。
  • 對于一個正弦信號,如果它的幅度變化非常快,我們可以說他是高頻信號,如果變化非常慢,我們稱之為低頻信號。你可以把這種想法應用到圖像中,圖像那里的幅度變化非常大呢?邊界點或者噪聲。所以我們說邊界和噪聲是圖像中的高頻分量(注意這里的高頻是指變化非??欤浅霈F(xiàn)的次數(shù)多)。如果沒有如此大的幅度變化我們稱之為低頻分量。

Numpy中的傅里葉變換

Numpy 中的 FFT 包可以幫助我們實現(xiàn)快速傅里葉變換。函數(shù) np.fft.fft2() 可以對信號進行頻率轉(zhuǎn)換,輸出結果是一個復雜的數(shù)組。本函數(shù)的第一個參數(shù)是輸入圖像,要求是灰度格式。第二個參數(shù)是可選的, 決定輸出數(shù)組的大小。輸出數(shù)組的大小和輸入圖像大小一樣。如果輸出結果比輸入圖像大,輸入圖像就需要在進行 FFT 前補0。如果輸出結果比輸入圖像小的話,輸入圖像就會被切割。
f = np.fft.fft2(img)
現(xiàn)在我們得到了結果,頻率為 0 的部分(直流分量)在輸出圖像的左上角。如果想讓它(直流分量)在輸出圖像的中心,我們還需要將結果沿兩個方向平移 N/2 。函數(shù) np.fft.fftshift() 可以幫助我們實現(xiàn)這一步。(這樣更容易分析)。進行完頻率變換之后,我們就可以構建振幅譜了。
fshift = np.fft.fftshift(f)

import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('./resource/opencv/image/messi5.jpg', cv2.IMREAD_GRAYSCALE)
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('Input Image')
plt.subplot(122), plt.imshow(magnitude_spectrum, cmap='gray'), plt.title('Magnitude Spectrum')
plt.show()

OpenCV-Python中的圖像處理-傅里葉變換,OpenCV Python,python,opencv,圖像處理
我們可以看到輸出結果的中心部分更白(亮),這說明低頻分量更多。

Numpy中的傅里葉逆變換

  • 對圖像進行FFT變換之后得到頻域圖像數(shù)據(jù),然后再做IFFT變換又可以得到原始圖像。相關函數(shù):np.fft.ifftshift(),np.fft.ifft2()
    fishift = np.fft.ifftshift(fshift)
    img_ifft = np.fft.ifft2(fishift)
  • 我們可以對頻域圖像數(shù)據(jù)進行操作以實現(xiàn)一些圖像處理效果,如在頻域內(nèi)將低頻分量的值設為0,可以實現(xiàn)對圖像的高通濾波處理:
    rows, cols = img.shape
    crow, ccol = int(rows/2) , int(cols/2)
    fshift[crow-30:crow+30, ccol-30:ccol+30] = 0
import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('./resource/opencv/image/messi5.jpg', cv2.IMREAD_GRAYSCALE)

# 1.在Numpy內(nèi)對圖像進行傅里葉變換,得到其頻域圖像
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
# 這里是構建振幅圖,顯示圖像頻譜
magnitude_spectrum = 20*np.log(np.abs(fshift))

# 2.IFFT 將頻域圖像還原成原始圖像,這里只是驗證FFT的逆運算
fishift = np.fft.ifftshift(fshift)
img_ifft = np.fft.ifft2(fishift)
img_ifft = np.abs(img_ifft) # 取絕對值,否則不能用imshow()來顯示圖像


# 3.在頻域內(nèi)將低頻分量的值設為0,實現(xiàn)高通濾波。
rows, cols = img.shape 
crow, ccol = int(rows/2) , int(cols/2) 
fshift[crow-30:crow+30, ccol-30:ccol+30] = 0 

# 4.對高通濾波后的圖像頻域數(shù)據(jù)進行逆傅里葉變換,得到高通濾波后圖像。
f_ishift = np.fft.ifftshift(fshift)
img_back = np.fft.ifft2(f_ishift)
img_back = np.abs(img_back) # 取絕對值,否則不能用imshow()來顯示圖像
# 構建高通濾波后的振幅圖,顯示圖像頻譜
after_sepctrum = 20*np.log(np.abs(fshift))


plt.subplot(231), plt.imshow(img, cmap='gray'), plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(232), plt.imshow(magnitude_spectrum, cmap='gray'), plt.title('Input Image Spectrum'), plt.xticks([]), plt.yticks([])
plt.subplot(233), plt.imshow(img_ifft, cmap='gray'), plt.title('Input IFFT'), plt.xticks([]), plt.yticks([])
plt.subplot(234), plt.imshow(after_sepctrum, cmap='gray'), plt.title('After HPF Spectrum'), plt.xticks([]), plt.yticks([])
plt.subplot(235), plt.imshow(img_back, cmap='gray'), plt.title('Image after HPF'), plt.xticks([]), plt.yticks([])
plt.subplot(236), plt.imshow(img_back), plt.title('Result in JET'), plt.xticks([]), plt.yticks([])
plt.show()

OpenCV-Python中的圖像處理-傅里葉變換,OpenCV Python,python,opencv,圖像處理

OpenCV中的傅里葉變換

OpenCV 中相應的函數(shù)是 cv2.dft() 和 cv2.idft()。和前面輸出的結果一樣,但是是雙通道的。第一個通道是結果的實數(shù)部分,第二個通道是結果的虛數(shù)部分。輸入圖像要首先轉(zhuǎn)換成 np.float32 格式。

import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('./resource/opencv/image/messi5.jpg', cv2.IMREAD_GRAYSCALE)

dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)

magnitude_spectrum = 20*np.log(cv2.magnitude(dft_shift[:,:,0], dft_shift[:,:,1]))

plt.subplot(121), plt.imshow(img, cmap='gray'), plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(magnitude_spectrum, cmap='gray'), plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()

OpenCV-Python中的圖像處理-傅里葉變換,OpenCV Python,python,opencv,圖像處理

OpenCV中的傅里葉逆變換

前面的部分我們實現(xiàn)了一個 HPF(高通濾波)高通濾波其實是一種邊界檢測操作。現(xiàn)在我們來做 LPF(低通濾波)將高頻部分去除。其實就是對圖像進行模糊操作。首先我們需要構建一個掩模,與低頻區(qū)域?qū)牡胤皆O置為 1, 與高頻區(qū)域?qū)牡胤皆O置為 0。

import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('./resource/opencv/image/messi5.jpg', cv2.IMREAD_GRAYSCALE)
# 1.OpenCV中做DFT
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)

rows, cols = img.shape
crow, ccol = int(rows/2), int(cols/2)

# create a mask first, center square is 1, remaining all zeros
mask = np.zeros((rows, cols, 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1

# apply mask and inverse DFT
fshift = dft_shift*mask
f_ishift = np.fft.ifftshift(fshift)
img_back = cv2.idft(f_ishift)
img_back = cv2.magnitude(img_back[:,:,0], img_back[:,:,1])

plt.subplot(121), plt.imshow(img, cmap='gray'), plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(img_back, cmap='gray'), plt.title('Output Image'), plt.xticks([]), plt.yticks([])
plt.show()

OpenCV-Python中的圖像處理-傅里葉變換,OpenCV Python,python,opencv,圖像處理

DFT的性能優(yōu)化

  • 當數(shù)組的大小為某些值時 DFT 的性能會更好。當數(shù)組的大小是 2 的指數(shù)時 DFT 效率最高。當數(shù)組的大小是 2, 3, 5 的倍數(shù)時效率也會很高。所以如果你想提高代碼的運行效率時,你可以修改輸入圖像的大?。ㄑa 0)。對于OpenCV 你必須自己手動補 0。但是 Numpy,你只需要指定 FFT 運算的大小,它會自動補 0。
  • OpenCV 提供了一個函數(shù):cv2.getOptimalDFTSize()來確定最佳大小。它可以同時被 cv2.dft() 和 np.fft.fft2() 使用。
import numpy as np
import cv2

img = cv2.imread('./resource/opencv/image/messi5.jpg', cv2.IMREAD_GRAYSCALE)
rows,cols = img.shape
print('原始圖像大小:',rows, cols)
nrows = cv2.getOptimalDFTSize(rows)
ncols = cv2.getOptimalDFTSize(cols)
print('DFT最佳大小:',nrows, ncols)

原始圖像大小: 342 548
DFT最佳大小: 360 576

import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('./resource/opencv/image/messi5.jpg', cv2.IMREAD_GRAYSCALE)
rows,cols = img.shape
print('原始圖像大小:',rows, cols)
nrows = cv2.getOptimalDFTSize(rows)
ncols = cv2.getOptimalDFTSize(cols)
print('DFT最佳大小:',nrows, ncols)

# Numpy數(shù)組操作,原圖擴大到最佳DFT size
nimg = np.zeros((nrows, ncols))
nimg [:rows, :cols] = img

# 
right = ncols - cols
bottom = nrows - rows
# just to avoid line breakup in PDF file
mimg = cv2.copyMakeBorder(img, 0, bottom, 0, right, cv2.BORDER_CONSTANT, value=0)


plt.subplot(231), plt.imshow(img, cmap='gray')
plt.subplot(232), plt.imshow(nimg, cmap='gray')
plt.subplot(233), plt.imshow(mimg, cmap='gray')
plt.show()

OpenCV-Python中的圖像處理-傅里葉變換,OpenCV Python,python,opencv,圖像處理

不同濾波算子傅里葉變換對比

為什么拉普拉斯算子是高通濾波器?為什么 Sobel 是 HPF?等等。對于第一個問題的答案我們以傅里葉變換的形式給出。我們一起來對不同的算子進行傅里葉變換并分析它們:

import numpy as np
import cv2
from matplotlib import pyplot as plt

# simple averaging filter whitout scaling parameter
mean_filter = np.ones((3,3))

# creating a guassian filter
x = cv2.getGaussianKernel(5, 10)
# x.T 為矩陣轉(zhuǎn)置
gaussian = x*x.T

# different edge detecting filters
# scharr in x-direction
scharr = np.array([[-3, 0, 3],
                [-10, 0, 10],
                [-3, 0, 3]])

# sobel in x direction
sobel_x = np.array([[-1, 0, 1],
                [-2, 0, 2],
                [-1, 0, 1]])

# sobel in y direction
sobel_y = np.array([[-1, -2, -1], 
                [0, 0, 0], 
                [1, 2, 1]])

# laplacian
laplacian = np.array([[0, 1, 0], 
                [1, -4, 1],
                [0, 1, 0]])

filters = [mean_filter, gaussian, laplacian, sobel_x, sobel_y, scharr]
filter_name = ['mean_filter', 'gaussian', 'laplacian', 'sobel_x', 'sobel_y', 'scharr_x']

fft_filters = [np.fft.fft2(x) for x in filters]
fft_shift = [np.fft.fftshift(y) for y in fft_filters]
mag_spectrum = [np.log(np.abs(z)+1) for z in fft_shift]

for i in range(6):
    plt.subplot(2,3,i+1), plt.imshow(mag_spectrum[i], cmap='gray')
    plt.title([filter_name[i]]), plt.xticks([]), plt.yticks([])
plt.show()

OpenCV-Python中的圖像處理-傅里葉變換,OpenCV Python,python,opencv,圖像處理文章來源地址http://www.zghlxwxcb.cn/news/detail-652454.html

到了這里,關于OpenCV-Python中的圖像處理-傅里葉變換的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Python-OpenCV中的圖像處理-傅里葉變換

    Python-OpenCV中的圖像處理-傅里葉變換

    傅里葉變換經(jīng)常被用來分析不同濾波器的頻率特性。我們可以使用 2D 離散傅里葉變換 (DFT) 分析圖像的頻域特性。實現(xiàn) DFT 的一個快速算法被稱為快速傅里葉變換( FFT)。 對于一個正弦信號:x (t) = A sin (2πft), 它的頻率為 f,如果把這個信號轉(zhuǎn)到它的頻域表示,我們會在頻率

    2024年02月12日
    瀏覽(22)
  • OpenCV-Python中的圖像處理-GrabCut算法交互式前景提取

    OpenCV-Python中的圖像處理-GrabCut算法交互式前景提取

    cv2.grabCut(img: Mat, mask: typing.Optional[Mat], rect, bgdModel, fgdModel, iterCount, mode=…) img:輸入圖像 mask:掩模圖像,用來確定那些區(qū)域是背景,前景,可能是前景/背景等。 可以設置為: cv2.GC_BGD,cv2.GC_FGD,cv2.GC_PR_BGD,cv2.GC_PR_FGD,或者直接輸入 0,1,2,3 也行。 rect :包含前景的矩形,格式為

    2024年02月12日
    瀏覽(21)
  • OpenCV-Python學習(10)—— OpenCV 圖像二值化處理(cv.threshold)

    OpenCV-Python學習(10)—— OpenCV 圖像二值化處理(cv.threshold)

    1. 學習目標 理解圖像的分類,不同類型的圖像的區(qū)別; 對圖像進行二值化處理,對【 cv.threshold 】函數(shù)的理解。 2. 圖像分類 2.1 不同類型圖像說明 按照顏色對圖像進行分類,可以分為二值圖像、灰度圖像和彩色圖像。 二值圖像: 只有黑色和白色兩種顏色的圖像。 每個像素

    2024年02月03日
    瀏覽(103)
  • 數(shù)字圖像處理(實踐篇)二十九 OpenCV-Python在圖像中檢測矩形、正方形和三角形的實踐

    數(shù)字圖像處理(實踐篇)二十九 OpenCV-Python在圖像中檢測矩形、正方形和三角形的實踐

    目錄 1 方案 2 實踐 1 方案 ①檢測矩形和正方形 ⒈檢測圖像中的所有輪廓。 ⒉循環(huán)檢查所有檢測到的輪廓。 ⒊為每個輪廓找到近似的輪廓。如果近似輪廓中的頂點數(shù)為4,則計算 寬高比 用來區(qū)分 矩形 和 正方形 。如果寬高比在0.9到1.1之間,則認為為正方形,否則的話,則為

    2024年01月25日
    瀏覽(99)
  • OpenCV圖像處理之傅里葉變換

    OpenCV圖像處理之傅里葉變換

    傅里葉變換: 目的就是得到圖像的低頻和高頻,然后針對低頻和高頻進行不同的處理。處理完之后,在通過逆變換恢復到圖像,這時候?qū)Φ皖l和高頻的處理就會反映到圖像上。 頻率 高頻:變化劇烈的灰度分量,例如邊界。 低頻:變化緩慢的灰度分量,例如一天藍天(相似的

    2024年02月06日
    瀏覽(28)
  • Python-OpenCV中的圖像處理-圖像平滑

    Python-OpenCV中的圖像處理-圖像平滑

    使用低通濾波器可以達到圖像模糊的目的。這對與去除噪音很有幫助。其實就是去除圖像中的高頻成分(比如:噪音,邊界)。所以邊界也會被模糊一點。(當然,也有一些模糊技術不會模糊掉邊界)。 這是由一個歸一化卷積框完成的。他只是用卷積框覆蓋區(qū)域所有像素的平

    2024年02月13日
    瀏覽(23)
  • Python-OpenCV中的圖像處理-圖像梯度

    Python-OpenCV中的圖像處理-圖像梯度

    圖像梯度,圖像邊界等 使用到的函數(shù)有: cv2.Sobel(), cv2.Scharr(), cv2.Laplacian() 等 原理:梯度簡單來說就是求導。OpenCV 提供了三種不同的梯度濾波器,或者說高通濾波器: Sobel,Scharr 和 Laplacian。Sobel, Scharr 其實就是求一階或二階導數(shù)。 Scharr 是對 Sobel(使用小的卷積核求解

    2024年02月13日
    瀏覽(99)
  • Python-OpenCV中的圖像處理-圖像輪廓

    Python-OpenCV中的圖像處理-圖像輪廓

    輪廓可以簡單認為成將連續(xù)的點(連著邊界)連在一起的曲線,具有相同的顏色或者灰度。輪廓在形狀分析和物體的檢測和識別中很有用。 為了更加準確,要使用二值化圖像。在尋找輪廓之前,要進行閾值化處理或者 Canny 邊界檢測。 查找輪廓的函數(shù)會修改原始圖像。如果你

    2024年02月13日
    瀏覽(29)
  • Python-OpenCV中的圖像處理-圖像閥值

    Python-OpenCV中的圖像處理-圖像閥值

    與名字一樣,這種方法非常簡單。但像素值高于閾值時,我們給這個像素賦予一個新值(可能是白色),否則我們給它賦予另外一種顏色(也許是黑色)。這個函數(shù)就是 cv2.threshhold()。這個函數(shù)的第一個參數(shù)就是原圖像,原圖像應該是灰度圖。第二個參數(shù)就是用來對像素值進

    2024年02月13日
    瀏覽(19)
  • Python-OpenCV中的圖像處理-圖像直方圖

    Python-OpenCV中的圖像處理-圖像直方圖

    通過直方圖你可以對整幅圖像的灰度分布有一個整體的了解。直方圖的 x 軸是灰度值( 0 到 255), y 軸是圖片中具有同一個灰度的點的數(shù)目。 BINS:上面的直方圖顯示了每個灰度值對應的像素數(shù)。如果像素值為 0到255,你就需要 256 個數(shù)來顯示上面的直方圖。但是,如果你不需

    2024年02月12日
    瀏覽(32)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包