NSCT——Nonsubsampled contourlet 變換程序開發教程1_向望大海的魚

08年,被老闆逼得走投無路,xx所得項目看來是實在躲不過去,只好硬着頭皮上。開發一款圖像處理軟件,裏面內容很多,不過核心就是NSCT變換。NSCT變換06年的新東西,現在跟風研究的熱點。可惜的是作爲一種新的變換濾波器長期以來只有matlab程序,沒有VC程序。使很多算法開發不能應用到工程中,08暑假,大概花了我一個月吧,恩。。期間電腦還中了次病毒(可惡的機器狗第四代!!),終於把這個軟件搞得差不多了,現在回顧一下NSCT的程序包,下次有時間在寫點別的。


Nonsubsampled Contourlet變換算法介紹:
   對信號的稀疏表示是許多信號處理及應用的基礎,2004年Minh N Do、MartinVetterli提出了一種能夠較好表示二維信號的數學工具--Contourlet變換。Contourlet是用金字塔方向濾波器組(PDFB)來將圖像分解成不同尺度下的方向子帶的。根據PDFB的結構,PDFB是一個拉普拉斯金字塔濾波器LaplacianPyramid(LP)和一個方向濾波器組的疊加。實驗證明,Contourlet變換在圖像降噪,紋理,形狀的特徵提取方面的性能比2-D離散小波變換有了明顯的提高。
爲了獲得平移不變性,本章所用的NonsubsampledContourlet變換(NSCT)是基於Nonsubsampled金字塔(NSP)和Nonsubsampled方向濾波器(NSDFB)的一種變換。首先由NSP對輸入圖像進行塔形分解,分解爲高通和低通兩個部分,然後由NSDFB將高頻子帶分解爲多個方向子帶,低頻部分繼續進行如上分解。NSCT是一種新型平移不變,多尺度,多方向性的快速變換。
1. Nonsubsampled Pyramid(NSP):
Nonsubsampled Pyramid(NSP)和Contourlet的LaplacianPyramid(LP)多尺度分析特性不同。圖像通過NonsubsampledPyramid(NSP)進行多尺度分解,NSP去除了上採樣和下采樣,減少了採樣在濾波器中的失真,獲得了平移不變性。NSP爲具有平移不變性濾波結構的NSCT多尺度分析,可以得到與LP分解一樣的多尺度分析特性。圖2.4(a)處分爲3個尺度。
2. Nonsubsampled方向濾波器(NSDFB)
Nonsubsampled方向濾波器(NSDFB)是一個雙通道的濾波器,將分佈在同方向的奇異點合成NSCT的係數。方向濾波器(DFB)是Bambergerand Smith提出的。其通過一個l層的樹狀結構的分解,有效的將信號分成了 個子帶,其頻帶分割成爲鍥形。NonsubsampledDFB(NSDFB)爲非採樣,減少了採樣在濾波器中的失真,獲得了平移不變性。並且每個尺度下的方向子圖的的大小都和原圖同樣大小,Contourlet變換爲所有子帶之和等於原圖。NSCT有更多的細節得以保留,變換系數是冗餘的。圖2.4(b)爲三個尺度下對圖像頻域的分割圖,其中每個尺度的方向子帶數目以2倍遞增,以在1,2,3尺度下的方向子帶數目分別爲2,4,8個。

NSCT——Nonsubsampled <wbr>contourlet <wbr>變換程序開發教程1NSCT——Nonsubsampled <wbr>contourlet <wbr>變換程序開發教程1


NSCT內部變量:

下面列出程序中主要的變量和結構體定義說明:

圖像信息結構體:

typedef struct

{ int high;//-----------------------------------------圖像高度

intwidth; //---------------------------------------圖像寬度

double max;//--------------------------------------最大像素值

double min;//---------------------------------------最小像素值

double *data;//--------------------------------------像素數據區域

}ImgData;

NSCT變換空間結構體:(用於存放NSCT變換濾波器,尺度、自帶空間等基本信息)

typedef struct

