【OpenCV】圖像轉換

理論

傅立葉變換用于分析各種濾波器的頻率特性。對于圖像,使用?2D離散傅里葉變換(DFT)?查找頻域。快速算法稱為?快速傅立葉變換(FFT)?用于計算DFT。

Numpy中的傅立葉變換

首先,我們將看到如何使用Numpy查找傅立葉變換。Numpy具有FFT軟件包來執行此操作。np.fft.fft2()?為我們提供了頻率轉換,它將是一個復雜的數組。它的第一個參數是輸入圖像,即灰度圖像。第二個參數是可選的,它決定輸出數組的大小。如果它大于輸入圖像的大小,則在計算FFT之前用零填充輸入圖像。如果小于輸入圖像,將裁切輸入圖像。如果未傳遞任何參數,則輸出數組的大小將與輸入的大小相同。

現在,一旦獲得結果,零頻率分量(DC分量)將位于左上角。如果要使其居中,只需通過函數?np.fft.fftshift()?即可完成。(它更容易分析)。找到頻率變換后,就可以找到幅度譜。

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('messi5.jpg',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('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()

結果如下:

fft1.jpg

可以在中心看到更多白色區域,這表明低頻內容更多。

因此,您已經進行了頻率變換,您可以在頻域中執行一些操作,例如高通濾波和重建圖像,若進行逆DFT。為此,您需用尺寸為60x60的矩形窗口遮罩來消除低頻。然后,使用?np.fft.ifftshift()?應用反向移位,以使DC分量再次出現在左上角。然后使用?np.ifft2()?函數找到逆FFT 。同樣,結果將是一個復數。

rows, cols = img.shape
crow,ccol = rows//2 , cols//2
fshift[crow-30:crow+31, ccol-30:ccol+31] = 0
f_ishift = np.fft.ifftshift(fshift)
img_back = np.fft.ifft2(f_ishift)
img_back = np.real(img_back)
plt.subplot(131),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(img_back, cmap = 'gray')
plt.title('Image after HPF'), plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(img_back)
plt.title('Result in JET'), plt.xticks([]), plt.yticks([])
plt.show()

結果如下:

fft2.jpg

結果表明高通濾波是邊緣檢測操作。

如果您仔細觀察結果,尤其是最后一張JET顏色的圖像,您會看到一些偽像(我用紅色箭頭標記的一個實例)。它在那里顯示出一些波紋狀結構,稱為?振鈴效應?。這是由我們用于遮罩的矩形窗口引起的。此蒙版轉換為正弦形狀,從而導致此問題。因此,矩形窗口不用于過濾。更好的選擇是高斯窗口。

OpenCV中的傅立葉變換

OpenCV 為此提供了功能?cv.dft()?和?cv.idft()?。它返回與以前相同的結果,但是有兩個通道。第一個通道將具有結果的實部,第二個通道將具有結果的虛部。輸入的圖像應首先轉換為np.float32?。

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('messi5.jpg',0)
dft = cv.dft(np.float32(img),flags = cv.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
magnitude_spectrum = 20*np.log(cv.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()

注意?還可以使用?cv.cartToPolar()?一次返回大小和相位

因此,現在我們必須進行逆DFT。在上一部分中,我們創建了一個HPF,這次我們將看到如何去除圖像中的高頻內容,即我們將LPF應用于圖像。實際上會使圖像模糊。為此,我們首先創建一個在低頻時具有高值(1)的蒙版,即,我們傳遞LF含量,并在HF區域傳遞0。

rows, cols = img.shape
crow,ccol = rows/2 , 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 = cv.idft(f_ishift)
img_back = cv.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('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()

查看結果:

fft4.jpg

注意?像往常一樣,OpenCV函數?cv.dft()?和?cv.idft()?比Numpy對應函數要快。但是Numpy功能更加人性化。

DFT的性能優化

對于某些陣列大小,DFT計算的性能更好。當陣列大小為2的冪時,它是最快的。大小為2、3和5的乘積的數組也得到了有效處理。因此,如果您擔心代碼的性能,可以在找到DFT之前將數組的大小修改為任何最佳大小(通過填充零)。對于OpenCV,您必須手動填充零。但是對于Numpy,您可以指定FFT計算的新大小,它將自動為您填充零。

那么我們如何找到這個最佳尺寸呢?OpenCV 為此提供了一個函數?cv.getOptimalDFTSize()?。它適用于?cv.dft()?和?np.fft.fft2()?。讓我們使用IPython magic命令timeit檢查它們的性能。

In [16]: img = cv.imread('messi5.jpg',0)
In [17]: rows,cols = img.shape
In [18]: print("{} {}".format(rows,cols))
342 548
In [19]: nrows = cv.getOptimalDFTSize(rows)
In [20]: ncols = cv.getOptimalDFTSize(cols)
In [21]: print("{} {}".format(nrows,ncols))
360 576

參見,將大小(342,548)修改為(360,576)。現在讓我們用零填充(對于OpenCV),并找到其DFT計算性能。您可以通過創建一個新的大零數組并將數據復制到其中來完成此操作,或者使用?cv.copyMakeBorder()?。

nimg = np.zeros((nrows,ncols))
nimg[:rows,:cols] = img

要么:

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

現在,我們計算Numpy函數的DFT性能比較:

In [22]: %timeit fft1 = np.fft.fft2(img)
10 loops, best of 3: 40.9 ms per loop
In [23]: %timeit fft2 = np.fft.fft2(img,[nrows,ncols])
100 loops, best of 3: 10.4 ms per loop

它顯示了4倍的加速。現在,我們將嘗試使用OpenCV函數。

In [24]: %timeit dft1= cv.dft(np.float32(img),flags=cv.DFT_COMPLEX_OUTPUT)
100 loops, best of 3: 13.5 ms per loop
In [27]: %timeit dft2= cv.dft(np.float32(nimg),flags=cv.DFT_COMPLEX_OUTPUT)
100 loops, best of 3: 3.11 ms per loop

它還顯示了4倍的加速。可以看到OpenCV函數比Numpy函數快3倍左右。

apachecn.github.io/opencv-doc-zh/#/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62584.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62584.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62584.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何使用Java編寫Jmeter函數

Jmeter 自帶有各種功能豐富的函數,可以幫助我們進行測試,但有時候提供的這些函數并不能滿足我們的要求,這時候就需要我們自己來編寫一個自定義的函數了。例如我們在測試時,有時候需要填入當前的時間,雖然我們可以使用p…

【2024版】最新kali linux入門及常用簡單工具介紹(非常詳細)從零基礎入門到精通,看完這一篇就夠了

前言 相信很多同學了解到和學習網絡安全的時候都聽過kali系統,大家都稱之為黑客最喜愛的系統,那么什么是kali,初學者用kali能做些什么,大白我將在本文中做詳細的介紹: 一、kali linux是什么? Kali Linux…

使用 electron 把 vue 項目打包成客戶端

1. 新建一個Vue項目 新建一個vue項目,或者在已經寫好的vue項目上操作 2. 安裝依賴包 需要安裝的包有2個 electron electron-builder 安裝失敗的,可看另外一篇解決方法https://blog.csdn.net/Anorry/article/details/144061069?spm1001.2014.3001.5501 3…

六大排序算法:插入排序、希爾排序、選擇排序、冒泡排序、堆排序、快速排序

本章講述數據結構中的六大排序算法 歡迎大佬們踴躍討論,感謝大家支持! 我的博客主頁鏈接 六大排序算法 一.插入排序1.1 直接插入排序1.2 希爾排序 二.選擇排序2.1 單向選擇排序2.2雙向選擇排序2.3 堆排序 三.交換排序3.1 冒泡排序3.2 快速排序3.2.1 Hoa…

el-table手動觸發懶加載

二次修改了一下,確保點擊某一單元格格元素觸發 // 隱藏懶加載箭頭后手動觸發懶加載 expandRows(scope){scope.row.isExpanded !scope.row.isExpanded // 切換展開狀態let isExpanded scope.row.isExpandedconst { table: { toggleRowExpansion, store }} this.$r…

【MySQL】數據庫 Navicat 可視化工具與 MySQL 命令行基本操作

💯 歡迎光臨清流君的博客小天地,這里是我分享技術與心得的溫馨角落 💯 🔥 個人主頁:【清流君】🔥 📚 系列專欄: 運動控制 | 決策規劃 | 機器人數值優化 📚 🌟始終保持好奇心&…

threejs相機輔助對象cameraHelper

為指定相機創建一個輔助對象,顯示這個相機的視錐。 想要在場景里面顯示相機的視錐,需要創建兩個相機。 舉個例子,場景中有個相機A,想要顯示相機A的視錐,那么需要一個相機B,把B放在A的后面,兩個…

反向代理-緩存篇

文章目錄 強緩存一、Expires(http1.0 規范)二、cache-control(http1.1 出現的 header 信息)Cache-Control 的常用選項Cache-Control 常用選項的選擇三、弊端協商緩存一、ETag二、If-None-Match三、Last-modified四、If-Modified-Since瀏覽器的三種刷新方式靜態資源部署策略…

深度學習小麥頭檢測-基于Faster-RCNN的小麥頭檢測——附項目源碼

比賽描述 為了獲得有關全世界麥田的大量準確數據,植物科學家使用“小麥頭”(包含谷物的植物上的穗)的圖像檢測。這些圖像用于估計不同品種的小麥頭的密度和大小。但是,在室外野外圖像中進行準確的小麥頭檢測可能在視覺上具有挑戰性。密集的小麥植株經常重疊,并且風會使照片…

健康管理系統(Koa+Vue3)

系統界面(源碼末尾獲取) 系統技術 Vue3 Koa Nodejs Html Css Js ....... 系統介紹 系統比較簡單,輕輕松松面對結業課堂作業.采用的是基于nodejs開發的Koa框架作為后端,采用Vue框架作為前端,完成快速開發和界面展示. 系統獲取 啊啊啊寶/KoaVue3https://gitee.com/ah-ah-b…

數據清洗代碼:缺失值,異常值,離群值Matlab處理

目錄 基本介紹程序設計參考資料基本介紹 一、過程概述 本過程適用于處理SCADA系統采集到的數據,以及具有類似需求的數據集。處理步驟包括缺失值處理、異常值處理和離群值處理,旨在提升數據質量,增強數據的相關性,同時保持數據的原始特征和隨機性。 二、缺失值處理 對于SC…

Leetcode 每日一題 202.快樂數

目錄 題意 算法思路 過題圖片 算法實現 代碼解析 復雜度分析 題目鏈接 結論 題意 判斷正整數 n 是不是快樂數。 快樂數定義: (1)每次將正整數替換為它每個位置上的數字的平方和。 (2)重復這個過程直到這個數…

【鴻蒙生態崛起】開發者如何把握機遇,應對挑戰,打造卓越應用體驗?

文章目錄 每日一句正能量前言鴻蒙簡析鴻蒙生態的認知和了解鴻蒙生態的崛起分析 鴻蒙生態下開發時遇到的挑戰開發工具不完善技術難度生態競爭抓住機遇、應對挑戰 鴻蒙生態未來的發展趨勢1. 全場景智慧生活的推動者2. 技術創新的引領者3. 開放合作的倡導者對鴻蒙生態和開發者的建…

Nignx部署Java服務測試使用的Spring Boot項目Demo

天行健,君子以自強不息;地勢坤,君子以厚德載物。 每個人都有惰性,但不斷學習是好好生活的根本,共勉! 文章均為學習整理筆記,分享記錄為主,如有錯誤請指正,共同學習進步。…

文本域設置高度 加上文字限制并show出來:

文本域設置高度 :rows"4" 加上文字限制并show出來&#xff1a; maxlength"30" show-word-limit 效果: <el-form-item label"產品備注" prop"remark"><el-input v-model"form.remark" type"textarea"…

區塊鏈軟件系統海外宣發:全球化市場中的策略與實施

隨著區塊鏈技術的快速發展&#xff0c;越來越多的區塊鏈軟件系統進入全球市場&#xff0c;涉及加密貨幣、智能合約、去中心化金融&#xff08;DeFi&#xff09;、供應鏈管理等多個行業應用。為了在激烈的競爭中脫穎而出&#xff0c;區塊鏈軟件系統不僅需要具備卓越的技術能力&a…

springboot413福泰軸承股份有限公司進銷存系統(論文+源碼)_kaic

摘 要 使用舊方法對福泰軸承股份有限公司進銷存系統的信息進行系統化管理已經不再讓人們信賴了&#xff0c;把現在的網絡信息技術運用在福泰軸承股份有限公司進銷存系統的管理上面可以解決許多信息管理上面的難題&#xff0c;比如處理數據時間很長&#xff0c;數據存在錯誤不…

qiankun學習記錄

什么是微前端 微前端是指存在于瀏覽器中的微服務&#xff0c;其借鑒了微服務的架構理念&#xff0c;將微服務的概念擴展到了前端。 如果對微服務的概念比較陌生的話&#xff0c;可以簡單的理解為微前端就是將一個大型的前端應用拆分成多個模塊&#xff0c;每個微前端模塊可以…

配置中心 選型 : Apollo Vs. Nacos Vs. spring cloud config

為什么我們需要一個微服務配置中心&#xff1f; 首先&#xff0c;我們可以想象下&#xff0c;如果沒有配置中心&#xff0c;我們的項目可能是這樣的&#xff1a;不同環境的配置文件都放在項目里面&#xff0c;部署時可以通過啟動參數來指定使用哪個環境的配置。 這種方式有兩…

HarmonyOS(65) ArkUI FrameNode詳解

Node 1、Node簡介2、FrameNode2.1、創建和刪除節點2.2、對FrameNode的增刪改2.3、 FramNode的查詢功能3、demo源碼4、總結5、參考資料1、Node簡介 在HarmonyOS(63) ArkUI 自定義占位組件NodeContainer介紹了自定義節點復用的原理(閱讀本本篇博文之前,建議先讀讀這個),在No…