好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

第5章 直方图修正和彩色变换.doc

32页
  • 卖家[上传人]:飞***
  • 文档编号:6415131
  • 上传时间:2017-09-11
  • 文档格式:DOC
  • 文档大小:394.50KB
  • / 32 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 第 5 章 直方图修正和彩色变换这一章,我们主要和调色板打交道先从最简单的反色讲起5.1 反色反色(invert)就是形成底片效果例如,图 5.2 为图 5.1 反色后的结果图 5.1 原图 图 5.2 图 5.1 反色后的结果反色有时是很有用的,比如,图 5.1 中黑色区域占绝大多数,这样打印起来很费墨,我们可以先进行反色处理后再打印反色的实际含义是将 R、G、B 值反转若颜色的量化级别是 256,则新图的 R、G 、B 值为 255 减去原图的 R、G、B 值这里针对的是所有图,包括真彩图、带调色板的彩色图(又称为伪彩色图)、和灰度图针对不同种类有不同的处理先看看真彩图我们知道真彩图不带调色板,每个象素用 3 个字节,表示 R、G、B 三个分量所以处理很简单,把反转后的 R、G、B 值写入新图即可再来看看带调色板的彩色图,我们知道位图中的数据只是对应调色板中的一个索引值,我们只需要将调色板中的颜色反转,形成新调色板,而位图数据不用动,就能够实现反转灰度图是一种特殊的伪彩色图,只不过调色板中的 R、G、B 值 都是一样的而已所以反转的处理和上面讲的一样这里,我想澄清一个概念。

      过去我们讲二值图时,一直都说成黑白图二值位图一定是黑白的吗?答案是不一定我们安装 Windows95 时看到的那幅 setup.bmp 是由蓝色和黑色组成的,但它实际上是二值图原来,它的调色板中的两种颜色是黑与蓝,而不是黑与白所以说二值图也可以是彩色的,只不过一般情况下是黑白图而已下面的程序实现了反色,注意其中真彩图和调色板位图处理时的差别BOOL Invert(HWND hWnd){DWORD OffBits,BufSize;LPBITMAPINFOHEADER lpImgData;LPSTR lpPtr;HLOCAL hTempImgData;LPBITMAPINFOHEADER lpTempImgData;LPSTR lpTempPtr;HDC hDc;HFILE hf;LONG x,y;LOGPALETTE *pPal;HPALETTE hPrevPalette=NULL; HLOCAL hPal;DWORD i;unsigned char Red,Green,Blue;OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);BufSize=OffBits+bi.biHeight*LineBytes; //新开缓冲区的大小if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL){MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION);return FALSE;}lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData); lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);//拷贝头信息memcpy(lpTempImgData,lpImgData,BufSize);hDc=GetDC(hWnd);if(NumColors!=0){ //NumColors 不为 0 说明是带调色板的lpPtr=(char *)lpImgData+sizeof(BITMAPINFOHEADER); //指向原图数据lpTempPtr=(char *)lpTempImgData+sizeof(BITMAPINFOHEADER); //指向新图数据//为新调色板分配内存hPal=LocalAlloc(LHND,sizeof(LOGPALETTE)+NumColors*sizeof(PALETTEENTRY));pPal =(LOGPALETTE *)LocalLock(hPal);pPal->palNumEntries =(WORD) NumColors;pPal->palVersion = 0x300;for (i = 0; i palPalEntry[i].peRed=(BYTE)(255-Red);pPal->palPalEntry[i].peGreen=(BYTE)(255-Green);pPal->palPalEntry[i].peBlue=(BYTE)(255-Blue);pPal->palPalEntry[i].peFlags=0;*(lpTempPtr++)=(unsigned char)(255-Blue);*(lpTempPtr++)=(unsigned char)(255-Green);*(lpTempPtr++)=(unsigned char)(255-Red);*(lpTempPtr++)=0;}if(hPalette!=NULL) DeleteObject(hPalette);hPalette=CreatePalette(pPal); //产生新的调色板LocalUnlock(hPal);LocalFree(hPal);if(hPalette){hPrevPalette=SelectPalette(hDc,hPalette,FALSE);RealizePalette(hDc);}}else{ //不带调色板,说明是真彩色图for(y=0;ypalNumEntries =(WORD) NewNumColors;pPal->palVersion = 0x300;if(NumColors==0) //真彩色 for (i = 0; i palPalEntry[i].peRed=(BYTE)i;pPal->palPalEntry[i].peGreen=(BYTE)i;pPal->palPalEntry[i].peBlue=(BYTE)i;pPal->palPalEntry[i].peFlags=(BYTE)0;*(lpTempPtr++)=(unsigned char)i;*(lpTempPtr++)=(unsigned char)i;*(lpTempPtr++)=(unsigned char)i;*(lpTempPtr++)=0;}else for (i = 0; i palPalEntry[i].peRed=Gray;pPal->palPalEntry[i].peGreen=Gray;pPal->palPalEntry[i].peBlue=Gray;pPal->palPalEntry[i].peFlags=0;*(lpTempPtr++)=(unsigned char)Gray;*(lpTempPtr++)=(unsigned char)Gray;*(lpTempPtr++)=(unsigned char)Gray;*(lpTempPtr++)=0;}if(hPalette!=NULL) DeleteObject(hPalette);//生成新的逻辑调色板hPalette=CreatePalette(pPal);LocalUnlock(hPal);LocalFree(hPal);hDc=GetDC(hWnd);if(hPalette){hPrevPalette=SelectPalette(hDc,hPalette,FALSE);RealizePalette(hDc); }if(NumColors==0) //真彩色图才需要处理位图数据for(y=0;y>4);//相应的数组元素加 1ColorHits[ClrIndex]++;}}PalCounts=0;//将为零的元素清除出去 for (ClrIndex = 0; ClrIndex ColorHits[i]){temp = ColorHits[i];ColorHits[i] = ColorHits[j];ColorHits[j] = temp; //注意调整相应的索引值temp = ColorIndex[i];ColorIndex[i] = ColorIndex[j];ColorIndex[j] = (WORD)temp;}}//为新的调色板分配内存hPal=LocalAlloc(LHND,sizeof(LOGPALETTE) +256* sizeof(PALETTEENTRY));pPal =(LOGPALETTE *)LocalLock(hPal);pPal->palNumEntries =(WORD) 256;pPal->palVersion = 0x300;lpTempPtr=(char *)lpTempImgData+sizeof(BITMAPINFOHEADER);for (i = 0; i palPalEntry[i].peRed=(BYTE)((ColorIndex[i] & 0x00f) palPalEntry[i].peGreen=(BYTE)((ColorIndex[i] & 0x0f0));pPal->palPalEntry[i].peBlue=(BYTE)((ColorIndex[i] & 0xf00) >> 4);pPal->palPalEntry[i].peFlags=(BYTE)0;*(lpTempPtr++)=(unsigned char)((ColorIndex[i] & 0xf00) >> 4);*(lpTempPtr++)=(unsigned char)((ColorIndex[i] & 0x0f0));*(lpTempPtr++)=(unsigned char)((ColorIndex[i] & 0x00f) 256){for (i = 256; i > 4);Green = (long)((ColorIndex[i] & 0x0f0));Red = (long)((ColorIndex[i] & 0x00f) palPalEntry[j].peBlue)*(Blue-pPal->palPalEntry[j].peBlue)+ (long)(Green-pPal->palPalEntry[j].peGreen)*(Green-pPal->palPalEntry[j].peGreen)+(long)(Red-pPal->palPalEntry[j].peRed)*(Red-pPal->palPalEntry[j].peRed); if (ColorError2 >4);for (i = 0; i 1。

      g 1old 和 g2old 表示原图中要进行对比度扩展的范围,g 1new 和 g2new 表示对应的新值用公式表示为显然要得到对比度扩展后的灰度,我们需要知道 a,b,c,g1old,g2old 五个参数由于有新图的灰度级别也是 255 这个约束,所以满足 ag1old+b(gold-g1old)+c(255-g2old)=255 这个方程这样,我们只需给出四个参数,而另一个可以代入方程求得我们假设 a=c,这样,我们只要给出 b,g 1old 和 g2old,就可以求出a=(255-b(g2old-g1old))/(255-(g2old-g1old))要。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.