科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件Visual C++实现数字图像增强处理

Visual C++实现数字图像增强处理

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在实际应用中,我们的系统获取的原始图像不是完美的,所以需要进行预处理,以有利于提取我们感兴趣的信息

作者:刘涛 来源:yesky 2007年11月16日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
二、图像增强

  影响系统图像清晰程度的因素很多,例如室外光照度不够均匀就会造成图像灰度过于集中;由CCD(摄像头)获得的图像经过A/D(数/模转换,该功能在图像系统中由数字采集卡来实现)转换、线路传送都会产生噪声污染等等。因此图像质量不可避免的降低了,轻者表现为图像不干净,难于看清细节;重者表现为图像模糊不清,连概貌也看不出来。因此,在对图像进行分析之前,必须要对图像质量进行改善,一般情况下改善的方法有两类:图像增强和图像复原。图像增强不考虑图像质量下降的原因,只将图像中感兴趣的特征有选择的突出,而衰减不需要的特征,它的目的主要是提高图像的可懂度。图像增强的方法分为空域法和频域法两类,空域法主要是对图像中的各个像素点进行操作;而频域法是在图像的某个变换域内,对图像进行操作,修改变换后的系数,例如付立叶变换、DCT变换等的系数,然后再进行反变换得到处理后的图像。图像复原技术与增强技术不同,它需要了解图像质量下降的原因,首先要建立"降质模型",再利用该模型,恢复原始图像。本期讲座我们主要介绍各种增强技术在图象处理系统中的实际应用。

  1.灰度变换

  简单的说,灰度变换就是指对图像上各个像素点的灰度值x按某个函数T()变换到y。例如为了提高图像的清晰度,需要将图像的灰度级整个范围或其中某一段(A,B)扩展或压缩到(A,B);需要显示出图像的细节部分等都要求采用灰度变换方法。灰度变换有时又被称为图像的对比度增强或对比度拉伸。假定输入图像中的一个像素的灰度级为Z,经过T(Z)函数变换后输出图像对应的灰度级为Z ,其中要求Z和Z 都要在图像的灰度范围之内。根据T()形式,可以将灰度变换分为线性变换和非线性变换。具体应用中采用何种T(),需要根据变换的要求而定。

  对于图像的灰度变换,我们这里介绍一种稍微复杂一点的方法,既直方图均衡化。直方图均衡化是灰度变换的一个重要应用,广泛应用在图像增强处理中,它是以累计分布函数变换为基础的直方图修正法,可以产生一幅灰度级分布具有均匀概率密度的图像,扩展了像素的取值动态范围。若像素点的原灰度为R,变换后的灰度为S,需要注意的是R、S是归一化后的灰度值,其灰度变换函数T()为:

S=T (R); k=0,1…, ;

  式中, 是第j级灰度值的概率, 是图像中j级灰度的像素总数, 是图像中灰度级的总数目, 是图象中像素的总数。对变换后的S值取最靠近的一个灰度级的值,建立灰度级变换表,将原图像变换为直方图均衡的图像。下面是实现图像直方图均衡化函数的源代码和效果图:

void CDibView::OnZftJh()
{
 CClientDC pDC(this);
 HDC hDC=pDC.GetSafeHdc();//获取当前设备上下文的句柄;
 SetStretchBltMode(hDC,COLORONCOLOR);
 CDibDoc *pDoc=GetDocument();
 HDIB hdib;
 hdib=pDoc->GetHDIB();
 BITMAPINFOHEADER *lpDIBHdr;//位图信息头结构指针;
 BYTE *lpDIBBits;//指向位图像素灰度值的指针;
 lpDIBHdr=( BITMAPINFOHEADER *)GlobalLock(hdib);//得到图像的位图头信息
 lpDIBBits=(BYTE*)lpDIBHdr+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);
 file://获取图像像素值
 float p[256],p1[256],num[256];
 int i,j,k;
 for(i=0;i<256;i++)//清空三个数组;
 { num[i]=0.0f;
  p[i]=0.0f;
  p1[i]=0.0f;
 }
 file://num[]存放图象各个灰度级出现的次数;
 int Height=lpDIBHdr->biHeight;
 int Width=lpDIBHdr->biWidth;
 for(i=0;i   for(j=30;j   {
   num[*(lpDIBBits+WIDTHBYTES(Width*8)*i+j)]++;
  }
  file://p[]存放图像各个灰度级的出现概率;
  for(i=0;i<256;i++)
  {
   p[i]=num[i]/(Width*Height);
  }
  file://p1[]存放各个灰度级之前的概率和,用于直方图变换;
  for(i=0;i<256;i++)
  {
   for(k=0;k<=i;k++)
   p1[i]+=p[k];
  }
  file://直方图变换;
  for(i=0;i   for(j=30;j   {   *(lpDIBBits+WIDTHBYTES(Width*8)*i+j)=(BYTE)(p1[*(lpDIBBits+WIDTHBYTES(Width*8)*i+j)]*255+0.5);
  }
  StretchDIBits (hDC,0,0,lpDIBHdr->biWidth,lpDIBHdr->biHeight,0,0,
         lpDIBHdr->biWidth,lpDIBHdr->biHeight,
         lpDIBBits,(LPBITMAPINFO)lpDIBHdr,
         DIB_RGB_COLORS,
         SRCCOPY);//显示图像;
}


(a)LENA原图
  
(b)直方图均衡化后的效果图


(c)原始图象的直方图
 
(d)均衡化后的直方他图

                      图 二

  从上述效果图可以看出,经过直方图均衡化处理后,图像变的清晰了,从直方图来看,处理后的LENA的图像直方图分布更均匀了,在每个灰度级上图像都有像素点。但是直方图均衡化存在着两个缺点:

  1)变换后图像的灰度级减少,某些细节消失;

  2)某些图像,如直方图有高峰,经处理后对比度不自然的过分增强。

  为此M.Kamel和Lian Guan等人从图像相邻像素一般高度相关这一事实出发,将灰度概率分布和空间相关性联系在一起,提出了用二维条件概率密度函数取代一维概率密度函数作为均衡化条件,很好的解决了这个问题,有兴趣的朋友可以参阅一些图像处理书籍和资料。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章