📄 chap05.htm
字号:
<html>
<!-- Mirrored from www.lgui.net/column/book1/chap05.htm by HTTrack Website Copier/3.x [XR&CO'2005], Mon, 21 Mar 2005 13:20:08 GMT -->
<head>
<meta http-equiv=Content-Type content="text/html; charset=GB2312">
<link rel=Edit-Time-Data href="chap05.files/editdata.html" >
<link rel=OLE-Object-Data href="chap05.files/oledata.mso" >
<title>第5章 直方图修正和彩色变换</title>
<style><!--
.Normal
{text-align:justify;
text-justify:inter-ideograph;
text-indent:0pt;
line-height:normal;
font-size:10.5pt;
font-family:"Times New Roman";}
.a
{text-align:center;
text-indent:0pt;
line-height:20.0pt;
font-size:12.0pt;
font-family:"Times New Roman";}
-->
</style>
</head>
<body lang=ZH-CN link=blue vlink=purple class="Normal" bgcolor="#FFFFFF">
<div style='layout-grid:15.6pt'>
<h1><a name="_Toc486331881"></a><a name="_Toc486332881"></a><a
name="_Toc486338990"></a><a name="_Toc454810855"></a><a name="_Toc454856629"><span><span>第<span
lang=EN-US>5</span></span></span></a><span><span><span style='font-family:黑体;"Times New Roman"'>章</span>
</span></span><span><span><span
style='font-family:黑体;"Times New Roman"'>直方图修正和彩色变换</span></span></span></h1>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>这一章,我们主要和调色板打交道。先从最简单的反色讲起。</span></p>
<h2> <span
lang=EN-US>5.1</span> <span lang=EN-US> </span><a name="_Toc486331882"></a><a
name="_Toc486332882"></a><a name="_Toc486338991"></a><a name="_Toc454810856"></a><a
name="_Toc454856630"><span><span>反色</span></span></a></h2>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>反色</span><span lang=EN-US>(invert)</span><span
style='font-family:宋体;"Times New Roman"'>就是形成底片效果。例如,图</span><span lang=EN-US>5.2</span><span
style='font-family:宋体;"Times New Roman"'>为图</span><span lang=EN-US>5.1</span><span style='font-family:
宋体;"Times New Roman"'>反色后的结果。</span></p>
<table border=0 cellspacing=0 cellpadding=0>
<tr>
<td width=276 valign=top class="Normal">
<p style='line-height:18.0pt'><span lang=EN-US> <img width=264 height=211
src="chap05.files/image002.jpg" v:shapes="_x0000_i1025"> </span></p>
<p align=center style='text-align:center;line-height:18.0pt'><b><span
style='font-family:宋体;"Times New Roman"'>图</span>5.1
</b><b><span style='font-family:
宋体;"Times New Roman"'>原图</span><span
lang=EN-US></span></b></p>
</td>
<td width=276 valign=top class="Normal">
<p style='line-height:18.0pt'><span lang=EN-US> <img width=266 height=213
src="chap05.files/image004.jpg" v:shapes="_x0000_i1026"> </span></p>
<p align=center style='text-align:center;line-height:18.0pt'><b><span
style='font-family:宋体;"Times New Roman"'>图</span>5.2
</b><b><span style='font-family:
宋体;"Times New Roman"'>图</span><span
lang=EN-US>5.1</span></b><b><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>反色后的结果</span><span
lang=EN-US></span></b></p>
</td>
</tr>
</table>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>反色有时是很有用的,比如,图</span><span lang=EN-US>5.1</span><span
style='font-family:宋体;"Times New Roman"'>中黑色区域占绝大多数,这样打印起来很费墨,我们可以先进行反色处理后再打印。</span></p>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>反色的实际含义是将</span><span lang=EN-US>R</span><span
style='font-family:宋体;"Times New Roman"'>、</span><span lang=EN-US>G</span><span style='font-family:
宋体;"Times New Roman"'>、</span><span
lang=EN-US>B</span><span style='font-family:宋体;
"Times New Roman"'>值反转。若颜色的量化级别是</span><span lang=EN-US>256</span><span
style='font-family:宋体;"Times New Roman"'>,则新图的</span><span lang=EN-US>R</span><span style='font-family:
宋体;"Times New Roman"'>、</span><span
lang=EN-US>G</span><span style='font-family:宋体;
"Times New Roman"'>、</span><span lang=EN-US>B</span><span
style='font-family:宋体;"Times New Roman"'>值为</span><span lang=EN-US>255</span><span style='font-family:
宋体;"Times New Roman"'>减去原图的</span><span
lang=EN-US>R</span><span style='font-family:宋体;
"Times New Roman"'>、</span><span lang=EN-US>G</span><span
style='font-family:宋体;"Times New Roman"'>、</span><span lang=EN-US>B</span><span style='font-family:
宋体;"Times New Roman"'>值。这里针对的是所有图,包括真彩图、带调色板的彩色图</span><span
lang=EN-US>(</span><span style='font-family:宋体;
"Times New Roman"'>又称为伪彩色图</span><span lang=EN-US>)</span><span
style='font-family:宋体;"Times New Roman"'>、和灰度图。针对不同种类有不同的处理。</span></p>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>先看看真彩图。我们知道真彩图不带调色板,每个象素用</span><span lang=EN-US>3</span><span
style='font-family:宋体;"Times New Roman"'>个字节,表示</span><span lang=EN-US>R</span><span
style='font-family:宋体;"Times New Roman"'>、</span><span lang=EN-US>G</span><span style='font-family:
宋体;"Times New Roman"'>、</span><span
lang=EN-US>B</span><span style='font-family:宋体;
"Times New Roman"'>三个分量。所以处理很简单,把反转后的</span><span
lang=EN-US>R</span><span style='font-family:宋体;
"Times New Roman"'>、</span><span lang=EN-US>G</span><span
style='font-family:宋体;"Times New Roman"'>、</span><span lang=EN-US>B</span><span style='font-family:
宋体;"Times New Roman"'>值写入新图即可。</span></p>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>再来看看带调色板的彩色图,我们知道位图中的数据只是对应调色板中的一个索引值,我们只需要将调色板中的颜色反转,形成新调色板,而位图数据不用动,就能够实现反转。</span></p>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>灰度图是一种特殊的伪彩色图,只不过调色板中的</span><span lang=EN-US>R</span><span
style='font-family:宋体;"Times New Roman"'>、</span><span lang=EN-US>G</span><span style='font-family:
宋体;"Times New Roman"'>、</span><span
lang=EN-US>B</span><span style='font-family:宋体;
"Times New Roman"'>值</span> <span style='font-family:
宋体;"Times New Roman"'>都是一样的而已。所以反转的处理和上面讲的一样。</span></p>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>这里,我想澄清一个概念。过去我们讲二值图时,一直都说成黑白图。二值位图一定是黑白的吗?答案是不一定。我们安装</span><span
lang=EN-US>Windows95</span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>时看到的那幅</span><span
lang=EN-US>setup.bmp</span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>是由蓝色和黑色组成的,但它实际上是二值图。原来,它的调色板中的两种颜色是黑与蓝,而不是黑与白。所以说二值图也可以是彩色的,只不过一般情况下是黑白图而已。</span></p>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>下面的程序实现了反色,注意其中真彩图和调色板位图处理时的差别。</span></p>
<p style='line-height:18.0pt'><span lang=EN-US>BOOL Invert(HWND hWnd)</span></p>
<p style='line-height:18.0pt'><span lang=EN-US>{</span></p>
<p style='line-height:18.0pt'><span> </span>DWORD
OffBits,BufSize;</p>
<p style='line-height:18.0pt'>LPBITMAPINFOHEADER lpImgData;</p>
<p style='line-height:18.0pt'><span> </span>LPSTR
lpPtr;</p>
<p style='line-height:18.0pt'><span> </span>HLOCAL
hTempImgData;</p>
<p style='line-height:18.0pt'><span> </span>LPBITMAPINFOHEADER
lpTempImgData;</p>
<p style='line-height:18.0pt'><span> </span>LPSTR
lpTempPtr;</p>
<p style='line-height:18.0pt'><span> </span>HDC
hDc;</p>
<p style='line-height:18.0pt'><span> </span>HFILE
hf;</p>
<p style='line-height:18.0pt'><span> </span>LONG
x,y;</p>
<p style='line-height:18.0pt'><span> </span> LOGPALETTE
*pPal;</p>
<p style='line-height:18.0pt'><span> </span> HPALETTE
hPrevPalette=NULL; </p>
<p style='line-height:18.0pt'><span> </span>HLOCAL
hPal;</p>
<p style='line-height:18.0pt'><span> </span>DWORD
i;</p>
<p style='line-height:18.0pt'><span> </span>unsigned
char
Red,Green,Blue;</p>
<p style='line-height:18.0pt'><span> </span>OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);</p>
<p style='line-height:18.0pt'><span> </span>BufSize=OffBits+bi.biHeight*LineBytes;
//<span style='font-family:宋体;
"Times New Roman"'>新开缓冲区的大小</span></p>
<p style='line-height:18.0pt'><span> </span>if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)</p>
<p style='line-height:18.0pt'><span
lang=EN-US>{</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>MessageBox(hWnd,"Error alloc memory!","Error
Message",MB_OK|</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>MB_ICONEXCLAMATION);</span></p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -