灰度圖像--頻域濾波 濾波器
來源:程序員人生 發布時間:2015-01-24 09:07:47 閱讀次數:5054次
學習DIP第26天
轉載請標明本文出處:http://blog.csdn.net/tonyshengtan,歡迎大家轉載,發現博客被某些論壇轉載后,圖象沒法正常顯示,沒法正常表達本人觀點,對此表示很不滿意。有些網站轉載了我的博文,很開心的是自己寫的東西被更多人看到了,但不開心的是這段話被去掉了,也沒標明轉載來源,雖然這并沒有版權保護,但感覺還是不太好,出于尊重文章作者的勞動,轉載請標明出處!!!!
文章代碼已托管,歡迎共同開發:https://github.com/Tony-Tan/DIPpro
開篇空話
仍然是空話開始,濾波器的起源就是頻域來的,針對頻域特性,濾波器被設計成各種各樣的功能,但是頻域濾波器都是線性的,轉換到空域生成的卷積模板也是線性的,而有些從空域動身設計的濾波模板其實不是線性的,判斷是否是線性可使用以下判斷方法,也是信號與系統中經常使用的方法,F(ax+by)==aF(x)+bF(y)如果滿足就是線性的,不滿足則不是。常見的濾波模板中觸及到排序的,都不是線性模板,而通過頻域設計然后轉換為空域模板的,都是線性的模板。
由于濾波原理上1篇中已做了詳細的介紹,本篇主要記錄幾種常見的濾波器,并分析其濾波特點。主要介紹內容以下:

由于同態濾波的特殊性,將在下1篇中介紹,對每種濾波器,都會分析其功率和振鈴現象。
現在給出1個經常使用的距離函數,將在所有下面所有濾波器中使用,使用歐氏距離,由于頻率域的距離代表的是帶寬,所以,截止頻率,帶寬意義重大(P,Q)為頻譜大小,也是上篇中填充后的空域圖象大小,并且我們使用的頻譜都是中心化了的:

測試圖片為:

平滑-低通濾波器
低通濾波器,顧名思義,只通太低頻信號截斷高頻成份,在頻譜中,中間部份為低頻,4周為高頻,截斷點由濾波器的寬度決定,也就是截止頻率,不同的截止頻率對應于不同的效果和不同的剩余功率。
ILPF
理想低通濾波器,就是簡單的截斷,或說設置1個頻率閾值,大于閾值的頻譜置零,小于等于閾值的不變:

這個效果就是頻域的1個圓形,我們來視察,頻域截止頻率為50,P,Q為512的ILPF:

下面來視察濾波器在截止頻率為10,20,30的振鈴和頻率特性:
截止頻率10,濾波后剩余功率50.196378%,有振鈴:

截止頻率20,濾波后剩余功率78.559714%,有振鈴:

截止頻率30,濾波后剩余功率88.736089%,有振鈴:

BLPF
布特沃斯低通濾波器,采取布特沃斯公式,產生1種低階時轉折平滑,高階時轉折尖銳的濾波器:
示意圖以下:
下面視察2階和10階布特沃斯濾波器在截止頻率10,20,30時的表現:
2階:
截止頻率10,濾波后剩余功率40.044113%,無振鈴:
截止頻率20,濾波后剩余功率59.692304%,無振鈴:
截止頻率30,濾波后剩余功率70.964773%,無振鈴:
10階:
截止頻率10,濾波后剩余功率46.72560%,有振鈴:
截止頻率20,濾波后剩余功率74.527332%,有振鈴:
截止頻率30,濾波后剩余功率86.566573%,有振鈴:

GLPF
由高斯公式產生的濾波器,由于高斯的傅里葉變換還是高斯的,所以變換無振鈴效應:
濾波器示意圖:
視察高斯濾波器在截止頻率10,20,30時的表現:
截止頻率10,濾波后剩余功率45036072%,無振鈴:

截止頻率20,濾波后剩余功率66.908677%,無振鈴:

截止頻率30,濾波后剩余功率77.419008%,無振鈴:

銳化-高通濾波器
與低頻對應的就是高頻濾波器,一樣我們介紹理想高通,布特沃斯高通,高斯高通,并提出鈍化高提升高頻強調濾波器;
IHPF
理想高通的濾波器示意圖:
一樣視察截止頻率為10,20,30的濾波效果和振鈴效應:
截止頻率10,濾波后剩余功率51.407872%,有振鈴:
截止頻率20,濾波后剩余功率23.044536%,有振鈴:
截止頻率30,濾波后剩余功率12.868162%,有振鈴:
BHPF
與低通布特沃斯相似,高通布特沃斯濾波器也是1種低階時轉折平滑,高階時轉折尖銳的濾波器

我們一樣視察2階和10階的布特沃斯在截止頻率為10,20,30時的效果和振鈴現象:
2階:
截止頻率10,濾波后剩余功率34.679332%,無振鈴:

