影象增強 空域濾波和頻域濾波
阿新 • • 發佈:2019-01-26
影象的真強即為影象的濾波,分為空間濾波和頻域濾波
空間濾波可分為線性濾波和非線性濾波
空域濾波演算法在進行高通或低通濾波時,採用的手法都是一樣的,即小區域模版卷積
1.線性平滑濾波器:
用3*3模版中心與待處理影象的每個畫素點重合,將模版各值與其下畫素點相乘,幾種典型模版:
{0,1,0,
1,1,1,
0,1,0,
4,3
},
{
1,1,1,
1,0,1,
1,1,1,
8,3
},
{
1,1,1,
1,1,1,
1,1,1,
9,3
},
{
1,1,1,
1,2,1,
1,1,1,
10,3
},
{/////////////////高斯濾波模版
1,2,1,
2,4,2,
1,2,1,
16,3
}
/*************************************************************************
*
* 函式名稱:
* KernelFilter()
*
* 引數:
* BYTE* bmp,LONG width,LONG height ------影象引數
KERNEL kernel ---------模版
*
* 返回值:
* BOOL - 成功返回TRUE,否則返回FALSE。
*
* 說明:
* 該函式對圖象進行二維快速沃爾什——哈達馬變換。
*
************************************************************************/
voidKernelFilter(BYTE *
/*************************************************************************
*
* 函式名稱:
* BmpFilter()
*
* 引數:
* BYTE *srcBmp --------原影象
BYTE *desBmp --------轉換後圖像
LONG width,LONG height ------影象引數
*
* 返回值:
* BOOL - 成功返回TRUE,否則返回FALSE。
*
* 說明:
* 該函式將原影象轉換為由1填充的影象,方便進行模版濾波。
*
************************************************************************/
voidBmpFilter(BYTE *desBmp,BYTE *srcBmp,LONG width,LONG height);
voidMyProcess::BmpFilter(BYTE *desBmp,BYTE *srcBmp,LONG width,LONG height)
{
LONG i,j;
memset(desBmp,0,(width+6)*(height+2));
for(i=0;i<height;i++)
for(j=0;j<width;j++)
{
desBmp[(i+1)*(width+6)+j+3]=srcBmp[i*width+j];
}
}
voidMyProcess::KernelFilter(BYTE *bmp,LONG width,LONG height,KERNEL kernel)
{
LONG i,j;
//申請一個臨時空間,由1包圍bmp影象,方便進行模版處理
BYTE *temp_bmp =new BYTE[(width+6)*(height+2)];
BmpFilter(temp_bmp,bmp,width,height);
//模版濾波
for(i=1;i<height+1;i++)
for(j=3;j<width+3;j++)
{
LONG k,m,temp=0;
for(k=-1;k<kernel.Dimention-1;k++)
for(m=-1;m<kernel.Dimention-1;m++)
{
int a = temp_bmp[(i+k)*(width+6)+j+m*3];
int b = kernel.Element[k+1][m+1];
temp+=a*b;
}
temp/=kernel.Divisor;
//////////////////////////////////////////////////////////////////////////
//此處注意,不應將值給待處理物件,而應傳給未處理的原影象// temp_bmp[i*(width+6)+j] = (BYTE)temp;
bmp[(i-1)*width+j-3]= temp;
}
delete[] temp_bmp;
}
/*************************************************************************
*
* 函式名稱:
* MedianFilter()
*
* 引數:
* BYTE* bmp,LONG width,LONG height ------影象引數
*
* 返回值:
* BOOL - 成功返回TRUE,否則返回FALSE。
*
* 說明:
* 該函式對圖象進行中值濾波。
*
************************************************************************/
voidMedianFilter(BYTE *bmp,LONG width,LONG height);
voidMyProcess::MedianFilter(BYTE *bmp,LONG width,LONG height)
{
LONG i,j;
//申請一個臨時空間,由1包圍bmp影象,方便進行模版處理
BYTE *temp_bmp =new BYTE[(width+6)*(height+2)];
BmpFilter(temp_bmp,bmp,width,height);
//中值濾波
//待排序值
int value[9];
for(i=1;i<height+1;i++)
for(j=3;j<width+3;j++)
{
LONG k,m,temp=0;
for(k=-1;k<2;k++)
for(m=-1;m<2;m++)
{
value[(k+1)*3+(m+1)]= temp_bmp[(i+k)*(width+6)+j+m*3];