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

📄 chap04.htm

📁 数字图像处理入门. 一位图像处理高手写的书. 从图像处理的最基础开始,然后慢慢以一些例子做说明,进入图像处理的更高阶段.学习图像处理不可多得的比较朴实的书
💻 HTM
📖 第 1 页 / 共 5 页
字号:
18.0pt'><span lang=EN-US>for(x=0;x&lt;bi.biWidth;x++){</span></p>
  <p style='line-height:
18.0pt'><span lang=EN-US>lpIntPtr=(int *)lpIntBuf+(bi.biHeight-1-y)*LineBytes+x;</span></p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>num=(unsigned char)*lpIntPtr;</p>  
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>if ( num &gt; 128 ){ //128<span style='font-family:宋体;"Times New Roman";"Times New Roman"'>是中值</span></p>  
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>*lpIntPtr=255; //<span style='font-family:宋体;  
&quot;Times New Roman&quot;'>打白点</span></p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>e=(float)(num-255.0); //<span style='font-family:宋体;  
&quot;Times New Roman&quot;'>计算误差</span></p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>}</p>
  <p style='line-height:
18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>else{</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>*lpIntPtr=0; //<span style='font-family:宋体;  
&quot;Times New Roman&quot;'>打黑点</span></p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>e=(float)num; //<span style='font-family:宋体;  
&quot;Times New Roman&quot;'>计算误差</span></p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>}</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>if(x&lt;bi.biWidth-1){ //<span style='font-family:宋体;  
&quot;Times New Roman&quot;'>注意判断边界</span></p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>f=(float)*(lpIntPtr+1);</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>f+=(float)( (3.0/8.0) * e);</p>  
  <p style='line-height:
18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   
    *(lpIntPtr+1)=(int)f; //<span style='font-family:宋体;  
&quot;Times New Roman&quot;'>向左传播</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>if(y&lt;bi.biHeight-1){   
    //<span style='font-family:宋体;
&quot;Times New Roman&quot;'>注意判断边界</span></p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>f=(float)*(lpIntPtr-LineBytes);</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>f+=(float)( (3.0/8.0) * e);</p>  
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>*(lpIntPtr-LineBytes)=(int)f; //<span style='font-family:宋体;  
&quot;Times New Roman&quot;'>向下传播</span></p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>f=(float)*(lpIntPtr-LineBytes+1);</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>f+=(float)( (1.0/4.0) * e);</p>  
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>*(lpIntPtr-LineBytes+1)=(int)f; //<span style='font-family:宋体;  
&quot;Times New Roman&quot;'>向右下传播</span></p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>}</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</p>
  <p style='line-height:18.0pt'><span
lang=EN-US>}</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>//</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>从</span><span lang=EN-US>int</span><span
style='font-family:宋体;"Times New Roman"'>类型的缓冲区拷贝到</span><span lang=EN-US>char</span><span
style='font-family:宋体;"Times New Roman"'>类型的缓冲区</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>for(y=0;y&lt;bi.biHeight;y++){</span></p>
  <p style='line-height:
18.0pt'><span lang=EN-US>lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes);</span></p>
  <p style='line-height:
18.0pt'><span lang=EN-US>lpIntPtr=(int *)lpIntBuf+(bi.biHeight-1-y)*LineBytes;</span></p>
  <p style='line-height:
18.0pt'><span lang=EN-US>for(x=0;x&lt;bi.biWidth;x++){</span></p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>tempnum=*(lpIntPtr++);</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>if(tempnum&gt;255) tempnum=255;</p>  
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>else if (tempnum&lt;0) tempnum=0;</p>  
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>*(lpTempPtr++)=(unsigned char)tempnum;</p>  
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</p>
  <p style='line-height:18.0pt'><span
lang=EN-US>}</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>if(hBitmap!=NULL)</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>DeleteObject(hBitmap);</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>hDc=GetDC(hWnd);</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>//</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>产生新的位图</span><span lang=EN-US> </span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData,</span></p>
  <p style='line-height:
18.0pt'><span lang=EN-US>(LONG)CBM_INIT,</span></p>
  <p style='line-height:
18.0pt'><span lang=EN-US>(LPSTR)lpTempImgData+</span></p>
  <p style='line-height:
18.0pt'><span lang=EN-US>sizeof(BITMAPINFOHEADER)+</span></p>
  <p style='line-height:
18.0pt'><span lang=EN-US>NumColors*sizeof(RGBQUAD),</span></p>
  <p style='line-height:
18.0pt'><span lang=EN-US>(LPBITMAPINFO)lpTempImgData,</span></p>
  <p style='line-height:
18.0pt'><span lang=EN-US>DIB_RGB_COLORS);</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>hf=_lcreat(&quot;c:\\steinberg.bmp&quot;,0);</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>_lwrite(hf,(LPSTR)&amp;bf,sizeof(BITMAPFILEHEADER)); </span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>_lwrite(hf,(LPSTR)lpTempImgData,BufSize);</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>_lclose(hf);</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>//</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>释放内存和资源</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>ReleaseDC(hWnd,hDc);</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>GlobalUnlock(hImgData);</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>LocalUnlock(hTempImgData);</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>LocalFree(hTempImgData);</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>LocalUnlock(hIntBuf);</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>LocalFree(hIntBuf);</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>return TRUE;</span></p>
  <p style='line-height:18.0pt'><span lang=EN-US>}</span></p>
  <p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>要注意的是,误差传播有时会引起流水效应,即误差不断向下,向右累加传播。解决的办法是:奇数行从左到右传播,偶数行从右到左传播。</span></p>
  <h2> <span
