📄 chap06.htm
字号:
style='font-family:宋体;"Times New Roman"'>释放内存及资源</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>ReleaseDC(hWnd,hDc);</span></p>
<p style='line-height:18.0pt'><span> </span>LocalUnlock(hTempImgData);</p>
<p style='line-height:18.0pt'><span> </span>LocalFree(hTempImgData);</p>
<p style='line-height:18.0pt'><span> </span>GlobalUnlock(hImgData);</p>
<p style='line-height:18.0pt'><span> </span>return
TRUE;</p>
<p style='line-height:18.0pt'><span lang=EN-US>}</span></p>
<h2> <span
lang=EN-US>6.2</span> <span lang=EN-US> </span><a name="_Toc486331893"></a><a
name="_Toc486332893"></a><a name="_Toc486339002"></a><a name="_Toc454810867"></a><a
name="_Toc454856641"><span><span>膨胀</span></span></a></h2>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>膨胀</span><span lang=EN-US>(dilation)</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>a</span><span style='font-family:
宋体;"Times New Roman"'>后得到</span><span
lang=EN-US>B<sub>a</sub></span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>,若</span><span
lang=EN-US>B<sub>a</sub></span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>击中</span><span
lang=EN-US>X</span><span style='font-family:宋体;
"Times New Roman"'>,我们记下这个</span><span lang=EN-US>a</span><span
style='font-family:宋体;"Times New Roman"'>点。所有满足上述条件的</span><span lang=EN-US>a</span><span
style='font-family:宋体;"Times New Roman"'>点组成的集合称做</span><span lang=EN-US>X</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>D(X)={a | Ba</span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>↑</span><span
lang=EN-US>X}=X <img width=13 height=13
src="chap06.files/image037.jpg" v:shapes="_x0000_i1047"> B</span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>,如图</span><span
lang=EN-US>6.13</span><span style='font-family:宋体;
"Times New Roman"'>所示。图</span><span lang=EN-US>6.13</span><span
style='font-family:宋体;"Times New Roman"'>中</span><span lang=EN-US>X</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>a</span><span style='font-family:宋体;
"Times New Roman"'>,</span><span lang=EN-US>B<sub>a</sub></span><span
style='font-family:宋体;"Times New Roman"'>击中</span><span lang=EN-US>X</span><span style='font-family:
宋体;"Times New Roman"'>,所以</span><span
lang=EN-US>X</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>X</span><span
style='font-family:宋体;"Times New Roman"'>的所有范围,就象</span><span lang=EN-US>X</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>B</span><span style='font-family:
宋体;"Times New Roman"'>不是对称的,</span><span
lang=EN-US>X</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>X</span><span
style='font-family:宋体;"Times New Roman"'>被</span><span lang=EN-US> B<sup>v</sup></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>6.14</span><span
style='font-family:宋体;"Times New Roman"'>中,左边是被处理的图象</span><span lang=EN-US>X(</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>B</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>X</span><span style='font-family:
宋体;"Times New Roman"'>上的点及</span><span
lang=EN-US>X</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>X</span><span
style='font-family:宋体;"Times New Roman"'>的范围内,则该点就为黑;右边是膨胀后的结果。可以看出,它包括</span><span lang=EN-US>X</span><span
style='font-family:宋体;"Times New Roman"'>的所有范围,就象</span><span lang=EN-US>X</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> <img width=330 height=283
src="chap06.files/image039.jpg" v:shapes="_x0000_i1048"> </span></p>
<p align=center style='text-align:center;line-height:18.0pt'><b><span
style='font-family:宋体;"Times New Roman"'>图</span>6.13 </b><b><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>膨胀的示意图</span><span
lang=EN-US></span></b></p>
<p align=center style='text-align:center;line-height:18.0pt'><b><span
lang=EN-US> <img width=536 height=203
src="chap06.files/image041.jpg" v:shapes="_x0000_i1049"> </span></b></p>
<p align=center style='text-align:center;line-height:18.0pt'><b><span
style='font-family:宋体;"Times New Roman"'>图</span>6.14 </b><b><span style='font-family:宋体;"Times New Roman";"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>6.15</span><span style='font-family:
宋体;"Times New Roman"'>为图</span><span
lang=EN-US>6.11</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> <img width=352 height=176
src="chap06.files/image043.gif" v:shapes="_x0000_i1050"> </span></p>
<p align=center style='text-align:center;line-height:18.0pt'><b><span
style='font-family:宋体;"Times New Roman"'>图</span>6.15 </b><b><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>图</span><span
lang=EN-US>6.11</span></b><b><span style='font-family:宋体;"Times New Roman";"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>BOOL</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><sub> <img width=63 height=23
src="chap06.files/image044.gif" v:shapes="_x0000_i1051"> </sub> </span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>;否则在垂直方向上进行膨胀运算,即结构元素</span><span
lang=EN-US>B</span><span style='font-family:宋体;
"Times New Roman"'>为</span><span lang=EN-US><sub> <img width=28 height=75
src="chap06.files/image045.gif" v:shapes="_x0000_i1052"> </sub> </span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>。</span></p>
<p style='line-height:18.0pt'><span lang=EN-US>BOOL Dilation(HWND hWnd,BOOL
Hori)</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>unsigned
char
num;</p>
<p style='line-height:18.0pt'><span> </span>int
i;</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'>if( NumColors!=256){ </p>
<p style='line-height:18.0pt'><span> </span>
MessageBox(hWnd,"Must be a mono bitmap with grayscale palette!",</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
lang=EN-US>//</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",</p>
<p style='line-height:18.0pt'><span
lang=EN-US>MB_OK|MB_ICONEXCLAMATION);</sp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -