若我的小家

-编程,读书,感悟,旅游,设计
posts - 21, comments - 0, trackbacks - 0, articles - 0

Win32图像处理(一)图像增强

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);
}


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理