OpenCv3程式設計學習六

2021-10-07 14:16:40 字數 2490 閱讀 3315

dft()函式,就是對一維或者二維陣列進行正向或反向離散傅利葉變化,第乙個和第二個引數分別是輸入和輸出,第三個引數是轉換型別,第四個引數是選擇影象的行數。

getoptimaldftsize()函式是返回dft的最優尺寸大小,只有乙個代表向量尺寸的引數。

copymakerborder()函式的作用是擴充影象邊界,首先兩個引數是輸入和輸出的影象,然後四個引數是表示四個方向擴充套件出來的畫素邊界。

magnitude()函式,是用來計算二維向量的幅值,前面兩個引數是向量的實部和虛部,第三個引數是輸出的幅值。

log()函式,用來計算自然對數,第乙個是輸入影象的引數,第二個是得到的對數值。

normalize()函式,矩陣歸一化函式,分別的引數就是輸入影象和輸出影象,並且還有一些輸入的值

離散傅利葉變換的具體步驟:

1.讀入以灰度化為原型的影象

2.將影象擴大到合適的尺寸,使用getoptimaldftsize() 來返回最佳尺寸,使用copymakeborder()來填充邊緣畫素

3.再將傅利葉變化儲存空間

4.也是呼叫傅利葉函式,將同乙個影象進行變化

5.使用**將複數轉化為幅值

6.使用對數尺寸來替換線性尺寸,為凸顯螢幕的高低變化

7.修整幅度影象限,為了讓原點能在影象的中心

8.為了提高顯示,進行歸一處理

9.最後將結果顯示出來

#include #include #include #includeusing namespace cv;

int main()

//再進行展示

imshow("原始影象", srcimage);

//showhelptext();

//然後是擴尺寸

int m = getoptimaldftsize(srcimage.rows);

int n = getoptimaldftsize(srcimage.cols);

//將新增的畫素初始化為0

mat padded;

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

//將傅利葉的結果進行分配儲存。建立的乙個新陣列來進行合併

mat planes = ;

mat complexi;

merge(planes, 2, complexi);

//再進行就地傅利葉變換

dft(complexi, complexi);

//再講複數轉換為幅值

split(complexi, planes);//這個函式的作用是將complexi分隔成好幾個單通道陣列

//計算二維向量的幅度

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

mat magnitudeimage = planes[0];

//然後再進行對數的縮放

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

mat q1(magnitudeimage, rect(cx, 0, cx, cy));

mat q2(magnitudeimage, rect(0, cy, cx, cy));

mat q3(magnitudeimage, rect(cx, cy, cx, cy));

//再建立乙個變數

mat tmp;

q0.copyto(tmp);

q3.copyto(q0);

tmp.copyto(q3);

//都是在交換象限

q1.copyto(tmp);

q2.copyto(q1);

tmp.copyto(q2);

//進行歸一化,將浮點值換成可視的影象格式

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

//最後將結果顯示

imshow("頻譜顯示", magnitudeimage);

waitkey();

return 0;

}

OpenCv3程式設計學習一

之前學習的時候有裝過opencv,版本是3.4.而對應的visual studio是2017版本。所以直接開始建立了控制台專案,命名為2020.620.放在了d盤的vs opencvdemo 配置是vc15 大部分參考自 需要注意的是 首先關於的路徑名,可以是相對路徑,也就是存放在當前目錄下 也就是...

OpenCv3程式設計學習十一

1.仿射變換 又稱仿射對映,意思就是在幾何空間中,乙個向量空間進行一次線性變換並接上乙個平移,變換為另乙個向量空間的過程。它保持了二維影象的 平直性 和 平行性 仿射變換可以當做是乘以乙個矩陣,也就是線性變換,再加上乙個向量 平移 的形式。通常有三種變換方式 1.旋轉 2.平移 3.縮放 warpa...

OpenCv3程式設計學習十二

直方圖均衡化 這就是通過拉伸畫素強度分布範圍來增強影象對比度的一種方法。但是均衡化處理後的影象只能是近似均勻分布,均衡化影象的動態範圍擴大了。本質就是擴大量化間隔同時減少了量化級別,所以一些灰度不同的畫素可能會變的相同,最重要的是,均衡化後的如果再對其均衡化,則不會有任何變化 equalizehis...