{ unsigned int*nlevels;//子帶方向數必須爲偶數sublevels[0]爲最高級方向數

sublevels[4]爲最低級方向數爲負時爲無效

unsignedintclevels; //------------------尺度層數

ImgData***high;//------------------------高通子帶區域

ImgDatalow;//-----------------------------低通子帶區域

ImgDataH1;//------------------------------高通濾波器組

ImgData H2;//------------------------------高通濾波器組

ImgData G1;//------------------------------低通濾波器組

ImgData G2;//------------------------------低通濾波器組

ImgData***filters_dec; //-----------------分解方向濾波器組

ImgData***filters_rec; //-----------------重構方向濾波器組

BOOL sign;

}nsct_t;

尺度與分解層數濾波器:

const intdlevels[3]={3,3,3};//--------------尺度爲三,個尺度方向數爲

const intQunx[4]={0,0,0,0};//--------------------------Q梅花采樣矩陣

BMGImageStructSourceBmp;//---------------------------位圖操作結構體

int pfilter_type,dfilter_type;//濾波器類型選擇,兩者都默認爲,'maxflat'&'dmaxflat7'濾波器

int pralevels;//------------圖像金字塔層數(不能大於4,尺度在4以內足以滿足一般圖像處理需求)

nsct_t nsct;//nsct-------數據計算區域

int shift[2];//---------------------延遲分量

2.3.6NSCT內部函數:

下面列出程序中主要的函數定義說明:

void ImgDataM_Var_3m(ImgData *x,float*mean,float *var,float *mom);

//----------------------------------計算nsct子帶係數的均值和三階中心矩

voidImgDataIFFT_2D(complex *pCFData, complex * pCTData,int nWidth, int nHeight);

//----------------------------------2D-FFT反變換

voidImgDataFFT_2D(complex *pCTData, int nWidth, int nHeight,complex *pCFData);

//----------------------------------2D-FFT反變換

void ImgDataFConv2(ImgData *out,ImgData*img,ImgData *mask);

//----------------------------------頻域卷積函數

void Nsct_Extend2(ImgData *in,int ru,intrd,int cl,int cr,ImgData *out,const int flag=1);

//----------------------------------nsct鏡像擴展函數

void Nsct_Zconv2(ImgData *in,ImgData*out,ImgData *filter,const int *mup);

//----------------------------------時域濾波器卷積函數(快速算法)

void Nsct_Efilter2(ImgData *in,ImgData*out,ImgData *filter);

//----------------------------------邊緣擴展的2D濾波

void Nsct_Nssfbdec(ImgData * input,ImgData *out1,ImgData * out2,ImgData * filter1,ImgData * filter2,const int *Qx=Qunx);

//----------------------------------2通道非採樣子帶分解

void Nsct_Mirror2(ImgData*tomirror);

//----------------------------------鏡像變換

void ImgDataConv2(ImgData *out,ImgData*img,ImgData *mask,ImgData *imgunext);

//----------------------------------相關卷積

void Nsct_Upsample2df(ImgData *h0,intlev,ImgData *ho);

//----------------------------------頻域2D上採樣

void Nsct_Symext(ImgData *imglow,ImgData*upedHi,ImgData *pp );

//----------------------------------2D平衡矩陣生成

void Nsct_Atrousc(ImgData * out,ImgData *signal,ImgData *filter,int (*matrix)[2]);

//----------------------------------包含抽取的濾波器卷積

void Nsct_Nsdfbdec(ImgData *imghigh,intcurrentlevel);

//----------------------------------非抽取方向子帶分解

void Nsct_iTtransform();

//----------------------------------反變換主函數

void Nsct_New(HBITMAP hBitmap,const int*Nlevels=dlevels,const unsigned int Level=3,const intdfilter=1,const int pfilter=1);

//-----------------------------用來初始化原始目標圖像,申請nsct計算空間和存儲空間

void Nsct_Transform();

//-----------------------------變換主函數

void Nsct_NsfbDec(ImgData *imglow,ImgData*imghigh,int i);

//-----------------------------nsct圖像金字塔分解

void NsctDelete();

//-----------------------------nsct析構

void ImgDataFreeMemery(ImgData *image);

//-----------------------------內存空間釋放

BOOL ImgDataAllocMemery(ImgData *image);

//-----------------------------內存空間申請

一個示例程序,和顯示的樣圖:
NSCT——Nonsubsampled <wbr>contourlet <wbr>變換程序開發教程1NSCT——Nonsubsampled <wbr>contourlet <wbr>變換程序開發教程1


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章