截止頻率20,濾波后剩余功率18.029713%,無振鈴:
截止頻率30,濾波后剩余功率11.967571%,無振鈴:
10階:
截止頻率10,濾波后剩余功率46.760049%,有振鈴:
截止頻率20,濾波后剩余功率20.167635%,有振鈴:
截止頻率30,濾波后剩余功率12.362897%,有振鈴:
GHPF
與低通1致,高斯高通濾波器為:
示意圖:
視察截止頻率為10,20,30的濾波效果和振鈴效應:
截止頻率10,濾波后剩余功率34.706478%,無振鈴:
截止頻率20,濾波后剩余功率16.325098%,無振鈴:
截止頻率30,濾波后剩余功率11.140692%,無振鈴:
部份代碼
低通:
#include "lowpassfilter.h"
static double Distance(int x,int y,int c_x,int c_y){
return sqrt((x-c_x)*(x-c_x)+(y-c_y)*(y-c_y));
}
void IdealLPFilter(double *Filter,int width,int height,double cut_off_frequency){
int center_x=width/2;
int center_y=height/2;
double distance=0.0;
for(int i=0;i<width;i++)
for(int j=0;j<height;j++){
distance=Distance(i,j,center_x,center_y);
if(distance<=cut_off_frequency)
Filter[j*width+i]=1.0;
else
Filter[j*width+i]=0.0;
}
}
void ButterworthLPfilter(double *Filter,int width,int height,double cut_off_frequency,int n){
int center_x=width/2;
int center_y=height/2;
for(int i=0;i<width;i++)
for(int j=0;j<height;j++){
double value=1.0;
for(int k=0;k<n;k++)
value*=(Distance(i, j, center_x, center_y)/cut_off_frequency);
Filter[j*width+i]=1/(1+value);
}
}
void GaussianLPFilter(double *Filter,int width,int height,double cut_off_frequency){
int center_x=width/2;
int center_y=height/2;
for(int i=0;i<width;i++)
for(int j=0;j<height;j++){
double value=Distance(i, j, center_x, center_y);
Filter[j*width+i]=exp(-value*value/(2*cut_off_frequency*cut_off_frequency));
}
}
高通:
#include "highpassfilter.h"
static double Distance(int x,int y,int c_x,int c_y){
return sqrt((x-c_x)*(x-c_x)+(y-c_y)*(y-c_y));
}
void IdealHPFilter(double *Filter,int width,int height,double cut_off_frequency){
int center_x=width/2;
int center_y=height/2;
double distance=0.0;
for(int i=0;i<width;i++)
for(int j=0;j<height;j++){
distance=Distance(i,j,center_x,center_y);
if(distance<=cut_off_frequency)
Filter[j*width+i]=0.0;
else
Filter[j*width+i]=1.0;
}
Filter[width*(height+1)/2]+=1.0;
}
void ButterworthHPfilter(double *Filter,int width,int height,double cut_off_frequency,int n){
int center_x=width/2;
int center_y=height/2;
for(int i=0;i<width;i++)
for(int j=0;j<height;j++){
double value=1.0;
for(int k=0;k<n;k++)
value*=(Distance(i, j, center_x, center_y)/cut_off_frequency);
Filter[j*width+i]=1.0⑴.0/(1.0+value);
}
Filter[width*(height+1)/2]+=1.0;
}
void GaussianHPFilter(double *Filter,int width,int height,double cut_off_frequency){
int center_x=width/2;
int center_y=height/2;
for(int i=0;i<width;i++)
for(int j=0;j<height;j++){
double value=Distance(i, j, center_x, center_y);
Filter[j*width+i]=1.0-exp(-value*value/(2*cut_off_frequency*cut_off_frequency));
}
Filter[width*(height+1)/2]+=1.0;
}
鈍化,高提升,高頻強調
將高通濾波后的結果與原圖進行1些加減,將得到鈍化,高提升高頻強調濾波器
對下面公式k1控制距離原點的偏移量,k2控制高頻貢獻。
- k1=1時k2=1為鈍化模板
- k1=1時k2>1為高提升濾波器
- k1=1時,統稱高頻強調濾波器
具體性質據定于所選用的濾波模板,與上面敘述的模板性質和截止頻率有關,在這里不詳細敘述。
代碼:
#include "Homomorphicfilter.h"
static double Distance(int x,int y,int c_x,int c_y){
return sqrt((x-c_x)*(x-c_x)+(y-c_y)*(y-c_y));
}
void HomorphicFilter(double *filter,int width,int height,double cut_off_frequency,double lambda_l,double lambda_h,double c){
int center_x=width/2;
int center_y=height/2;
double distance;
double distance_2;
double cut_off_frequency_2=cut_off_frequency*cut_off_frequency;
for(int i=0;i<height;i++)
for(int j=0;j<width;j++){
distance=Distance(j, i, center_x, center_y);
distance_2=distance*distance;
filter[i*width+j]=(lambda_h-lambda_l)*(1.0-exp(-c*distance_2/cut_off_frequency_2))+lambda_l;
}
}
總結
總結1下,這篇的理論在前面已介紹了,所以更多是驗證前面的結論,視察濾波效果。濾波中值得注意的是振鈴現象,對不能容忍人工缺點的利用中,如醫學圖象處理,不能使用帶有振鈴現象的濾波器,在實際物理中,理想濾波器沒法實現,所以更多的使用高斯和其他1些無振鈴的濾波器
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