c_learn_2
1019
2022-05-30
3.4.4 數學函數
跟本章前面的內容不同,本節將要學習的數學計算函數和算法都不是基于元素的。它們包括簡單函數,例如均值、求和,以及更復雜的運算,例如離散傅里葉變換。讓我們通過實例瀏覽一些最重要的內容。
3.4.4.1 矩陣求逆
invert函數可用于計算矩陣的逆。不要與bitwise_not函數混淆,bitwise_not會反轉圖像像素中的每一位。invert 函數不是基于元素的函數,需要提供反轉方法作為該函數的參數。見下例:
枚舉DecompTypes包含可在invert 函數中用作為分解類型的所有條目。具體如下:
如果你對每種分解方法的詳細描述感興趣,請參閱OpenCV文檔以獲取Decomp
Types枚舉的說明。
3.4.4.2 元素的平均值及求和
你可以使用mean函數計算矩陣中元素的平均值。下面的例子顯示如何讀取圖像、計算并顯示其所有通道的平均值:
你可以用完全相同的方式使用sum函數來計算矩陣中元素的總和:
OpenCV中還有一個meanStdDev函數,用于同時計算矩陣中所有元素的平均值和標準差。下面是一個例子:
與mean函數類似,meanStdDev函數也分別計算每個通道的結果。
3.4.4.3 離散傅里葉變換
一維或二維數組(二維數組即圖像)的離散傅里葉變換,是在計算機視覺中分析圖像的眾多方式之一。結果的解釋完全取決于使用它的領域,這不是本書中的重點,但我們將在本節中學習如何進行離散傅里葉變換。
簡單地說,你可以使用dft函數來計算圖像的傅里葉變換。但是,在安全地調用dft功能之前,需要做一些準備工作,這同樣適用于傅里葉變換的結果。讓我們用一個示例代碼并通過計算和顯示之前使用過的示例圖像的傅里葉變換,來理解這個問題。
dft函數可以更有效地處理某些尺寸的矩陣(2的冪,例如2、4和8),這就是為什么在調用dft函數之前,最好將矩陣的尺寸增加到最接近的2的冪并用零填充它。這樣可以使用getOptimalDFTSize函數來完成。假設我們想要計算輸入圖像的離散傅里葉變換,可以編寫如下代碼來計算并調整其大小為dft函數的最佳大小:
如你所見,對于行和列,必須分別調用getOptimalDFTSize函數。現在,你應該已經熟悉了copyMakeBorder函數。調整圖像大小并用零(或其他值)填充新像素是copyMakeBorder函數的無數用法之一。
剩下的很簡單,我們需要形成一個雙通道圖像并將其傳遞給dft函數,并在同一個矩陣中得到復數結果(實部和虛部)。這將簡化顯示結果的過程。代碼如下:
我們學過如何使用merge函數。在前面的代碼中唯一需要注意的地方是結果與輸入保存在同一圖像中。complexImage現在包含兩個通道,分別是離散傅里葉變換結果的實部和虛部。就是這樣!我們現在得到結果了,但是為了能夠顯示它,我們必須計算結果的幅值。代碼如下:
在前面的代碼中,我們將復雜的結果拆分為通道,然后使用magnitude函數計算了其幅度。從理論上講,mag是一個可顯示的結果,但實際上,它的值遠遠高于OpenCV可以顯示的范圍,因此我們需要在顯示它之前執行幾次轉換。首先,我們需要通過執行以下轉換來確保結果采用對數量度:
接下來,我們必須確保將結果值縮放并標準化以使其介于0.0~1.0之間,以便通過OpenCV中的imshow函數顯示。因此,你需要使用normalize函數:
現在你可以嘗試使用imshow函數顯示結果了。下面是顯示離散傅里葉變換結果的示例:
該結果的問題在于,在結果的原點位于圖像的中心之前,需要交換象限。下圖描繪了在結果的中心位置之前,必須如何交換結果的四個象限:
以下是交換傅里葉變換結果的四個象限所需的代碼:首先找到結果的中心,然后創建四個感興趣區域(ROI)矩陣,然后交換它們:
dft函數接受一個附加參數用于進一步自定義其行為,此參數可以是DftFlags枚舉值的組合。例如,要執行傅里葉變換的逆變換,需要在調用dft函數時使用DFT_INVERSE參數:
這也可以通過idft函數來完成:
請查看DftFlags枚舉和dft函數文檔,以獲取有關如何在OpenCV中實現離散傅里葉變換的更多信息。
3.4.4.4 生成隨機數
隨機數生成是計算機視覺中使用最廣泛的算法之一,尤其是在用給定范圍的隨機數測試現有算法時。使用OpenCV庫時,可以使用以下函數生成隨機數或隨機數矩陣:
randn函數可以用來生成具有給定平均值和標準差的隨機數矩陣或數組。以下是此函數的使用方法:
randu函數類似于randn函數,使用隨機數填充數組,但是,此函數使用上限和下限(包括兩者)來生成隨機值,而不是均值和標準差。下面是一個例子:
randShuffle函數,從函數名就能猜出,可用于隨機重組數組或矩陣的元素。它的用法很簡單,見下例:
OpenCV
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。