VC编程实现灰度图像与彩色图像的相互转换

2016-02-19 12:58 65 1 收藏

下面图老师小编跟大家分享VC编程实现灰度图像与彩色图像的相互转换,一起来学习下过程究竟如何进行吧!喜欢就赶紧收藏起来哦~

【 tulaoshi.com - 编程语言 】

    PhotoShop的图像处理功能很强,其中有一个功能是将灰度图像转换为彩色图像,数字图像处理中,也经常要遇到灰度图像与彩色图像相互转换的问题,如何自己解决这个问题,值得大家探讨,现将我解决这类问题的方法陈述如下:

  工程应用中经常要遇到需要把彩色图像到灰度图像的变换的问题,采集卡过来的图像为彩色图像,为加快处理速度,要把彩色图像转换为黑白图象,这个问题比较好解决,一般情况下彩色图像每个像素用三个字节表示,每个字节对应着R、G、B分量的亮度(红、绿、蓝),转换后的黑白图像的一个像素用一个字节表示该点的灰度值,它的值在0~255之间,数值越大,该点越白,既越亮,越小则越黑。转换公式为Gray(i,j)=0.11*R(i,j)+0.59*G(i,j)+0.3*B(i,j),其中Gray(i,j)为转换后的黑白图像在(i,j)点处的灰度值,我们可以观察该式,其中绿色所占的比重最大,所以转换时可以直接使用G值作为转换后的灰度。

  至于灰度图像转换为彩色图像,技术上称为灰度图像的伪彩色处理,这是一种视觉效果明显而技术又不是很复杂的图像增强技术。灰度图像中,如果相邻像素点的灰度相差不大,但包含了丰富的信息的话,人眼则无法从图像中提取相应的信息,因为人眼分辨灰度的能力很差,一般只有几十个数量级,但是人眼对彩色信号的分辨率却很强,这样将黑白图像转换为彩色图像人眼可以提取更多的信息量。在转换过程中,经常采用的技术是灰度级-彩色变换,意思就是对黑白图像上的每一个像素点,取得该点的灰度值并送入三个通道经过实施不同的变换,产生相应的R、G、B的亮度值,即所求彩色图像对应像素点的彩色值,具体变换公式很多,我采用的是最常用的一种,变换曲线图如下:

VC编程实现灰度图像与彩色图像的相互转换

VC编程实现灰度图像与彩色图像的相互转换

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

VC编程实现灰度图像与彩色图像的相互转换

  上图中,三个图分别代表了三个变换通道,R、G、B指的是变换后对应点的R、G、B分量值,L指的是各个分量的最大值为255,G(x,y)为相应点的灰度值。理论上就这些,下面是我用VC实现的源代码,图一为我的灰度位图,图二为伪彩色处理后的结果图。我这个实现函数中是如何得到灰度位图的数据的就不多讲了,有兴趣的朋友可参考我在天极网上九月十号发表的《VC灰度位图处理》一文,那里应该讲的很清楚了。需要读者注意的是彩色图像中每个象素中的三个字节分别代表的分量,第一个字节为B,第二个为G值、最后一个为R值,这个顺序不要搞错了。代码实现如下:

