⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chap05.htm

📁 数字图像处理入门. 一位图像处理高手写的书. 从图像处理的最基础开始,然后慢慢以一些例子做说明,进入图像处理的更高阶段.学习图像处理不可多得的比较朴实的书
💻 HTM
📖 第 1 页 / 共 5 页
字号:

<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:
宋体;&quot;Times New Roman&quot;'>反色后的结果。</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&nbsp;&nbsp;&nbsp;&nbsp;   
          </b><b><span style='font-family:
  宋体;&quot;Times New Roman&quot;'>原图</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&nbsp;&nbsp;&nbsp;&nbsp;   
          </b><b><span style='font-family:
  宋体;&quot;Times New Roman&quot;'>图</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:
宋体;&quot;Times New Roman&quot;'>、</span><span
lang=EN-US>B</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>值反转。若颜色的量化级别是</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:
宋体;&quot;Times New Roman&quot;'>、</span><span
lang=EN-US>G</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>、</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:
宋体;&quot;Times New Roman&quot;'>减去原图的</span><span
lang=EN-US>R</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>、</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:
宋体;&quot;Times New Roman&quot;'>值。这里针对的是所有图,包括真彩图、带调色板的彩色图</span><span
lang=EN-US>(</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>又称为伪彩色图</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:
宋体;&quot;Times New Roman&quot;'>、</span><span
lang=EN-US>B</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>三个分量。所以处理很简单,把反转后的</span><span
lang=EN-US>R</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>、</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:
宋体;&quot;Times New Roman&quot;'>值写入新图即可。</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:
宋体;&quot;Times New Roman&quot;'>、</span><span
lang=EN-US>B</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>值</span> <span style='font-family:  
宋体;&quot;Times New Roman&quot;'>都是一样的而已。所以反转的处理和上面讲的一样。</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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DWORD   
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   
    OffBits,BufSize;</p>
  <p style='line-height:18.0pt'>LPBITMAPINFOHEADER&nbsp;&nbsp;&nbsp; lpImgData;</p>  
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>LPSTR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpPtr;</p>  
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>HLOCAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hTempImgData;</p>  
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>LPBITMAPINFOHEADER&nbsp;&nbsp;&nbsp;   
    lpTempImgData;</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>LPSTR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   
    &nbsp;&nbsp;&nbsp;&nbsp; lpTempPtr;</p>  
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>HDC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   
    &nbsp;&nbsp;&nbsp;&nbsp; hDc;</p>  
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>HFILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hf;</p>  
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>LONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   
    &nbsp;&nbsp;&nbsp;&nbsp; x,y;</p>  
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp; </span>&nbsp; LOGPALETTE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   
    &nbsp;&nbsp;&nbsp; *pPal;</p>  
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp; </span>&nbsp; HPALETTE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hPrevPalette=NULL; </p>  
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>HLOCAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hPal;</p>  
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   
    &nbsp;&nbsp;&nbsp; i;</p>  
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>unsigned   
    char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   
    Red,Green,Blue;</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>BufSize=OffBits+bi.biHeight*LineBytes;   
    //<span style='font-family:宋体;
&quot;Times New Roman&quot;'>新开缓冲区的大小</span></p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </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,&quot;Error alloc memory!&quot;,&quot;Error 
    Message&quot;,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 + -