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

📄 chap08.htm

📁 数字图像处理入门. 一位图像处理高手写的书. 从图像处理的最基础开始,然后慢慢以一些例子做说明,进入图像处理的更高阶段.学习图像处理不可多得的比较朴实的书
💻 HTM
📖 第 1 页 / 共 4 页
字号:
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;   
    return FALSE;</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></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>lpSecondImgData=(LPBITMAPINFOHEADER)GlobalLock(hSecond);</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>BITMAPINFOHEADER</span><span
style='font-family:宋体;"Times New Roman"'>结构开始的地方</span></p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>_llseek(hf,sizeof(BITMAPFILEHEADER),FILE_BEGIN);</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//<span
style='font-family:宋体;"Times New Roman"'>读入头信息和位图数据</span></p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>_lread(hf,(LPSTR)lpSecondImgData,BufSize);</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>_lclose(hf);</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//<span
style='font-family:宋体;"Times New Roman"'>为结果图缓冲区分配内存</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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>MessageBox(hWnd,&quot;Error   
    alloc memory!&quot;,&quot;Error Message&quot;,</p>  
  <p style='line-height:
18.0pt'><span lang=EN-US>MB_OK|MB_ICONEXCLAMATION);</span></p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>GlobalUnlock(hSecond);</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>GlobalFree(hSecond);</p>
  <p style='line-height:
18.0pt'><span lang=EN-US>return FALSE;</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>}</span></p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp; </span>&nbsp; lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);&nbsp;&nbsp;&nbsp;   
  </p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//<span
style='font-family:宋体;"Times New Roman"'>新图缓冲区初始化为</span><span lang=EN-US>255</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>memset(lpTempImgData,(BYTE)255,BufSize);</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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>memcpy(lpTempImgData,lpImgData,OffBits);</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>for(y=0;y&lt;bi.biHeight;y++){</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>pos=(BufSize-LineBytes-y*LineBytes);</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>//lpPtr<span
style='font-family:宋体;"Times New Roman"'>指向第一幅图,</span><span lang=EN-US>lpSecondPtr</span><span
style='font-family:宋体;"Times New Roman"'>指向第二幅图,</span><span lang=EN-US>lpTempPtr</span><span
style='font-family:宋体;"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; 
    </span>lpPtr=(char *)lpImgData+pos;</p>  
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>lpSecondPtr=(char *)lpSecondImgData+pos;</p>  
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>lpTempPtr=(char *)lpTempImgData+pos;</p>  
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    </span>for(x=0;x&lt;bi.biWidth;x++){</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;&nbsp; 
    </span>num=(unsigned char)*(lpPtr++);</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;&nbsp; 
    </span>num-=(unsigned char)*(lpSecondPtr++);</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;&nbsp; 
    </span>*(lpTempPtr++)=(unsigned char)fabs(num); </p>  
  <p style='line-height:
18.0pt'><span lang=EN-US>//</span><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; 
    </span>}</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp; </span>&nbsp; if(hBitmap!=NULL)</p>  
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;   
    DeleteObject(hBitmap);</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>hDc=GetDC(hWnd);</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//<span
style='font-family:宋体;"Times New Roman"'>创立一个新的位图</span></p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData,</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:\\subtract.bmp&quot;,0);</span></p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>_lwrite(hf,(LPSTR)&amp;bf,sizeof(BITMAPFILEHEADER)); 
  </p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>_lwrite(hf,(LPSTR)lpTempImgData,BufSize);</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>_lclose(hf);</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//<span
style='font-family:宋体;"Times New Roman"'>释放内存和资源</span></p>
  <p style='line-height:18.0pt'><span>&nbsp;</span>&nbsp;&nbsp;&nbsp;&nbsp; ReleaseDC(hWnd,hDc);</p>  
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>GlobalUnlock(hSecond);</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>GlobalFree(hSecond);</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>LocalUnlock(hTempImgData);</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>LocalFree(hTempImgData);</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>GlobalUnlock(hImgData);</p>
  <p style='line-height:18.0pt'><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return   
    TRUE;</p>
  <p style='line-height:18.0pt'><span lang=EN-US>}</span></p>
  <h2> <span
lang=EN-US>8.3</span> <span lang=EN-US> </span><a name="_Toc486331906"></a><a  
name="_Toc486332906"></a><a name="_Toc486339015"></a><a name="_Toc454810880"></a><a
name="_Toc454856654"><span><span>模板匹配</span></span></a></h2>
  <p style='line-height:18.0pt'><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:宋体;
&quot;Times New Roman&quot;'>最开始时,模板的左上角点和图象的左上角点是重合的,拿模板和原图象中同样大小的一块区域去对比,然后平移到下一个象素,仍然进行同样的操作,</span><span
lang=EN-US>……</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>所有的位置都对完后,差别最小的那块就是我们要找的物体。</span></p>
  <p style='line-height:18.0pt'><span style='font-family:宋体;
&quot;Times New Roman&quot;'>我们用平方误差之和来衡量原图中的块和模板之间的差别。假设模板的大小为</span><span
lang=EN-US>m×n(</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>宽</span><span lang=EN-US>×</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>Width×Height</span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>。模板中的某点坐标为</span><span
lang=EN-US>(x<sub>0</sub>,y<sub>0</sub>)</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>,该点的灰度为</span><span
lang=EN-US>U(x<sub>0</sub>,y<sub>0</sub>)</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>;与之重合的图象中的点坐标为</span><span
lang=EN-US>(X<sub>0</sub>-x<sub>0</sub>,Y<sub>0</sub>-y<sub>0</sub>)</span><span
style='font-family:宋体;"Times New Roman"'>,该点的灰度为</span><span lang=EN-US>V(X<sub>0</sub>-x<sub>0</sub>,Y<sub>0</sub>-y<sub>0</sub>)</span><span
style='font-family:宋体;"Times New Roman"'>。则一次匹配的结果为:</span></p>
  <p align=center style='text-align:center;line-height:18.0pt'><span
lang=EN-US><sub> <img width=264 height=48
src="chap08.files/image017.gif"  v:shapes="_x0000_i1033"> </sub> </span></p>
  <p style='line-height:18.0pt'><span style='font-family:宋体;
&quot;Times New Roman&quot;'>全部图象都匹配后,找到最小的即为结果。可以看到模板匹配的运算量是惊人的。一次匹配都要做</span><span
lang=EN-US>m×n</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>次减法,</span><span lang=EN-US>m×n</span><span
style='font-family:宋体;"Times New Roman"'>次平方,</span><span lang=EN-US>m×n-1</span><span
style='font-family:宋体;"Times New Roman"'>次加法,整个图象要匹配</span><span lang=EN-US>(Width-m+1) 
    ×(Height-n+1)</span><span
style='font-family:宋体;"Times New Roman"'>次。</span></p>
  <p style='line-height:18.0pt'><span style='font-family:宋体;
&quot;Times New Roman&quot;'>源程序不再给出,有兴趣的读者可以自己完成。</span></p>
</div>
<div style="display: block; font-family: Verdana, Geneva, Arial; font-size: 10px">
The University of Southern California does not screen or control the content on this website and thus does not guarantee the accuracy, integrity, or quality of such content.  All content on this website is provided by and is the sole responsibility of the person from which such content originated, and such content does not necessarily reflect the opinions of the University administration or the Board of Trustees
</div>
</body>

<!-- Mirrored from www.lgui.net/column/book1/chap08.htm by HTTrack Website Copier/3.x [XR&CO'2005], Mon, 21 Mar 2005 13:20:24 GMT -->
</html>

⌨️ 快捷键说明

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