void CDibView::OnMenuchange() file://图像转换实现函数
{
  // TODO: Add your command handler code here
  HANDLE data1handle;
  LPBITMAPINFOHEADER lpBi;
  BITMAPINFO *m_pBMI;
  CDibDoc *pDoc=GetDocument();
  HDIB hdib;
  unsigned char *hData;
  unsigned char *data;
  hdib=pDoc-GetHDIB();//得到位图数据的句柄,其中包含图像信息头
  BeginWaitCursor();
  lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);
  hData=(unsigned char*)FindDIBBits((LPSTR)lpBi);
  m_pBMI=new BITMAPINFO;//生成彩色图像的信息头
  m_pBMI-bmiHeader.biBitCount=24;
  m_pBMI-bmiHeader.biClrImportant=0;
  m_pBMI-bmiHeader.biClrUsed=0;
  m_pBMI-bmiHeader.biCompression=BI_RGB;
  m_pBMI-bmiHeader.biHeight=lpBi-biHeight;
  m_pBMI-bmiHeader.biWidth=lpBi-biWidth;
  m_pBMI-bmiHeader.biPlanes=1;
  m_pBMI-bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
  m_pBMI-bmiHeader.biXPelsPerMeter=0;
  m_pBMI-bmiHeader.biYPelsPerMeter=0;
  m_pBMI-bmiHeader.biSizeImage=WIDTHBYTES(lpBi-biWidth*8)*lpBi-biHeight*3;
  file://data=hData;
  int R,G,B,i,j;
  data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpBi-biWidth*8)*lpBi-biHeight*3);
  file://生成存储彩色图象数据的缓冲区
  data=(unsigned char*)GlobalLock((HGLOBAL)data1handle);
  for(i=0;ibiHeight;i++)//实现灰度到彩色变换
   for(j=0;jbiWidth*8);j++)
   {
    if(*(hData+i*WIDTHBYTES(lpBi-biWidth*8)+j)=64)
    {R=0;
     G=(int)4*(*(hData+i*WIDTHBYTES(lpBi-biWidth*8)+j));
     B=255;
    }
    if(*(hData+i*WIDTHBYTES(lpBi-biWidth*8)+j)64
    && *(hData+i*WIDTHBYTES(lpBi-biWidth*8)+j)=128)
     {R=0;
      G=255;
      B=(int)4*(128-*(hData+i*WIDTHBYTES(lpBi-biWidth*8)+j));
     }
    if(*(hData+i*WIDTHBYTES(lpBi-biWidth*8)+j)128
     && *(hData+i*WIDTHBYTES(lpBi-biWidth*8)+j)=192)
      {R=(int)4*(*(hData+i*WIDTHBYTES(lpBi-biWidth*8)+j)-128);
       G=255;
       B=0;
      }
    if(*(hData+i*WIDTHBYTES(lpBi-biWidth*8)+j)192
     && *(hData+i*WIDTHBYTES(lpBi-biWidth*8)+j)=255)
      {R=255;
       G=(int)4*(255-*(hData+i*WIDTHBYTES(lpBi-biWidth*8)+j));
       B=0;
      }
    file://将生成的R、G、B分量存入目标缓冲区
    *(data+i*WIDTHBYTES(lpBi-biWidth*8)*3+j*3)=B;
    *(data+i*WIDTHBYTES(lpBi-biWidth*8)*3+j*3+1)=G;
    *(data+i*WIDTHBYTES(lpBi-biWidth*8)*3+j*3+2)=R;
   }
   GlobalUnlock((HGLOBAL)hdib);
   GlobalUnlock(data1handle);
   EndWaitCursor();
   CClientDC pDC(this);
   file://显示真彩色图像
   StretchDIBits(pDC.GetSafeHdc(),0,0,lpBi-biWidth,lpBi-biHeight,0,0,
          lpBi-biWidth, lpBi-biHeight,data,m_pBMI,DIB_RGB_COLORS,
          SRCCOPY);
   delete m_pBMI;
}

VC编程实现灰度图像与彩色图像的相互转换
图 一

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

VC编程实现灰度图像与彩色图像的相互转换
 图 二 

  数字图像处理技术博大精深,我真诚的希望和广大朋友探讨

来源:https://www.tulaoshi.com/n/20160219/1602631.html

延伸阅读
在Delphi中,专门定义了一组对象和部件用以绘制图形,完成一些简单的图像功能。利用这些对象、部件的方法,可以方便地绘制各种常用图形;通过设置它们的属性,能得到不同风格的图形。另外,通过对鼠标事件的定义,可以方便的设计图形绘制程序。 本章将介绍以下内容: 1. TCanvas,TPen,TBrush,TColor对象的方法及属性; 2. ...
下面代码中用到的sourceImage是一个已经存在的Image对象 图像剪切 对于一个已经存在的Image对象,要得到它的一个局部图像,可以使用下面的步骤: //import Java.awt.*; //import java.awt.image.*; Image croppedImage; ImageFilter cropFilter; CropFilter =new CropImageFilter(25,30...
[文章导读] Java Applet常用来显示存储在GIF文件中的图像 Java Applet常用来显示存储在GIF文件中的图像。Java Applet装载GIF图像非常简单,在Applet内使用图像文件时需定义Image对象。多数Java Applet使用的是GIF或JPEG格式的图像文件。Applet使用getImage方法把图像文件和Image对象联系起来。 Graphics类的drawImage方法用来显示Image对象。...
以下是作品原稿,以及四种不同的转化为灰度的方法以供比较。 转化为灰度 这可能是最快捷,至少是最通用的方法。选择作品然后使用 编辑-编辑颜色-转换为灰度。 调整色彩平衡 这种方法可对黑色进行更多的控制。选中作品,使用 编辑-编辑颜色-调整色彩平衡 。 从下拉菜单中选择灰度,点击预览和转换的复选框,即可使用滑动条调整黑色的...
一、 引言 JPEG图像压缩标准随然是一种有损图像压缩标准,但由于人眼视觉的不敏感,经压缩后的画质基本没有发生变化,很快便以较高的压缩率得到了广泛的认可。GIF格式虽然仅支持256色但它对于颜色较少的图像有着很高的压缩率,甚至超过JPEG标准,也得到了广泛的认同。但作为众多程序员的一个重要的开发工具--Microsoft Visual C++ 6.0的M...

经验教程

873

收藏

28
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部