《数字图像处理入门》第5章(无水印)

上传人:第*** 文档编号:33597744 上传时间:2018-02-16 格式:DOC 页数:32 大小:412.50KB
返回 下载 相关 举报
《数字图像处理入门》第5章(无水印)_第1页
第1页 / 共32页
《数字图像处理入门》第5章(无水印)_第2页
第2页 / 共32页
《数字图像处理入门》第5章(无水印)_第3页
第3页 / 共32页
《数字图像处理入门》第5章(无水印)_第4页
第4页 / 共32页
《数字图像处理入门》第5章(无水印)_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《《数字图像处理入门》第5章(无水印)》由会员分享,可在线阅读,更多相关《《数字图像处理入门》第5章(无水印)(32页珍藏版)》请在金锄头文库上搜索。

1、第 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 值。这里针对的是所有图,包括真彩图、带调色板的彩色图(又称为伪彩色图)、和灰度图。针对不同种类有不同的处理。先看看真彩图。

2、我们知道真彩图不带调色板,每个象素用 3 个字节,表示 R、G、B 三个分量。所以处理很简单,把反转后的 R、G、B 值写入新图即可。再来看看带调色板的彩色图,我们知道位图中的数据只是对应调色板中的一个索引值,我们只需要将调色板中的颜色反转,形成新调色板,而位图数据不用动,就能够实现反转。灰度图是一种特殊的伪彩色图,只不过调色板中的 R、G、B 值 都是一样的而已。所以反转的处理和上面讲的一样。这里,我想澄清一个概念。过去我们讲二值图时,一直都说成黑白图。二值位图一定是黑白的吗?答案是不一定。我们安装 Windows95 时看到的那幅 setup.bmp 是由蓝色和黑色组成的,但它实际上是二值

3、图。原来,它的调色板中的两种颜色是黑与蓝,而不是黑与白。所以说二值图也可以是彩色的,只不过一般情况下是黑白图而已。下面的程序实现了反色,注意其中真彩图和调色板位图处理时的差别。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 hPrevP

4、alette=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

5、=(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(

6、BITMAPINFOHEADER); /指向新图数据/为新调色板分配内存hPal=LocalAlloc(LHND,sizeof(LOGPALETTE)+NumColors*sizeof(PALETTEENTRY);pPal =(LOGPALETTE *)LocalLock(hPal);pPal-palNumEntries =(WORD) NumColors;pPal-palVersion = 0x300;for (i = 0; i palPalEntryi.peRed=(BYTE)(255-Red);pPal-palPalEntryi.peGreen=(BYTE)(255-Green);pPa

7、l-palPalEntryi.peBlue=(BYTE)(255-Blue);pPal-palPalEntryi.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)

8、;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 palPalEntryi.peRed=(BYTE)i;pPal-palPalEntryi.peGreen=(BYTE)i;pPal-palPalEntryi.peB

9、lue=(BYTE)i;pPal-palPalEntryi.peFlags=(BYTE)0;*(lpTempPtr+)=(unsigned char)i;*(lpTempPtr+)=(unsigned char)i;*(lpTempPtr+)=(unsigned char)i;*(lpTempPtr+)=0;else for (i = 0; i palPalEntryi.peRed=Gray;pPal-palPalEntryi.peGreen=Gray;pPal-palPalEntryi.peBlue=Gray;pPal-palPalEntryi.peFlags=0;*(lpTempPtr+)

10、=(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);Reali

11、zePalette(hDc); if(NumColors=0) /真彩色图才需要处理位图数据for(y=0;y4);/相应的数组元素加 1ColorHitsClrIndex+;PalCounts=0;/将为零的元素清除出去 for (ClrIndex = 0; ClrIndex ColorHitsi)temp = ColorHitsi;ColorHitsi = ColorHitsj;ColorHitsj = temp; /注意调整相应的索引值temp = ColorIndexi;ColorIndexi = ColorIndexj;ColorIndexj = (WORD)temp;/为新的调色板

12、分配内存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 palPalEntryi.peRed=(BYTE)(ColorIndexi pPal-palPalEntryi.peGreen=(BY

13、TE)(ColorIndexi pPal-palPalEntryi.peBlue=(BYTE)(ColorIndexi pPal-palPalEntryi.peFlags=(BYTE)0;*(lpTempPtr+)=(unsigned char)(ColorIndexi *(lpTempPtr+)=(unsigned char)(ColorIndexi *(lpTempPtr+)=(unsigned char)(ColorIndexi /ColorHits 作为颜色记数的作用已经完成了,下面的作用是记录 12 位索/引值对应的调色板/中的索引值ColorHitsi=i;/其余的颜色依据最小平方

14、误差近似为前 256 中最接近的一种if (PalCounts 256)for (i = 256; i 4);Green = (long)(ColorIndexi Red = (long)(ColorIndexi ClrIndex = 0;for (j = 0; j palPalEntryj.peBlue)*(Blue-pPal-palPalEntryj.peBlue)+ (long)(Green-pPal-palPalEntryj.peGreen)*(Green-pPal-palPalEntryj.peGreen)+(long)(Red-pPal-palPalEntryj.peRed)*(Red-pPal-palPalEntryj.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,这样,我们只要给出

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号