OpenCV C 實現頻域理想低通濾波器

2021-09-11 07:53:11 字數 3767 閱讀 3461

1、理想低通濾波器

2、巴特沃思低通濾波器

3、高斯低通濾波器

√ 邊緣和雜訊等尖銳變化處於傅利葉變換的高 頻部分 √

平滑可以通過衰減高頻成分的範圍來實現 √

理想低通濾波器:尖銳 √

巴特沃思低通濾波器:處於理想和高斯濾波 器之間 √

高斯低通濾波器:平滑 l

理想低通濾波器 √

截斷傅利葉變換中的所有高頻成分,這些高 頻成分處於指定距離d0

之外

說明:在半徑為d

0的圓內,所有頻率沒有衰減地通過濾 波器,而在此半徑的圓之外的所有頻率完全被衰減掉

原影象:

截止頻率的半徑值=10:

截止頻率的半徑值=50:

截止頻率的半徑值=160:

**實現:

#include

#include

using namespace std;

using namespace cv;

cv::mat ideal_low_pass_filter(mat &src, float sigma);

mat ideal_lbrf_kernel(mat &scr,float sigma);

mat freqfilt(mat &scr,mat &blur);

int main( int argc, char *ar**)

//*****************理想低通濾波器***********************

mat ideal_lbrf_kernel(mat &scr,float sigma)

else}}

string name = "理想低通濾波器d0=" + std::to_string(sigma);

imshow(name, ideal_low_pass);

return ideal_low_pass;

}cv::mat ideal_low_pass_filter(mat &src, float sigma)

//*****************頻率域濾波*******************

mat freqfilt(mat &scr,mat &blur)

; //建立通道,儲存dft後的實部與虛部(cv_32f,必須為單通道數)

mat complexim;

merge(plane,2,complexim);//合併通道 (把兩個矩陣合併為乙個2通道的mat類容器)

dft(complexim,complexim);//進行傅利葉變換,結果儲存在自身

//***************中心化********************

split(complexim,plane);//分離通道(陣列分離)

//    plane[0] = plane[0](rect(0, 0, plane[0].cols & -2, plane[0].rows & -2));//這裡為什麼&上-2具體檢視opencv文件

//    //其實是為了把行和列變成偶數 -2的二進位制是11111111.......10 最後一位是0

int cx=plane[0].cols/2;int cy=plane[0].rows/2;//以下的操作是移**像  (零頻移到中心)

mat part1_r(plane[0],rect(0,0,cx,cy));  //元素座標表示為(cx,cy)

mat part2_r(plane[0],rect(cx,0,cx,cy));

mat part3_r(plane[0],rect(0,cy,cx,cy));

mat part4_r(plane[0],rect(cx,cy,cx,cy));

mat temp;

part1_r.copyto(temp);  //左上與右下交換位置(實部)

part4_r.copyto(part1_r);

temp.copyto(part4_r);

part2_r.copyto(temp);  //右上與左下交換位置(實部)

part3_r.copyto(part2_r);

temp.copyto(part3_r);

mat part1_i(plane[1],rect(0,0,cx,cy));  //元素座標(cx,cy)

mat part2_i(plane[1],rect(cx,0,cx,cy));

mat part3_i(plane[1],rect(0,cy,cx,cy));

mat part4_i(plane[1],rect(cx,cy,cx,cy));

part1_i.copyto(temp);  //左上與右下交換位置(虛部)

part4_i.copyto(part1_i);

temp.copyto(part4_i);

part2_i.copyto(temp);  //右上與左下交換位置(虛部)

part3_i.copyto(part2_i);

temp.copyto(part3_i);

//*****************濾波器函式與dft結果的乘積****************

mat blur_r,blur_i,blur;

multiply(plane[0], blur, blur_r); //濾波(實部與濾波器模板對應元素相乘)

multiply(plane[1], blur,blur_i);//濾波(虛部與濾波器模板對應元素相乘)

mat plane1=;

merge(plane1,2,blur);//實部與虛部合併

//*********************得到原**譜圖***********************************

magnitude(plane[0],plane[1],plane[0]);//獲取幅度影象,0通道為實部通道,1為虛部,因為二維傅利葉變換結果是複數

plane[0]+=scalar::all(1);  //傅利葉變換後的不好分析,進行對數處理,結果比較好看

log(plane[0],plane[0]);    // float型的灰度空間為[0,1])

normalize(plane[0],plane[0],1,0,cv_minmax);  //歸一化便於顯示

//    imshow("原影象頻譜圖",plane[0]);

idft( blur, blur);    //idft結果也為複數

split(blur,plane);//分離通道,主要獲取通道

magnitude(plane[0],plane[1],plane[0]);  //求幅值(模)

normalize(plane[0],plane[0],1,0,cv_minmax);  //歸一化便於顯示

return plane[0];//返回引數

}

空間域 頻域 高通濾波 低通濾波

最近由於深度學習做影象,要看影象處理的知識,看了幾篇部落格,本文的圖和大部分的文字均來自於那些參考的部落格,在這把知識點總結了一下 通過 觀察灰度分布來描述一幅影象 稱為空間域 觀察影象變化的頻率被 稱為頻域。頻域濾波 是在頻率域對影象做處理的一種方法。步驟如下 濾波器大小和頻譜大小相同,相乘即可得...

在OpenCV裡實現譜域低通濾波

數字影象在形成 傳輸過程中,往往因為各種因素被加入了雜訊,因此對影象進行前期處理以消除雜訊,對於影象的分析 理解等後期工作起到決定性的作用,影象的邊緣以及雜訊干擾在影象的頻域上對應於影象傅利葉變換中的高頻部分,而影象的背景區則對應於低頻部分,因此可以用頻域低通濾波法去除影象的高頻部分,以去掉雜訊從而...

關於低碳減排的2個理想化實現辦法

指望人們主動減排將成為乙個悖論 如果無法實現全社會的公平和共同減排,那麼個人做了又有什麼意義呢?我想到了2個比較理想化的解決辦法。一 分配 個人排放額度 資訊時代實現這一點倒也容易 給每位公民發放一張排放卡,無論是購物 旅行或吃飯時都要刷一下卡,看看自己用掉了多少的額度 這個額度必須在保障生態安全的...