📄 chap07.htm
字号:
= GetDC(hWnd);</p>
<p style='line-height:18.0pt'><span> </span>rhp
= CreatePenIndirect(&rlp);</p>
<p style='line-height:18.0pt'><span> </span>SelectObject(hDc,rhp);</p>
<p style='line-height:18.0pt'><span> </span>MoveToEx(hDc,MaxdLine.botx,MaxdLine.boty,NULL);</p>
<p style='line-height:18.0pt'><span> </span>//<span
style='font-family:宋体;"Times New Roman"'>在两端点之间画一条红线用来标识</span></p>
<p style='line-height:18.0pt'><span> </span>LineTo(hDc,MaxdLine.topx,MaxdLine.topy);</p>
<p style='line-height:18.0pt'><span> </span> DeleteObject(rhp);
</p>
<p style='line-height:18.0pt'><span> </span> ReleaseDC(hWnd,hDc);</p>
<p style='line-height:18.0pt'><span> </span>//<span
style='font-family:宋体;"Times New Roman"'>释放内存及资源</span></p>
<p style='line-height:18.0pt'><span> </span>GlobalUnlock(hImgData);</p>
<p style='line-height:18.0pt'><span
lang=EN-US>GlobalUnlock(hDistAlpha);</span></p>
<p style='line-height:18.0pt'><span> </span>GlobalFree(hDistAlpha);</p>
<p style='line-height:18.0pt'><span> </span> GlobalUnlock(hMyLine);</p>
<p style='line-height:18.0pt'><span> </span>GlobalFree(hMyLine);</p>
<p style='line-height:18.0pt'><span> </span>return
TRUE;</p>
<p style='line-height:18.0pt'><span lang=EN-US>}</span><span
lang=EN-US style='font-size:9.0pt;'></span></p>
<p style='line-height:18.0pt'><span style='font-family:宋体;
"Times New Roman"'>如果</span><span
lang=EN-US><sub> <img width=13 height=19
src="chap07.files/image047.gif" v:shapes="_x0000_i1055"> </sub> </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><span
lang=EN-US>Hough</span><span style='font-family:宋体;
"Times New Roman"'>变换能够查找任意的曲线,只要你给定它的方程。这里,我们就不详述了。</span></p>
<h2> <span
lang=EN-US>7.3</span> <span lang=EN-US> </span><a name="_Toc486331900"></a><a
name="_Toc486332900"></a><a name="_Toc486339009"></a><a name="_Toc454810874"></a><a
name="_Toc454856648"><span><span>轮廓提取</span></span></a></h2>
<p style='line-height:18.0pt'><span style='font-family:宋体;
"Times New Roman"'>轮廓提取的实例如图</span><span
lang=EN-US>7.9</span><span style='font-family:宋体;
"Times New Roman"'>、图</span><span lang=EN-US>7.10</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 align=center style='text-align:center;line-height:18.0pt'><b><span
lang=EN-US> <img width=224 height=148
src="chap07.files/image049.gif" v:shapes="_x0000_i1056"> </span></b></p>
<p align=center style='text-align:center;line-height:18.0pt'><b><span
style='font-family:宋体;"Times New Roman"'>图</span>7.9
</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 class=a style='line-height:18.0pt'><span lang=EN-US> <img width=224 height=148
src="chap07.files/image051.gif" v:shapes="_x0000_i1057"> </span></p>
<p align=center style='text-align:center;line-height:18.0pt'><b><span
style='font-family:宋体;"Times New Roman"'>图</span>7.10 </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>8</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><span lang=EN-US>256</span><span
style='font-family:宋体;"Times New Roman"'>级灰度图,不过只用到了</span><span lang=EN-US>0</span><span
style='font-family:宋体;"Times New Roman"'>和</span><span lang=EN-US>255</span><span style='font-family:
宋体;"Times New Roman"'>两种颜色。源程序如下:</span></p>
<p style='line-height:18.0pt'><span lang=EN-US>BOOL Outline(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'><span> </span> LPBITMAPINFOHEADER
lpImgData;</p>
<p style='line-height:18.0pt'><span> </span>LPSTR
lpPtr;</p>
<p style='line-height:18.0pt'>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>int
num;</p>
<p style='line-height:18.0pt'><span> </span>int
nw,n,ne,w,e,sw,s,se;</p>
<p style='line-height:18.0pt'><span
lang=EN-US>//</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>0</span><span
style='font-family:宋体;"Times New Roman"'>和</span><span lang=EN-US>255</span><span style='font-family:
宋体;"Times New Roman"'>两种颜色。</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>if( NumColors!=256){ </span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>MessageBox(hWnd,"Must be a mono bitmap with grayscale
palette!",</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>"Error Message",MB_OK|MB_ICONEXCLAMATION);</span></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
lang=EN-US>OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>//BufSize</span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>为缓冲区大小</span></p>
<p style='line-height:18.0pt'><span> </span>BufSize=OffBits+bi.biHeight*LineBytes;</p>
<p style='line-height:18.0pt'><span> </span>//<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> </span>{</p>
<p style='line-height:18.0pt'><span> </span>
MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|</p>
<p style='line-height:
18.0pt'><span lang=EN-US>MB_ICONEXCLAMATION);</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>return FALSE;</span></p>
<p style='line-height:18.0pt'><span> </span>}</p>
<p style='line-height:18.0pt'><span> </span> lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
</p>
<p style='line-height:18.0pt'><span> </span>lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);</p>
<p style='line-height:18.0pt'><span
lang=EN-US>//</span><span style='font-family:宋体;
"Times New Roman"'>拷贝头信息和位图数据</span></p>
<p style='line-height:18.0pt'><span> </span>memcpy(lpTempImgData,lpImgData,BufSize);</p>
<p style='line-height:18.0pt'><span> </span>for
(y=1;y<bi.biHeight-1;y++){ //<span style='font-family:宋体;"Times New Roman";"Times New Roman"'>注意</span><span
lang=EN-US>y</span><span style='font-family:宋体;
"Times New Roman"'>的范围是从</span><span lang=EN-US>1</span><span
style='font-family:宋体;"Times New Roman"'>到高度</span><span lang=EN-US>-2</span></p>
<p style='line-height:18.0pt'><span>
</span>//lpPtr<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>
</span>lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);</p>
<p style='line-height:18.0pt'><span>
</span>lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes);</p>
<p style='line-height:18.0pt'><span>
</span>for (x=1;x<bi.biWidth-1;x++){</p>
<p style='line-height:18.0pt'><span>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -