Posted on 2008-06-27 16:22
若我 閱讀(607)
評(píng)論(0) 編輯 收藏 引用
圖像增強(qiáng)是指將圖像的部分信息利用某種方式(在頻域或者空域)將以增強(qiáng),從而有利于某種服務(wù)的操作。一般將空域的圖像增強(qiáng)分為線性灰度增強(qiáng)和非線性灰度增強(qiáng)。
線性灰度增強(qiáng):
設(shè)源圖像的灰度范圍在[a-b]的范圍內(nèi),我們打算將這個(gè)范圍內(nèi)的像素灰度增強(qiáng)到范圍[c-d],設(shè)函數(shù)f(x,y)表示坐標(biāo)為(x,y)點(diǎn)處的原始灰度值,g(x,y)表示增強(qiáng)后的圖像的灰度值:
那么:
g(x,y)=(d-c)*(f(x,y)-a)/(b-a)+c
下面是GDI+實(shí)現(xiàn)的線性灰度增強(qiáng)的代碼:
void GrayEnhance(Bitmap *bmp,char minR,char maxR,char minG,char maxG, char minB, char maxB)
{
if(minR>=maxR)
{
return;
}
if(minG>=maxG)
{
return;
}
if(minB>maxB)
{
return;
}
BitmapData bmpData;
bmp->LockBits(&rec,ImageLockModeRead|ImageLockModeWrite ,PixelFormat32bppARGB,&bmpData);
char *pStar=(char*)bmpData.Scan0;
UINT width=bmp->GetWidth();
UINT height=bmp->GetHeight();
char mR=pStart[0],maR=pStart[0],mG=pStart[1],maG=pStart[1],mB=pStart[2],maB=pStart[2];
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
if(pStart[0]<mR)
{
mR=pStart[0];
}
else if(pStart[0]>maR)
{
maR=pStart[0];
}
if(pStart[1]<mG)
{
mG=pStart[1];
}
else if(pStart[1]>maG)
{
maG=pStart[1];
}
if(pStart[2]<mB)
{
mB=pStart[2];
}
else if(pStart[2]>maB)
{
maB=pStart[2];
}
pStart+=3;
}
p+=bmpData.Stride-3*width;
}
pStar=(char*)bmpData.Scan0;
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
pStart[0]=(char)((maxR-minR)*(pStart[0]-mR)/(maR-mR)+minR);
pStart[1]=(char)((maxG-minG)*(pStart[0]-mG)/(maG-mG)+minG);
pStart[2]=(char)((maxB-minB)*(pStart[0]-mB)/(maB-mB)+minB);
pStart+=3;
}
p+=bmpData.Stride-3*width;
}
bmp->UnlockBits(&bmpData);
}