OpenCV學習筆記 四

2021-10-24 13:21:44 字數 3324 閱讀 3958

離散傅利葉變換原理:

把一張分解成正弦和余弦兩個部分,空間域轉換到頻域

傅利葉變換的理論就是任意函式都可以表示成無數個正弦和余弦函式的和的部分。

空間域是實數,頻域分解後是複數,因此變換後有實數影象,虛數影象(幅度影象,虛數影象)

逆傅利葉變化的時候必須需要幅度影象和虛數影象

在頻域中,高頻代表影象細節,紋理資訊;低頻代表影象的輪廓資訊。

影象可以看做是乙個定義為二維平面上的訊號,該訊號的幅值對應於畫素的灰度(對於彩色影象則是rgb三個分量)

影象的頻率又稱為空間頻率,它反映了影象的畫素灰度在空間中變化的情況。

dft函式:對一維或二維浮點陣列進行正向或反向離散傅利葉變化

void dft(inputarray src,outputarray dst,int flags = 0,int nonezerorows = 0)

一參:輸入矩陣

二參:函式呼叫後的運算結果,其尺寸和型別取決於flags

三參:int型別的轉換識別符號,有預設值0:

#include "opencv2/core/core.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include "opencv2/highgui/highgui.hpp"

#include using namespace cv;

int main( )

; mat complexi;

merge(planes, 2, complexi);

//進行就地離散傅利葉變換

dft(complexi, complexi);

//將複數轉換為幅值,即=> log(1 + sqrt(re(dft(i))^2 + im(dft(i))^2))

split(complexi, planes); // 將多通道陣列complexi分離成幾個單通道陣列,planes[0] = re(dft(i), planes[1] = im(dft(i))

magnitude(planes[0], planes[1], planes[0]);// planes[0] = magnitude

mat magnitudeimage = planes[0];

//進行對數尺度(logarithmic scale)縮放

magnitudeimage += scalar::all(1);

log(magnitudeimage, magnitudeimage);//求自然對數

//剪下和重分布幅度圖象限

//若有奇數行或奇數列,進行頻譜裁剪

magnitudeimage = magnitudeimage(rect(0, 0, magnitudeimage.cols & -2, magnitudeimage.rows & -2));

//重新排列傅利葉影象中的象限,使得原點位於影象中心

int cx = magnitudeimage.cols/2;

int cy = magnitudeimage.rows/2;

mat q0(magnitudeimage, rect(0, 0, cx, cy)); // roi區域的左上

mat q1(magnitudeimage, rect(cx, 0, cx, cy)); // roi區域的右上

mat q2(magnitudeimage, rect(0, cy, cx, cy)); // roi區域的左下

mat q3(magnitudeimage, rect(cx, cy, cx, cy)); // roi區域的右下

//交換象限(左上與右下進行交換)

mat tmp;

q0.copyto(tmp);

q3.copyto(q0);

tmp.copyto(q3);

//交換象限(右上與左下進行交換)

q1.copyto(tmp);

q2.copyto(q1);

tmp.copyto(q2);

//歸一化,用0到1之間的浮點值將矩陣變換為可視的影象格式

normalize(magnitudeimage, magnitudeimage, 0, 1, norm_minmax);

imshow("頻譜幅值", magnitudeimage);

waitkey();

return 0;

}

程式效果圖如下:

該程式涉及的api太多,下面分別描述其功能和作用:

getoptimaldftsize:返回給定向量尺寸的傅利葉最優尺寸大小(為了提高離散傅利葉變換的執行速度)

copymakeborder:作用是擴充影象邊界

copymakeborder(srcimage, padded, 0, m - srcimage.rows, 0, n - srcimage.cols, border_constant, scalar::all(0));

一參二參,為源影象和擴充後的輸出結果切size為擴充之後的size,

三參至六參,為四個方向擴充的畫素數,這裡的0,m - srcimage.rows, 0, n - srcimage.cols,不難理解

七參:邊界型別 八參:當邊界型別取border_constant,這個引數表示邊界值

magnitude:用於計算二維向量幅值

log():計算每個陣列元素絕對值的自然對數

normalize:進行矩陣歸一化

OpenCV 學習筆記(四)

今天學習了直方圖均衡化 histogram equalization 的方法,用於增強影象的對比度,就是把灰度直方圖中在某個比較集中的灰度區間上的畫素點更加均衡地重新分配到全部灰度區間上的方法。實質上就是建立乙個對映,乙個單調的畫素亮度變換q t p 將輸入直方圖h p 轉換為輸出直方圖g q 具體...

opencv學習筆記(四)投影

建立垂直投影的影象 41for x 0 xwidth x 4248 49 遍歷,統計每一行有多少個值大於0的畫素 50for y 0 yheight y 5158 59 建立水平投影的影象 60for y 0 yheight y 6167 68 69 cvnamedwindow 二值影象 1 70 ...

opencv學習筆記(四) 濾波操作

模糊 void boxfilter inputarray src,輸入影象 outputarray dst,輸出影象 int ddepth,影象深度,1指原圖深度 size ksize,卷積核大小 如size 3,3 point anchor point 1,1 瞄點 被平滑的那個點 boolnor...