lang=EN-US>4.3</span> <span lang=EN-US> </span><a name="_Toc486331880"></a><a  
name="_Toc486332880"></a><a name="_Toc486338989"></a><a name="_Toc454810854"></a><a
name="_Toc454856628"><span><span>将<span lang=EN-US>bmp</span></span></span></a><span><span><span style='font-family:黑体;'>文件转换为</span><span lang=EN-US>txt</span></span></span><span><span><span style='font-family:黑体;'>文件</span></span></span></h2>
  <p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>在讲图案化技术时,我突然想到了一个非常有趣的应用,那就是</span><span lang=EN-US>bmp2txt</span><span
style='font-family:宋体;"Times New Roman"'>。如果你喜欢上</span><span lang=EN-US>BBS(</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>Casper</span><span
style='font-family:宋体;"Times New Roman"'>的签名档</span><span lang=EN-US>(</span><span style='font-family:
宋体;&quot;Times New Roman&quot;'>见图</span><span
lang=EN-US>4.8)</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>,胖乎乎的,是不是特别可爱?</span></p>
  <p class=a style='line-height:18.0pt'><span lang=EN-US> <img width=360 height=289
src="chap04.files/image016.jpg"  v:shapes="_x0000_i1036"> </span></p>
  <p align=center style='text-align:center;line-height:18.0pt'><b><span
style='font-family:宋体;"Times New Roman"'>图</span>4.8&nbsp;&nbsp;&nbsp;&nbsp; Casper</b><b><span
style='font-family:宋体;"Times New Roman"'>的签名档</span><span lang=EN-US></span></b></p>
  <p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>你仔细观察一下,就会发现,这是一幅全部由字符组成的图,因为在</span><span lang=EN-US>BBS</span><span
style='font-family:宋体;"Times New Roman"'>中只能出现文本的东西。那么,这幅图是怎么做出来的呢?难道是自己一个字符一个字符拼出来的。当然不是了,有一种叫</span><span
lang=EN-US>bmp2txt</span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>的应用程序</span><span
lang=EN-US>(2</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>的发音和“</span><span lang=EN-US>to</span><span
style='font-family:宋体;"Times New Roman"'>”一样,所以如此命名</span><span lang=EN-US>)</span><span
style='font-family:宋体;"Times New Roman"'>,能把位图文件转换成和图案很相似的字符文本。是不是觉得很神奇?其实原理很简单,用到了和图案化技术类似的思想:首先将位图分成同样大小的小块,求出每一块灰度的平均值,然后和每个字符的灰度做比较,找出最接近的那个字符,来代表这一小块图象。那么,怎么确定字符的灰度呢?做下面的实验就明白

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -