Posted on 2008-06-27 16:22
若我 阅读(593)
评论(0) 编辑 收藏 引用
图像增强是指将图像的部分信息利用某种方式(在频域或者空域)将以增强,从而有利于某种服务的操作。一般将空域的图像增强分为线性灰度增强和非线性灰度增强。
线性灰度增强:
设源图像的灰度范围在[a-b]的范围内,我们打算将这个范围内的像素灰度增强到范围[c-d],设函数f(x,y)表示坐标为(x,y)点处的原始灰度值,g(x,y)表示增强后的图像的灰度值:
那么:
g(x,y)=(d-c)*(f(x,y)-a)/(b-a)+c
下面是GDI+实现的线性灰度增强的代码:
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);
}