📄 chap07.htm
字号:
<html>
<!-- Mirrored from www.lgui.net/column/book1/chap07.htm by HTTrack Website Copier/3.x [XR&CO'2005], Mon, 21 Mar 2005 13:20:15 GMT -->
<head>
<meta http-equiv=Content-Type content="text/html; charset=GB2312">
<link rel=Edit-Time-Data href="chap07.files/editdata.html" >
<link rel=OLE-Object-Data href="chap07.files/oledata.mso" >
<title>第7章 边沿检测与提取,轮廓跟踪</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="_Toc486331897"></a><a name="_Toc486332897"></a><a
name="_Toc486339006"></a><a name="_Toc454810871"></a><a name="_Toc454856645"><span><span>第<span
lang=EN-US>7</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>7.1</span> <span lang=EN-US> </span><a name="_Toc486331898"></a><a
name="_Toc486332898"></a><a name="_Toc486339007"></a><a name="_Toc454810872"></a><a
name="_Toc454856646"><span><span>边沿检测</span></span></a></h2>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>我们给出一个模板</span><span lang=EN-US><sub>
<img width=76 height=23
src="chap07.files/image002.gif" v:shapes="_x0000_i1025"> </sub> </span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>和一幅图象</span><span
lang=EN-US><sub> <img width=228 height=96
src="chap07.files/image004.gif" v:shapes="_x0000_i1026"> </sub> </span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>。不难发现原图中左边暗,右边亮,中间存在着一条明显的边界。进行模板操作后的结果如下:</span><span
lang=EN-US><sub> <img width=229 height=96
src="chap07.files/image006.gif" v:shapes="_x0000_i1027"> </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>3</span><span
style='font-family:宋体;"Times New Roman"'>、</span><span lang=EN-US>4</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>0</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>(</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><sub> <img width=36 height=75
src="chap07.files/image008.gif" v:shapes="_x0000_i1035"> </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>45</span><span
style='font-family:宋体;"Times New Roman"'>度方向模板</span><span lang=EN-US><sub> <img width=91 height=75
src="chap07.files/image010.gif" v:shapes="_x0000_i1036"> </sub> </span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>,可以检测出</span><span
lang=EN-US>135</span><span style='font-family:宋体;
"Times New Roman"'>度方向的边沿。</span></p>
<p style='line-height:
18.0pt;'> <b><span
lang=EN-US>1.<span style='font:7.0pt "Times New Roman"'>
</span></span></b> <b><span lang=EN-US>Sobel</span></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>Sobel
</span><span
style='font-family:宋体;"Times New Roman"'>算子。</span><span lang=EN-US>Sobel </span><span
style='font-family:宋体;"Times New Roman"'>算子有两个,一个是检测水平边沿的</span><span lang=EN-US><sub>
<img width=103 height=75
src="chap07.files/image012.gif" v:shapes="_x0000_i1037"> </sub> </span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>;另一个是检测垂直平边沿的</span><span
lang=EN-US><sub> <img width=88 height=75
src="chap07.files/image014.gif" v:shapes="_x0000_i1038"> </sub> </span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>。与</span><span
lang=EN-US><sub> <img width=100 height=75
src="chap07.files/image016.gif" v:shapes="_x0000_i1039"> </sub> </span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>和</span><span
lang=EN-US><sub> <img width=81 height=75
src="chap07.files/image018.gif" v:shapes="_x0000_i1040"> </sub> </span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>相比,</span><span
lang=EN-US>Sobel</span><span style='font-family:宋体;
"Times New Roman"'>算子对于象素的位置的影响做了加权,因此效果更好。</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>Sobel</span><span style='font-family:宋体;
"Times New Roman"'>算子另一种形式是各向同性</span><span lang=EN-US>Sobel(Isotropic
Sobel)</span><span style='font-family:宋体;
"Times New Roman"'>算子,也有两个,一个是检测水平边沿的</span><span
lang=EN-US><sub> <img width=115 height=80
src="chap07.files/image020.gif" v:shapes="_x0000_i1041"> </sub> </span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>,另一个是检测垂直平边沿的</span><span
lang=EN-US><sub> <img width=112 height=75
src="chap07.files/image022.gif" v:shapes="_x0000_i1042"> </sub> </span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>。各向同性</span><span
lang=EN-US>Sobel</span><span style='font-family:宋体;
"Times New Roman"'>算子和普通</span><span lang=EN-US>Sobel</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>7.1</span><span
style='font-family:宋体;"Times New Roman"'>为原图;图</span><span lang=EN-US>7.2</span><span
style='font-family:宋体;"Times New Roman"'>为普通</span><span lang=EN-US>Sobel</span><span
style='font-family:宋体;"Times New Roman"'>算子处理后的结果图;图</span><span lang=EN-US>7.3</span><span
style='font-family:宋体;"Times New Roman"'>为各向同性</span><span lang=EN-US>Sobel</span><span
style='font-family:宋体;"Times New Roman"'>算子处理后的结果图。可以看出</span><span lang=EN-US>Sobel</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=319 height=202
src="chap07.files/image024.jpg" v:shapes="_x0000_i1043"> </span></p>
<p align=center style='text-align:center;line-height:18.0pt'><b><span
style='font-family:宋体;"Times New Roman"'>图</span>7.1 </b><b><span
style='font-family:宋体;"Times New Roman"'>原图</span><span lang=EN-US></span></b></p>
<p align=center style='text-align:center;line-height:18.0pt'><span
lang=EN-US> <img width=319 height=201
src="chap07.files/image026.jpg" v:shapes="_x0000_i1044"> </span></p>
<p align=center style='text-align:center;line-height:18.0pt'><b><span
style='font-family:宋体;"Times New Roman"'>图</span>7.2 </b><b><span
style='font-family:宋体;"Times New Roman"'>普通</span><span lang=EN-US>Sobel</span></b><b><span
style='font-family:宋体;"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=316 height=200
src="chap07.files/image028.jpg" v:shapes="_x0000_i1045"> </span></b></p>
<p align=center style='text-align:center;line-height:18.0pt'><b><span
style='font-family:宋体;"Times New Roman"'>图</span>7.3 </b><b><span
style='font-family:宋体;"Times New Roman"'>各向同性</span><span lang=EN-US>Sobel</span></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>3</span><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>3</span><span style='font-family:
宋体;"Times New Roman"'>模板操作函数</span><span
lang=EN-US>TemplateOperation</span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>,所做的操作只是增加几个常量标识及其对应的模板数组,这里就不再给出了。</span></p>
<p style='line-height:
18.0pt;'> <b><span
lang=EN-US>2.<span style='font:7.0pt "Times New Roman"'>
</span></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>(</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>(LOG)</span><span style='font-family:宋体;
"Times New Roman"'>算子。它把我们在第</span><span lang=EN-US>3</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>LOG</span><span style='font-family:
宋体;"Times New Roman"'>算子是</span><span
lang=EN-US>5</span><span style='font-family:宋体;
"Times New Roman"'>×</span><span lang=EN-US>5</span><span
style='font-family:宋体;"Times New Roman"'>的模板,如下所示</span><span lang=EN-US><sub>
<img width=187 height=120
src="chap07.files/image030.gif" v:shapes="_x0000_i1046"> </sub> </span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>。到中心点的距离与位置加权系数的关系用曲线表示为图</span><span
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -