欢迎来到天天文库
浏览记录
ID:18961429
大小:394.50 KB
页数:32页
时间:2018-09-22
《直方图修正和彩色变换》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
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值都是一样的而已。所以反转的处理和上面讲的一样。这里,我想澄清一个概念。过去我们讲二值图时,一直都说成黑白图。二值位图一定
3、是黑白的吗?答案是不一定。我们安装Windows95时看到的那幅setup.bmp是由蓝色和黑色组成的,但它实际上是二值图。原来,它的调色板中的两种颜色是黑与蓝,而不是黑与白。所以说二值图也可以是彩色的,只不过一般情况下是黑白图而已。下面的程序实现了反色,注意其中真彩图和调色板位图处理时的差别。BOOLInvert(HWNDhWnd){ DWORD OffBits,BufSize;LPBITMAPINFOHEADER lpImgData;
4、 LPSTR lpPtr; HLOCAL hTempImgData; LPBITMAPINFOHEADER lpTempImgData; LPSTR lpTempPtr; HDC hDc; HFILE hf; LONG x,y;
5、LOGPALETTE *pPal; HPALETTE hPrevPalette=NULL; HLOCAL hPal; DWORD i; unsignedchar Red,Green,Blue; OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER); BufSize=OffBits+bi
6、.biHeight*LineBytes;//新开缓冲区的大小 if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL){MessageBox(hWnd,"Errorallocmemory!","ErrorMessage",MB_OK
7、MB_ICONEXCLAMATION);returnFALSE;}lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData); lpTempImgData=(LPB
8、ITMAPINFOHEADER)LocalLock(hTempImgData); //拷贝头信息memcpy(lpTempImgData,lpImgData,BufSize); hDc=GetDC(hWnd); if(NumColors!=0){//NumColors不为0说明是带调色板的lpPtr=(char*)lpImgData+sizeof(BITMAPINFOHEADER);//指向原图数据lpTempPtr=(char*)lpTempImgData+sizeof(
9、BITMAPINFOHEADER);//指向新图数据//为新调色板分配内存hPal=LocalAlloc(LHND,sizeof(LOGPALETTE)+NumColors*sizeof(PALETTEENTRY));pPal=(LOGPALETTE*)LocalLock(hPal);pPal->palNumEntries=(WORD)NumColors;pPal->palVersion =0x300;for(i=0;i
此文档下载收益归作者所有