您的位置:首页 > 编程语言 > Python开发

OpenCV-Python教程(9)(10)(11): 使用霍夫变换检测直线 直方图均衡化 轮廓检测

2018-01-05 20:17 691 查看
<div class="article_content tracking-ad" id="article_content" data-mod="popu_307" data-dsm="post">
<h1><a name="t0"></a><span style="font-size:32px">OpenCV-Python教程(9、使用霍夫变换检测直线)</span></h1>

<p></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

相比C++而言,<a title="Python知识库" class="replace_word" style="color:rgb(223,52,52); text-decoration:none; font-weight:bold" href="http://lib.csdn.net/base/11" target="_blank">Python</a>适合做原型。本系列的文章介绍如何在Python中用OpenCV图形库,以及与C++调用相应OpenCV函数的不同之处。这篇文章介绍在Python中使用OpenCV的霍夫变换检测直线。<strong><br>

</strong></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<strong>提示:</strong><br>

</p>

<ul style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<li>转载请详细注明原作者及出处,谢谢!<br>

</li><li>本文介绍在OpenCV-Python中使用霍夫变换检测直线的方法。</li><li>本文不介详细的理论知识,读者可从其他资料中获取相应的背景知识。笔者推荐清华大学出版社的《<a style="color:rgb(51,102,153); text-decoration:none" href="http://www.amazon.cn/%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86%E4%B8%8E%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E7%AE%97%E6%B3%95%E5%8F%8A%E5%BA%94%E7%94%A8-%E5%B8%95%E7%A7%91%E5%B0%94/dp/B0083PY050/ref=sr_1_1?ie=UTF8&qid=1373614562&sr=8-1&keywords=%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86%E4%B8%8E%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E7%AE%97%E6%B3%95%E5%8F%8A%E5%BA%94%E7%94%A8%28%E7%AC%AC2%E7%89%88%29"
target="_blank"><span class="lrg"></span><span class="med reg"></span>图像处理与计算机视觉算法及应用(第2版)</a> 》。</li></ul>

<h2 style="margin:0px; padding:0px; color:rgb(51,51,51); font-family:Arial; line-height:26px"><a name="t1"></a>

<a name="t0" style="color:rgb(51,102,153)" target="_blank"></a>霍夫变换<br>

</h2>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

Hough变换是经典的检测直线的算法。其最初用来检测图像中的直线,同时也可以将其扩展,以用来检测图像中简单的结构。<br>

</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

OpenCV提供了两种用于直线检测的Hough变换形式。其中基本的版本是cv2.HoughLines。其输入一幅含有点集的二值图(由非0像素表示),其中一些点互相联系组成直线。通常这是通过如Canny算子获得的一幅边缘图像。cv2.HoughLines函数输出的是[float, float]形式的ndarray,其中每个值表示检测到的线(ρ , θ)中浮点点值的参数。下面的例子首先使用Canny算子获得图像边缘,然后使用Hough变换检测直线。其中HoughLines函数的参数3和4对应直线搜索的步长。在本例中,函数将通过步长为1的半径和步长为π/180的角来搜索所有可能的直线。最后一个参数是经过某一点曲线的数量的阈值,超过这个阈值,就表示这个交点所代表的参数对(rho,

theta)在原图像中为一条直线。具体理论可参考<a style="color:rgb(51,102,153); text-decoration:none" href="http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html" target="_blank">这篇文章</a>。</p>

<div class="dp-highlighter bg_python" style="font-family:Consolas,'Courier New',Courier,mono,serif; width:700.906px; overflow:auto; padding-top:1px; color:rgb(51,51,51); line-height:26px; margin:18px 0px!important; background-color:rgb(231,229,220)">

<div class="bar" style="padding-left:45px">

<div class="tools" style="padding:3px 8px 10px 10px; font-size:9px; line-height:normal; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; color:silver; border-left-width:3px; border-left-style:solid; border-left-color:rgb(108,226,108); background-color:rgb(248,248,248)">

<strong>[python]</strong> <a title="view plain" class="ViewSource" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px;
background-color:inherit" href="http://blog.csdn.net/sunny2038/article/details/9253823#" target="_blank">view

plain</a><span> <a title="copy" class="CopyToClipboard" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px; background-color:inherit"
href="http://blog.csdn.net/sunny2038/article/details/9253823#" target="_blank">copy</a><div style="left: 487px; top: 938px; width: 18px; height: 18px; position: absolute; z-index: 99;"><embed name="ZeroClipboardMovie_1" width="18" height="18" align="middle"
id="ZeroClipboardMovie_1" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" wmode="transparent" flashvars="id=1&width=18&height=18"
allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false"></div></span>

<div style="position:absolute; left:587px; top:1083px; width:18px; height:18px; z-index:99">

</div>

<span></span></div>

</div>

<ol class="dp-py" style="padding:0px; border:none; color:rgb(92,92,92); margin:0px 0px 1px 45px!important; background-color:rgb(255,255,255)" start="1">

<li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#coding=utf-8</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-lea
4000
ding-zero outside; line-height:18px; margin:0px!important;
padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">import</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> cv2  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit;
line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">import</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> numpy as np    </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">img = cv2.imread(<span class="string" style="margin:0px; padding:0px; border:none; color:blue; background-color:inherit">"/home/sunny/workspace/images/road.jpg"</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">, </span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">)  </span></span></li><li
style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">img = cv2.GaussianBlur(img,(<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">3</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">,</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">3</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">),</span><span class="number" style="margin:0px;
padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">)  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108);
list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">edges = cv2.Canny(img, <span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">50</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">, </span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">150</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">, apertureSize = </span><span
class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">3</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">)  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none
none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">lines = cv2.HoughLines(edges,<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">1</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">,np.pi/</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">180</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">,</span><span class="number"
style="margin:0px; padding:0px; border:none; background-color:inherit">118</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">) </span><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0);
background-color:inherit">#这里对最后一个参数使用了经验型的值</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108);
list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">result = img.copy()  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108);
list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">for</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> line </span><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">in</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit"> lines[</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">]:  </span></span></li><li
style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">    rho = line[<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit">] </span><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#第一个元素是距离rho</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li
class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">    theta= line[<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">1</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">] </span><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#第二个元素是角度theta</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li
style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">    <span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">print</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit"> rho  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">    <span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">print</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit"> theta  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">    <span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">if</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">  (theta < (np.pi/</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">4.</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit"> )) </span><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">or</span><span style="margin:0px; padding:0px; border:none; background-color:inherit"> (theta > (</span><span
class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">3.</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">*np.pi/</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">4.0</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">)): </span><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#垂直直线</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit">  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important;
padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">                <span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0);
background-color:inherit">#该直线与第一行的交点</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108);
list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">        pt1 = (int(rho/np.cos(theta)),<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span
style="margin:0px; padding:0px; border:none; backgr
1cca7
ound-color:inherit">)  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">        <span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#该直线与最后一行的焦点</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">        pt2 = (int((rho-result.shape[<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">]*np.sin(theta))/np.cos(theta)),result.shape[</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">])  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">        <span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#绘制一条白线</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">        cv2.line( result, pt1, pt2, (<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">255</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">))  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">    <span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">else</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">: </span><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#水平直线</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px
0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">        <span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit"># 该直线与第一列的交点</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">        pt1 = (<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">,int(rho/np.sin(theta)))  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">        <span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#该直线与最后一列的交点</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">        pt2 = (result.shape[<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">1</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">], int((rho-result.shape[</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">1</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit">]*np.cos(theta))/np.sin(theta)))  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important;
padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">        <span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#绘制一条直线</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">        cv2.line(result, pt1, pt2, (<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">255</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">), </span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">1</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">)  </span></span></li><li
style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">cv2.imshow(<span class="string" style="margin:0px; padding:0px; border:none; color:blue; background-color:inherit">'Canny'</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">, edges )  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important;
padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">cv2.imshow(<span class="string" style="margin:0px; padding:0px; border:none; color:blue; background-color:inherit">'Result'</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">, result)  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit;
line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">cv2.waitKey(<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">)  </span></span></li><li
style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">cv2.destroyAllWindows()  </span></li></ol>

</div>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

结果如下:</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<img style="border:none; max-width:100%" alt="" src="https://img-blog.csdn.net/20130712153232796?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VubnkyMDM4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast"><br>

</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<span style="font-size:24px"><strong>注意:</strong></span></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

在C++中,HoughLines函数得到的结果是一个向量lines,其中的元素是由两个元素组成的子向量(rho, theta),所以lines的访问方式类似二维数组。因此,可以以类似:</p>

<div class="dp-highlighter bg_cpp" style="font-family:Consolas,'Courier New',Courier,mono,serif; width:700.906px; overflow:auto; padding-top:1px; color:rgb(51,51,51); line-height:26px; margin:18px 0px!important; background-color:rgb(231,229,220)">

<div class="bar" style="padding-left:45px">

<div class="tools" style="padding:3px 8px 10px 10px; font-size:9px; line-height:normal; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; color:silver; border-left-width:3px; border-left-style:solid; border-left-color:rgb(108,226,108); background-color:rgb(248,248,248)">

<strong>[cpp]</strong> <a title="view plain" class="ViewSource" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px; background-color:inherit"
href="http://blog.csdn.net/sunny2038/article/details/9253823#" target="_blank">view

plain</a><span> <a title="copy" class="CopyToClipboard" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px; background-color:inherit"
href="http://blog.csdn.net/sunny2038/article/details/9253823#" target="_blank">copy</a><div style="left: 470px; top: 2115px; width: 18px; height: 18px; position: absolute; z-index: 99;"><embed name="ZeroClipboardMovie_2" width="18" height="18" align="middle"
id="ZeroClipboardMovie_2" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" wmode="transparent" flashvars="id=2&width=18&height=18"
allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false"></div></span>

<div style="position:absolute; left:563px; top:2302px; width:18px; height:18px; z-index:99">

</div>

<span></span></div>

</div>

<ol class="dp-cpp" style="padding:0px; border:none; color:rgb(92,92,92); margin:0px 0px 1px 45px!important; background-color:rgb(255,255,255)" start="1">

<li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span style="margin:0px; padding:0px; border:none; background-color:inherit">std::vector<cv::Vec2f>::const_iterator it= lines.begin();  </span></span></li><li
style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="datatypes" style="margin:0px; padding:0px; border:none; color:rgb(46,139,87); font-weight:bold; background-color:inherit">float</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> rho= (*it)[0];  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="datatypes" style="margin:0px; padding:0px; border:none; color:rgb(46,139,87); font-weight:bold; background-color:inherit">float</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> theta= (*it)[1];  </span></span></li></ol>

</div>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

这样的方式访问rho和theta。</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

而在Python中,返回的是一个三维的np.ndarray!。可通过检验HoughLines返回的lines的ndim属性得到。如:</p>

<div class="dp-highlighter bg_python" style="font-family:Consolas,'Courier New',Courier,mono,serif; width:700.906px; overflow:auto; padding-top:1px; color:rgb(51,51,51); line-height:26px; margin:18px 0px!important; background-color:rgb(231,229,220)">

<div class="bar" style="padding-left:45px">

<div class="tools" style="padding:3px 8px 10px 10px; font-size:9px; line-height:normal; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; color:silver; border-left-width:3px; border-left-style:solid; border-left-color:rgb(108,226,108); background-color:rgb(248,248,248)">

<strong>[python]</strong> <a title="view plain" class="ViewSource" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px;
background-color:inherit" href="http://blog.csdn.net/sunny2038/article/details/9253823#" target="_blank">view

plain</a><span> <a title="copy" class="CopyToClipboard" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px; background-color:inherit"
href="http://blog.csdn.net/sunny2038/article/details/9253823#" target="_blank">copy</a><div style="left: 487px; top: 2290px; width: 18px; height: 18px; position: absolute; z-index: 99;"><embed name="ZeroClipboardMovie_3" width="18" height="18" align="middle"
id="ZeroClipboardMovie_3" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" wmode="transparent" flashvars="id=3&width=18&height=18"
allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false"></div></span>

<div style="position:absolute; left:587px; top:2491px; width:18px; height:18px; z-index:99">

</div>

<span></span></div>

</div>

<ol class="dp-py" style="padding:0px; border:none; color:rgb(92,92,92); margin:0px 0px 1px 45px!important; background-color:rgb(255,255,255)" start="1">

<li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span style="margin:0px; padding:0px; border:none; background-color:inherit">lines = cv2.HoughLines(edges,</span><span class="number" style="margin:0px; padding:0px;
border:none; background-color:inherit">1</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">,np.pi/</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">180</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit">,</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">118</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">)  </span></span></li><li
style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">print</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> lines.ndim  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#将得到3</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit">  </span></span></li></ol>

</div>

<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">至于为什么是三维的,这和NumPy中ndarray的属性有关(关于NumPy的相关内容,请移步至</span><a style="color:rgb(51,102,153); text-decoration:none; font-family:Arial; font-size:14px; line-height:26px" href="http://blog.csdn.net/sunny2038/article/details/9002531"
target="_blank">NumPy简明教程</a><span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">),如果将HoughLines检测到的的结果输出,就一目了然了:</span>

<div class="dp-highlighter bg_python" style="font-family:Consolas,'Courier New',Courier,mono,serif; width:700.906px; overflow:auto; padding-top:1px; color:rgb(51,51,51); line-height:26px; margin:18px 0px!important; background-color:rgb(231,229,220)">

<div class="bar" style="padding-left:45px">

<div class="tools" style="padding:3px 8px 10px 10px; font-size:9px; line-height:normal; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; color:silver; border-left-width:3px; border-left-style:solid; border-left-color:rgb(108,226,108); background-color:rgb(248,248,248)">

<strong>[python]</strong> <a title="view plain" class="ViewSource" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px;
background-color:inherit" href="http://blog.csdn.net/sunny2038/article/details/9253823#" target="_blank">view

plain</a><span> <a title="copy" class="CopyToClipboard" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px; background-color:inherit"
href="http://blog.csdn.net/sunny2038/article/details/9253823#" target="_blank">copy</a><div style="left: 487px; top: 2465px; width: 18px; height: 18px; position: absolute; z-index: 99;"><embed name="ZeroClipboardMovie_4" width="18" height="18" align="middle"
id="ZeroClipboardMovie_4" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" wmode="transparent" flashvars="id=4&width=18&height=18"
allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false"></div></span>

<div style="position:absolute; left:587px; top:2666px; width:18px; height:18px; z-index:99">

</div>

<span></span></div>

</div>

<ol class="dp-py" style="padding:0px; border:none; color:rgb(92,92,92); margin:0px 0px 1px 45px!important; background-color:rgb(255,255,255)" start="1">

<li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#上面例子中检测到的lines的数据</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important;
padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">3</span><span style="margin:0px; padding:0px; border:none; background-color:inherit"> </span><span
class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#lines.ndim属性</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li style="border-left-width:3px;
border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">(<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">1</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">, </span><span
class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">5</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">, </span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">2</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">) </span><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#lines.shape属性</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  </span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#lines[0]</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">[[  <span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">4.20000000e</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit">+</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">01</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">   </span><span class="number"
style="margin:0px; padding:0px; border:none; background-color:inherit">2.14675498e</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">+</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">00</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">]  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"> [  <span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">4.50000000e</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">+</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">01</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">   </span><span
class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">2.14675498e</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">+</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">00</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">]  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"> [  <span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">3.50000000e</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">+</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">01</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">   </span><span
class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">2.16420817e</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">+</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">00</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">]  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"> [  <span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">1.49000000e</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">+</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">02</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">   </span><span
class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">1.60570288e</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">+</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">00</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">]  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"> [  <span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">2.24000000e</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">+</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">02</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">   </span><span
class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">1.74532920e</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">-</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">01</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">]]  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">===============  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#lines本身</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px
0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">[[[  <span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">4.20000000e</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit">+</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">01</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">   </span><span class="number"
style="margin:0px; padding:0px; border:none; background-color:inherit">2.14675498e</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">+</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">00</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">]  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  [  <span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">4.50000000e</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">+</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">01</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">   </span><span
class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">2.14675498e</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">+</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">00</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">]  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  [  <span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">3.50000000e</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">+</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">01</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">   </span><span
class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">2.16420817e</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">+</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">00</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">]  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  [  <span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">1.49000000e</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">+</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">02</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">   </span><span
class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">1.60570288e</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">+</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">00</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">]  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  [  <span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">2.24000000e</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">+</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">02</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">   </span><span
class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">1.74532920e</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">-</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">01</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">]]]  </span></span></li></ol>

</div>

<h2 style="margin:0px; padding:0px; color:rgb(51,51,51); font-family:Arial; line-height:26px"><a name="t2"></a>

<a name="t1" style="color:rgb(51,102,153)" target="_blank"></a>概率霍夫变换</h2>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

观察前面的例子得到的结果图片,其中Hough变换看起来就像在图像中查找对齐的边界像素点集合。但这样会在一些情况下导致虚假检测,如像素偶然对齐或多条直线穿过同样的对齐像素造成的多重检测。</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

要避免这样的问题,并检测图像中分段的直线(而不是贯穿整个图像的直线),就诞生了Hough变化的改进版,即概率Hough变换(Probabilistic Hough)。在OpenCV中用函数cv::HoughLinesP 实现。如下:</p>

<div class="dp-highlighter bg_python" style="font-family:Consolas,'Courier New',Courier,mono,serif; width:700.906px; overflow:auto; padding-top:1px; color:rgb(51,51,51); line-height:26px; margin:18px 0px!important; background-color:rgb(231,229,220)">

<div class="bar" style="padding-left:45px">

<div class="tools" style="padding:3px 8px 10px 10px; font-size:9px; line-height:normal; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; color:silver; border-left-width:3px; border-left-style:solid; border-left-color:rgb(108,226,108); background-color:rgb(248,248,248)">

<strong>[python]</strong> <a title="view plain" class="ViewSource" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px;
background-color:inherit" href="http://blog.csdn.net/sunny2038/article/details/9253823#" target="_blank">view

plain</a><span> <a title="copy" class="CopyToClipboard" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px; background-color:inherit"
href="http://blog.csdn.net/sunny2038/article/details/9253823#" target="_blank">copy</a><div style="left: 487px; top: 2988px; width: 18px; height: 18px; position: absolute; z-index: 99;"><embed name="ZeroClipboardMovie_5" width="18" height="18" align="middle"
id="ZeroClipboardMovie_5" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" wmode="transparent" flashvars="id=5&width=18&height=18"
allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false"></div></span>

<div style="position:absolute; left:587px; top:3217px; width:18px; height:18px; z-index:99">

</div>

<span></span></div>

</div>

<ol class="dp-py" style="padding:0px; border:none; color:rgb(92,92,92); margin:0px 0px 1px 45px!important; background-color:rgb(255,255,255)" start="1">

<li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#coding=utf-8</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important;
padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">import</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> cv2  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit;
line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">import</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> numpy as np    </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">img = cv2.imread(<span class="string" style="margin:0px; padding:0px; border:none; color:blue; background-color:inherit">"/home/sunny/workspace/images/road.jpg"</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">)  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">img = cv2.GaussianBlur(img,(<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">3</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">,</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">3</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">),</span><span class="number" style="margin:0px;
padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">)  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108);
list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">edges = cv2.Canny(img, <span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">50</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">, </span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">150</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">, apertureSize = </span><span
class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">3</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">)  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none
none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">lines = cv2.HoughLines(edges,<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">1</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">,np.pi/</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">180</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">,</span><span class="number"
style="margin:0px; padding:0px; border:none; background-color:inherit">118</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">)  </span></span></li><li style="border-left-width:3px; border-style:none none none solid;
border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">result = img.copy()  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108);
list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  </span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#经验参数</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit">  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important;
padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">minLineLength = <span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">200</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px
0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">maxLineGap = <span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">15</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit">  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important;
padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">lines = cv2.HoughLinesP(edges,<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">1</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">,np.pi/</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">180</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">,</span><span class="number"
style="margin:0px; padding:0px; border:none; background-color:inherit">80</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">,minLineLength,maxLineGap)  </span></span></li><li style="border-left-width:3px; border-style:none
none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">for</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> x1,y1,x2,y2 </span><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">in</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit"> lines[</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">]:  </span></span></li><li
class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">    cv2.line(img,(x1,y1),(x2,y2),(<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit">,</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">255</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">,</span><span class="number"
style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">),</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">2</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">)  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">cv2.imshow(<span class="string" style="margin:0px; padding:0px; border:none; color:blue; background-color:inherit">'Result'</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">, img)  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important;
padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">cv2.waitKey(<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">)  </span></span></li><li
class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">cv2.destroyAllWindows()  </span></li></ol>

</div>

<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">结果如下:</span>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<img style="border:none; max-width:100%" alt="" src="https://img-blog.csdn.net/20130712153437515?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VubnkyMDM4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast"></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

未完待续。。。</p>

<h2 style="margin:0px; padding:0px; color:rgb(51,51,51); font-family:Arial; line-height:26px"><a name="t3"></a>

<a name="t2" style="color:rgb(51,102,153)" target="_blank"></a>参考资料:</h2>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

1、《Opencv2 Computer Vision Application Programming Cookbook》</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

2、《OpenCV References Manule》</p>

<br>

<p><br>

</p>

<p><br>

</p>

<h1><a name="t4"></a><span style="font-size:32px">OpenCV-Python教程(10、直方图均衡化)</span></h1>

<p></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

相比C++而言,<a title="Python知识库" class="replace_word" style="color:rgb(223,52,52); text-decoration:none; font-weight:bold" href="http://lib.csdn.net/base/11" target="_blank">Python</a>适合做原型。本系列的文章介绍如何在Python中用OpenCV图形库,以及与C++调用相应OpenCV函数的不同之处。这篇文章介绍在Python中使用OpenCV和NumPy对直方图进行均衡化处理。<strong><br>

</strong></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<strong>提示:</strong><br>

</p>

<ul style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<li>转载请详细注明原作者及出处,谢谢!<br>

</li><li>本文不介详细的理论知识,读者可从其他资料中获取相应的背景知识。笔者推荐清华大学出版社的《<a style="color:rgb(51,102,153); text-decoration:none" href="http://www.amazon.cn/%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86%E4%B8%8E%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E7%AE%97%E6%B3%95%E5%8F%8A%E5%BA%94%E7%94%A8-%E5%B8%95%E7%A7%91%E5%B0%94/dp/B0083PY050/ref=sr_1_1?ie=UTF8&qid=1373614562&sr=8-1&keywords=%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86%E4%B8%8E%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E7%AE%97%E6%B3%95%E5%8F%8A%E5%BA%94%E7%94%A8%28%E7%AC%AC2%E7%89%88%29"
target="_blank"><span class="lrg"></span><span class="med reg"></span>图像处理与计算机视觉算法及应用(第2版)</a> 》,对于本节的内容,建议直接参考<a style="color:rgb(51,102,153); text-decoration:none" href="http://zh.wikipedia.org/zh-cn/%E7%9B%B4%E6%96%B9%E5%9B%BE%E5%9D%87%E8%A1%A1%E5%8C%96"
target="_blank">维基百科直方图均衡化</a>,只需看下页面最后的两幅图就能懂了。</li></ul>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<strong>本文内容:</strong><br>

</p>

<ul style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<li>使用查找表拉伸直方图</li><li>使用OpenCV和NumPy的函数以不同的方式进行直方图均衡化<br>

</li></ul>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

在某些情况下,一副图像中大部分像素的强度都集中在某一区域,而质量较高的图像中,像素的强度应该均衡的分布。为此,可将表示像素强度的直方图进行拉伸,将其平坦化。如下:</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<img style="border:none; max-width:100%" alt="" src="http://upload.wikimedia.org/wikipedia/commons/7/71/Histogrammspreizung.png"><br>

图来自维基百科</p>

<h2 style="margin:0px; padding:0px; color:rgb(51,51,51); font-family:Arial; line-height:26px"><a name="t5"></a>

<a name="t0" style="color:rgb(51,102,153)" target="_blank"></a>实验数据</h2>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

本节的实验数据来自维基百科,原图如下:</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<img style="border:none; max-width:100%" alt="" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/08/Unequalized_Hawkes_Bay_NZ.jpg/800px-Unequalized_Hawkes_Bay_NZ.jpg"></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

其直方图为:</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<img style="border:none; max-width:100%" alt="" src="https://img-blog.csdn.net/20130724201943453?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VubnkyMDM4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast"><br>

</p>

<h2 style="margin:0px; padding:0px; color:rgb(51,51,51); font-family:Arial; line-height:26px"><a name="t6"></a>

<a name="t1" style="color:rgb(51,102,153)" target="_blank"></a>使用查找表来拉伸直方图<br>

</h2>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

在图像处理中,直方图均衡化一般用来均衡图像的强度,或增加图像的对比度。在介绍使用直方图均衡化来拉伸图像的直方图之前,先介绍使用查询表的方法。<br>

</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

观察上图中原始图像的直方图,很容易发现大部分强度值范围都没有用到。因此先检测图像非<span style="font-family:'Times New Roman'">0</span><span style="font-family:宋体">的最低(</span><span style="font-family:'Times New Roman'">imin</span><span style="font-family:宋体">)强度值和最高(</span><span style="font-family:'Times
New Roman'">imax</span><span style="font-family:宋体">)强度值。将最低值</span><span style="font-family:'Times New Roman'">imin</span><span style="font-family:宋体">设为</span><span style="font-family:'Times New Roman'">0</span><span style="font-family:宋体">,最高值</span><span
style="font-family:'Times New Roman'">imax</span><span style="font-family:宋体">设为</span><span style="font-family:'Times New Roman'">255</span><span style="font-family:宋体">。中间的按255.0*(i-imin)/(imax-imin)+0.5)的形式设置。</span></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<span style="font-family:宋体">实现的任务主要集中在查询表的创建中,代码如下:</span></p>

<div class="dp-highlighter bg_python" style="font-family:Consolas,'Courier New',Courier,mono,serif; width:700.906px; overflow:auto; padding-top:1px; color:rgb(51,51,51); line-height:26px; margin:18px 0px!important; background-color:rgb(231,229,220)">

<div class="bar" style="padding-left:45px">

<div class="tools" style="padding:3px 8px 10px 10px; font-size:9px; line-height:normal; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; color:silver; border-left-width:3px; border-left-style:solid; border-left-color:rgb(108,226,108); background-color:rgb(248,248,248)">

<strong>[python]</strong> <a title="view plain" class="ViewSource" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px;
background-color:inherit" href="http://blog.csdn.net/sunny2038/article/details/9403059#" target="_blank">view

plain</a><span> <a title="copy" class="CopyToClipboard" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px; background-color:inherit"
href="http://blog.csdn.net/sunny2038/article/details/9403059#" target="_blank">copy</a><div style="left: 487px; top: 5529px; width: 18px; height: 18px; position: absolute; z-index: 99;"><embed name="ZeroClipboardMovie_6" width="18" height="18" align="middle"
id="ZeroClipboardMovie_6" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" wmode="transparent" flashvars="id=6&width=18&height=18"
allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false"></div></span>

<div style="position:absolute; left:587px; top:2466px; width:18px; height:18px; z-index:99">

</div>

<span></span></div>

</div>

<ol class="dp-py" style="padding:0px; border:none; color:rgb(92,92,92); margin:0px 0px 1px 45px!important; background-color:rgb(255,255,255)" start="1">

<li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span style="margin:0px; padding:0px; border:none; background-color:inherit">minBinNo, maxBinNo = </span><span class="number" style="margin:0px; padding:0px;
border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">, </span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">255</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important;
padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#计算从左起第一个不为0的直方图位置</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important;
padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">for</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> binNo, binValue </span><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">in</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> enumerate(hist):  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">    <span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">if</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit"> binValue != </span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit">:  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px
3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">        minBinNo = binNo  </span></li><li class="alt" style="border-left-width:3px; border-style:none none
none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">        <span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">break</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#计算从右起第一个不为0的直方图位置</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">for</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> binNo, binValue </span><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">in</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> enumerate(reversed(hist)):  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">    <span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">if</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit"> binValue != </span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit">:  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important;
padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">        maxBinNo = <span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">255</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">-binNo  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">        <span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">break</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">print</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> minBinNo, maxBinNo  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#生成查找表,方法来自参考文献1第四章第2节</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important;
padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">for</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> i,v </span><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">in</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit"> enumerate(lut):  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">    <span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">print</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit"> i  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">    <span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">if</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit"> i < minBinNo:  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">        lut[i] = <span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">    <span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">elif</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit"> i > maxBinNo:  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">        lut[i] = <span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">255</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">    <span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">else</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">:  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">        lut[i] = int(<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">255.0</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">*(i-minBinNo)/(maxBinNo-minBinNo)+</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0.5</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit">)  </span></span></li></ol>

</div>

<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">查询表创建完成后,就直接调用相应的OpenCV函数即可,这里调用的是cv2.LUT函数:</span>

<div class="dp-highlighter bg_python" style="font-family:Consolas,'Courier New',Courier,mono,serif; width:700.906px; overflow:auto; padding-top:1px; color:rgb(51,51,51); line-height:26px; margin:18px 0px!important; background-color:rgb(231,229,220)">

<div class="bar" style="padding-left:45px">

<div class="tools" style="padding:3px 8px 10px 10px; font-size:9px; line-height:normal; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; color:silver; border-left-width:3px; border-left-style:solid; border-left-color:rgb(108,226,108); background-color:rgb(248,248,248)">

<strong>[python]</strong> <a title="view plain" class="ViewSource" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px;
background-color:inherit" href="http://blog.csdn.net/sunny2038/article/details/9403059#" target="_blank">view

plain</a><span> <a title="copy" class="CopyToClipboard" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px; background-color:inherit"
href="http://blog.csdn.net/sunny2038/article/details/9403059#" target="_blank">copy</a><div style="left: 487px; top: 6038px; width: 18px; height: 18px; position: absolute; z-index: 99;"><embed name="ZeroClipboardMovie_7" width="18" height="18" align="middle"
id="ZeroClipboardMovie_7" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" wmode="transparent" flashvars="id=7&width=18&height=18"
allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false"></div></span>

<div style="position:absolute; left:587px; top:2975px; width:18px; height:18px; z-index:99">

</div>

<span></span></div>

</div>

<ol class="dp-py" style="padding:0px; border:none; color:rgb(92,92,92); margin:0px 0px 1px 45px!important; background-color:rgb(255,255,255)" start="1">

<li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#计算</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px
0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">result = cv2.LUT(image, lut)  </span></li></ol>

</div>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<span style="font-family:宋体">cv2.LUT函数只有两个参数,分别为输入图像和查找表,其返回处理的结果,完整代码如下:</span></p>

<div class="dp-highlighter bg_python" style="font-family:Consolas,'Courier New',Courier,mono,serif; width:700.906px; overflow:auto; padding-top:1px; color:rgb(51,51,51); line-height:26px; margin:18px 0px!important; background-color:rgb(231,229,220)">

<div class="bar" style="padding-left:45px">

<div class="tools" style="padding:3px 8px 10px 10px; font-size:9px; line-height:normal; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; color:silver; border-left-width:3px; border-left-style:solid; border-left-color:rgb(108,226,108); background-color:rgb(248,248,248)">

<strong>[python]</strong> <a title="view plain" class="ViewSource" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px;
background-color:inherit" href="http://blog.csdn.net/sunny2038/article/details/9403059#" target="_blank">view

plain</a><span> <a title="copy" class="CopyToClipboard" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px; background-color:inherit"
href="http://blog.csdn.net/sunny2038/article/details/9403059#" target="_blank">copy</a><div style="left: 487px; top: 6169px; width: 18px; height: 18px; position: absolute; z-index: 99;"><embed name="ZeroClipboardMovie_8" width="18" height="18" align="middle"
id="ZeroClipboardMovie_8" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" wmode="transparent" flashvars="id=8&width=18&height=18"
allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false"></div></span>

<div style="position:absolute; left:587px; top:3106px; width:18px; height:18px; z-index:99">

</div>

<span></span></div>

</div>

<ol class="dp-py" style="padding:0px; border:none; color:rgb(92,92,92); margin:0px 0px 1px 45px!important; background-color:rgb(255,255,255)" start="1">

<li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#coding=utf-8</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important;
padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">import</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> cv2  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit;
line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">import</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> numpy as np  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">image = cv2.imread(<span class="string" style="margin:0px; padding:0px; border:none; color:blue; background-color:inherit">"D:/test/unequ.jpg"</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit">, </span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">)  </span></span></li><li
style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">lut = np.zeros(<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">256</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit">, dtype = image.dtype )</span><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#创建空的查找表</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li
class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">hist= cv2.calcHist([image], <span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#计算图像的直方图</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">    [<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit">], </span><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#使用的通道</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li
class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">    <span class="special" style="margin:0px; padding:0px; border:none; background-color:inherit">None</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit">, </span><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#没有使用mask</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li
style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">    [<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">256</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit">], </span><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#it is a 1D histogram</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li
class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">    [<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0.0</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit">,</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">255.0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">])  </span></span></li><li style="border-left-width:3px;
border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">      </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color
31608
:black; background-color:inherit">minBinNo, maxBinNo = <span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">, </span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">255</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li
style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#计算从左起第一个不为0的直方图柱的位置</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important;
padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">for</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> binNo, binValue </span><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">in</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> enumerate(hist):  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">    <span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">if</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit"> binValue != </span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit">:  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px
3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">        minBinNo = binNo  </span></li><li class="alt" style="border-left-width:3px; border-style:none none
none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">        <span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">break</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#计算从右起第一个不为0的直方图柱的位置</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">for</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> binNo, binValue </span><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">in</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> enumerate(reversed(hist)):  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">    <span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">if</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit"> binValue != </span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit">:  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important;
padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">        maxBinNo = <span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">255</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">-binNo  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">        <span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">break</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">print</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> minBinNo, maxBinNo  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#生成查找表,方法来自参考文献1第四章第2节</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important;
padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">for</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> i,v </span><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">in</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit"> enumerate(lut):  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">    <span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">print</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit"> i  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">    <span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">if</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit"> i < minBinNo:  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">        lut[i] = <span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">    <span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">elif</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit"> i > maxBinNo:  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">        lut[i] = <span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">255</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">    <span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">else</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">:  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">        lut[i] = int(<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">255.0</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">*(i-minBinNo)/(maxBinNo-minBinNo)+</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0.5</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit">)  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px
3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#计算</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px
0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">result = cv2.LUT(image, lut)  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108);
list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">cv2.imshow(<span class="string" style="margin:0px; padding:0px; border:none; color:blue; background-color:inherit">"Result"</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">, result)  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important;
padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">cv2.imwrite(<span class="string" style="margin:0px; padding:0px; border:none; color:blue; background-color:inherit">"LutImage.jpg"</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">, result)  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit;
line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">cv2.waitKey(<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">)  </span></span></li><li
style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">cv2.destroyAllWindows()  </span></li></ol>

</div>

<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">直方图结果如下,可以看到原来占的区域很小的直方图尖峰被移动了:</span>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<span style="font-family:宋体"><img style="border:none; max-width:100%" alt="" src="https://img-blog.csdn.net/20130724210808843?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VubnkyMDM4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast"><br>

</span></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<span style="font-family:宋体">处理结果为:</span></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<span style="font-family:宋体"><img style="border:none; max-width:100%" alt="" src="https://img-blog.csdn.net/20130724210833078?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VubnkyMDM4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast"><br>

</span></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<span style="font-family:宋体">关于直方图的绘制,请参考<a style="color:rgb(51,102,153); text-decoration:none" href="http://blog.csdn.net/sunny2038/article/details/9097989" target="_blank">这篇文章</a>。</span></p>

<h2 style="margin:0px; padding:0px; color:rgb(51,51,51); font-family:Arial; line-height:26px"><a name="t7"></a>

<a name="t2" style="color:rgb(51,102,153)" target="_blank"></a><span style="font-family:宋体">直方图均衡化</span></h2>

<h3 style="margin:0px; padding:0px; color:rgb(51,51,51); font-family:Arial; line-height:26px"><a name="t8"></a>

<a name="t3" style="color:rgb(51,102,153)" target="_blank"></a><span style="font-family:宋体">介绍<br>

</span></h3>

<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">有时图像的视觉上的缺陷并不在强度值集中在很窄的范围内。而是某些强度值的使用频率很大。比如第一幅图中,灰度图中间值的占了很大的比例。</span>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

在完美均衡的直方图中,每个柱的值都应该相等。即<span style="font-family:'Times New Roman'">50%</span><span style="font-family:宋体">的像素值应该小于</span><span style="font-family:'Times New Roman'">128</span><span style="font-family:宋体">,</span><span style="font-family:'Times New Roman'">25%</span><span
style="font-family:宋体">的像素值应该小于</span><span style="font-family:'Times New Roman'">64</span><span style="font-family:宋体">。总结出的经验可定义为:在标准的直方图中</span><span style="font-family:'Times New Roman'">p%</span><span style="font-family:宋体">的像素拥有的强度值一定小于或等于</span><span
style="font-family:'Times New Roman'">255×p%</span><span style="font-family:宋体">。将该规律用于均衡直方图中:强度i</span><span style="font-family:'Times New Roman'"></span><span style="font-family:宋体">的灰度值应该在对应的像素强度值低于</span><span style="font-family:'Times New Roman'">i</span><span
style="font-family:宋体">的百分比的强度中。因此,所需的查询表可以由下面的式子建立:</span></p>

<div class="dp-highlighter bg_python" style="font-family:Consolas,'Courier New',Courier,mono,serif; width:700.906px; overflow:auto; padding-top:1px; color:rgb(51,51,51); line-height:26px; margin:18px 0px!important; background-color:rgb(231,229,220)">

<div class="bar" style="padding-left:45px">

<div class="tools" style="padding:3px 8px 10px 10px; font-size:9px; line-height:normal; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; color:silver; border-left-width:3px; border-left-style:solid; border-left-color:rgb(108,226,108); background-color:rgb(248,248,248)">

<strong>[python]</strong> <a title="view plain" class="ViewSource" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px;
background-color:inherit" href="http://blog.csdn.net/sunny2038/article/details/9403059#" target="_blank">view

plain</a><span> <a title="copy" class="CopyToClipboard" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px; background-color:inherit"
href="http://blog.csdn.net/sunny2038/article/details/9403059#" target="_blank">copy</a><div style="left: 487px; top: 8098px; width: 18px; height: 18px; position: absolute; z-index: 99;"><embed name="ZeroClipboardMovie_9" width="18" height="18" align="middle"
id="ZeroClipboardMovie_9" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" wmode="transparent" flashvars="id=9&width=18&height=18"
allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false"></div></span>

<div style="position:absolute; left:587px; top:5097px; width:18px; height:18px; z-index:99">

</div>

<span></span></div>

</div>

<ol class="dp-py" style="padding:0px; border:none; color:rgb(92,92,92); margin:0px 0px 1px 45px!important; background-color:rgb(255,255,255)" start="1">

<li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span style="margin:0px; padding:0px; border:none; background-color:inherit">lut[i] = int(</span><span class="number" style="margin:0px; padding:0px; border:none;
background-color:inherit">255.0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit"> *p[i]) </span><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#p[i]是是强度值小于或等于i的像素的数目。</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li></ol>

</div>

<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">p[i]即直方图累积值,这是包含小于给点强度值的像素的直方图,以代替包含指定强度值像素的数目。比如第一幅图像的累计直方图如下图中的蓝线:</span>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<img style="border:none; max-width:100%" alt="" src="https://img-blog.csdn.net/20130724220021500?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VubnkyMDM4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast"><br>

</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<span style="font-family:宋体">而完美均衡的直方图,其累积直方图应为一条斜线,如上图中均衡化之后的红线。</span></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<span style="font-family:宋体">更专业一点,这种累积直方图应称为累积分布(cumulative distribition)。在NumPy中有一个专门的函数来计算。这在NumPy实现直方图均衡化一节中介绍。</span></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<span style="font-family:宋体">通过上面的介绍,应该可以明白,直方图均衡化就是对图像使用一种特殊的查询表。在第三个例子中可以看到使用查询表来获得直方图均衡化的效果。</span>通常来说,直方图均衡化大大增加了图像的表象。但根据图像可视内容的不同,不同图像的直方图均衡化产生的效果不尽相同。<br>

</p>

<h3 style="margin:0px; padding:0px; color:rgb(51,51,51); font-family:Arial; line-height:26px"><a name="t9"></a>

<a name="t4" style="color:rgb(51,102,153)" target="_blank"></a><span style="font-family:宋体">直方图均衡化之OpenCV函数实现</span></h3>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<span style="font-family:宋体">用OpenCV实现直方图均衡化很简单,只需调用一个函数即可:</span></p>

<div class="dp-highlighter bg_python" style="font-family:Consolas,'Courier New',Courier,mono,serif; width:700.906px; overflow:auto; padding-top:1px; color:rgb(51,51,51); line-height:26px; margin:18px 0px!important; background-color:rgb(231,229,220)">

<div class="bar" style="padding-left:45px">

<div class="tools" style="padding:3px 8px 10px 10px; font-size:9px; line-height:normal; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; color:silver; border-left-width:3px; border-left-style:solid; border-left-color:rgb(108,226,108); background-color:rgb(248,248,248)">

<strong>[python]</strong> <a title="view plain" class="ViewSource" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px;
background-color:inherit" href="http://blog.csdn.net/sunny2038/article/details/9403059#" target="_blank">view

plain</a><span> <a title="copy" class="CopyToClipboard" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px; background-color:inherit"
href="http://blog.csdn.net/sunny2038/article/details/9403059#" target="_blank">copy</a><div style="left: 487px; top: 8858px; width: 18px; height: 18px; position: absolute; z-index: 99;"><embed name="ZeroClipboardMovie_10" width="18" height="18" align="middle"
id="ZeroClipboardMovie_10" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" wmode="transparent" flashvars="id=10&width=18&height=18"
allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false"></div></span>

<div style="position:absolute; left:587px; top:5993px; width:18px; height:18px; z-index:99">

</div>

<span></span></div>

</div>

<ol class="dp-py" style="padding:0px; border:none; color:rgb(92,92,92); margin:0px 0px 1px 45px!important; background-color:rgb(255,255,255)" start="1">

<li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span style="margin:0px; padding:0px; border:none; background-color:inherit">img = cv2.imread(</span><span class="string" style="margin:0px; padding:0px; border:none;
color:blue; background-color:inherit">'图像路径'</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">,</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit">)  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important;
padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">equ = cv2.equalizeHist(img)  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108);
list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">cv2.imshow(<span class="string" style="margin:0px; padding:0px; border:none; color:blue; background-color:inherit">'equ'</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit">,equ)  </span></span></li></ol>

</div>

<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">这样图像就均衡化了。可以通过</span><a style="color:rgb(51,102,153); text-decoration:none; font-family:Arial; font-size:14px; line-height:26px" href="http://blog.csdn.net/sunny2038/article/details/9097989"
target="_blank">直方图的计算与显示</a><span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">这篇文章中介绍的方法将结果绘制出来。</span>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

</p>

<h3 style="margin:0px; padding:0px; color:rgb(51,51,51); font-family:Arial; line-height:26px"><a name="t10"></a>

<a name="t5" style="color:rgb(51,102,153)" target="_blank"></a><span style="font-family:宋体">直方图均衡化之NumPy函数实现</span></h3>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

通过前面的介绍,可以明白直方图均衡化就是用一种特殊的查找表来实现的。所以这里用NumPy函数,以查找表的方式手动实现图像直方图的均衡化:</p>

<div class="dp-highlighter bg_python" style="font-family:Consolas,'Courier New',Courier,mono,serif; width:700.906px; overflow:auto; padding-top:1px; color:rgb(51,51,51); line-height:26px; margin:18px 0px!important; background-color:rgb(231,229,220)">

<div class="bar" style="padding-left:45px">

<div class="tools" style="padding:3px 8px 10px 10px; font-size:9px; line-height:normal; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; color:silver; border-left-width:3px; border-left-style:solid; border-left-color:rgb(108,226,108); background-color:rgb(248,248,248)">

<strong>[python]</strong> <a title="view plain" class="ViewSource" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px;
background-color:inherit" href="http://blog.csdn.net/sunny2038/article/details/9403059#" target="_blank">view

plain</a><span> <a title="copy" class="CopyToClipboard" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px; background-color:inherit"
href="http://blog.csdn.net/sunny2038/article/details/9403059#" target="_blank">copy</a><div style="left: 487px; top: 9059px; width: 18px; height: 18px; position: absolute; z-index: 99;"><embed name="ZeroClipboardMovie_11" width="18" height="18" align="middle"
id="ZeroClipboardMovie_11" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" wmode="transparent" flashvars="id=11&width=18&height=18"
allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false"></div></span>

<div style="position:absolute; left:587px; top:6248px; width:18px; height:18px; z-index:99">

</div>

<span></span></div>

</div>

<ol class="dp-py" style="padding:0px; border:none; color:rgb(92,92,92); margin:0px 0px 1px 45px!important; background-color:rgb(255,255,255)" start="1">

<li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#coding=utf-8</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important;
padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">import</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> cv2  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit;
line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">import</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> numpy as np  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">image = cv2.imread(<span class="string" style="margin:0px; padding:0px; border:none; color:blue; background-color:inherit">"D:/test/unequ.jpg"</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit">, </span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">)  </span></span></li><li
style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">lut = np.zeros(<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">256</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit">, dtype = image.dtype )</span><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#创建空的查找表</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li
style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">hist,bins = np.histogram(image.flatten(),<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">256</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit">,[</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">,</span><span class="number"
style="margin:0px; padding:0px; border:none; background-color:inherit">256</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">])   </span></span></li><li style="border-left-width:3px; border-style:none none none
solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">cdf = hist.cumsum() <span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#计算累积直方图</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">cdf_m = np.ma.masked_equal(cdf,<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">) </span><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#除去直方图中的0值</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li
style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">cdf_m = (cdf_m - cdf_m.min())*<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">255</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit">/(cdf_m.max()-cdf_m.min())</span><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#等同于前面介绍的lut[i] = int(255.0 *p[i])公式</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">cdf = np.ma.filled(cdf_m,<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">).astype(</span><span class="string" style="margin:0px; padding:0px; border:none; color:blue; background-color:inherit">'uint8'</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">) </span><span
class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#将掩模处理掉的元素补为0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li style="border-left-width:3px;
border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#计算</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px
0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">result2 = cdf[image]  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108);
list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">result = cv2.LUT(image, cdf)  </span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108);
list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">cv2.imshow(<span class="string" style="margin:0px; padding:0px; border:none; color:blue; background-color:inherit">"OpenCVLUT"</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">, result)  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important;
padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">cv2.imshow(<span class="string" style="margin:0px; padding:0px; border:none; color:blue; background-color:inherit">"NumPyLUT"</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">, result2)  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit;
line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">cv2.waitKey(<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">)  </span></span></li><li
style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">cv2.destroyAllWindows()  </span></li></ol>

</div>

<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px"><span style="font-family:宋体">最终结果</span></span><span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px"></span>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<span style="font-family:宋体"><img style="border:none; max-width:100%" alt="" src="https://img-blog.csdn.net/20130724225038937?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VubnkyMDM4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast"><br>

</span></p>

<h2 style="margin:0px; padding:0px; color:rgb(51,51,51); font-family:Arial; line-height:26px"><a name="t11"></a>

<a name="t6" style="color:rgb(51,102,153)" target="_blank"></a><span style="font-family:宋体">验证</span></h2>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<span style="font-family:宋体">比较查找表和OpenCV直方图均衡化生成的直方图:</span></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<span style="font-family:宋体"></span><img style="border:none; max-width:100%" alt="" src="https://img-blog.csdn.net/20130724224352546?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VubnkyMDM4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast"><br>

</p>

<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">可以看出,总体上来看是吻合的,但OpenCV中函数的实现</span><span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">可能</span><span style="color:rgb(51,51,51); font-family:Arial;
font-size:14px; line-height:26px">还有一些细微的差别(有空去翻下源码,不过今天就先到这里了)。</span><br style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<h2 style="margin:0px; padding:0px; color:rgb(51,51,51); font-family:Arial; line-height:26px"><a name="t12"></a>

<a name="t7" style="color:rgb(51,102,153)" target="_blank"></a>参考资料:</h2>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

1、《Opencv2 Computer Vision Application Programming Cookbook》</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

2、《OpenCV References Manule》</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

3、<a style="color:rgb(51,102,153); text-decoration:none" href="http://opencvpython.blogspot.com/2013/03/histograms-2-histogram-equalization.html" target="_blank">http://opencvpython.blogspot.com/2013/03/histograms-2-histogram-equalization.html</a></p>

<br>

<p><br>

</p>

<p><br>

</p>

<h1><a name="t13"></a><span style="font-size:32px">OpenCV-Python教程(11、轮廓检测)</span></h1>

<p><br>

</p>

<p></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

相比C++而言,<a title="Python知识库" class="replace_word" style="color:rgb(223,52,52); text-decoration:none; font-weight:bold" href="http://lib.csdn.net/base/11" target="_blank">Python</a>适合做原型。本系列的文章介绍如何在Python中用OpenCV图形库,以及与C++调用相应OpenCV函数的不同之处。这篇文章介绍在Python中使用OpenCV检测并绘制轮廓。<strong><br>

</strong></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<strong>提示:</strong><br>

</p>

<ul style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<li>转载请详细注明原作者及出处,谢谢!<br>

</li><li>本文介绍在OpenCV-Python中检测并绘制轮廓的方法。</li><li>本文不介详细的理论知识,读者可从其他资料中获取相应的背景知识。笔者推荐清华大学出版社的《<a style="color:rgb(51,102,153); text-decoration:none" href="http://www.amazon.cn/%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86%E4%B8%8E%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E7%AE%97%E6%B3%95%E5%8F%8A%E5%BA%94%E7%94%A8-%E5%B8%95%E7%A7%91%E5%B0%94/dp/B0083PY050/ref=sr_1_1?ie=UTF8&qid=1373614562&sr=8-1&keywords=%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86%E4%B8%8E%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E7%AE%97%E6%B3%95%E5%8F%8A%E5%BA%94%E7%94%A8%28%E7%AC%AC2%E7%89%88%29"
target="_blank"><span class="lrg"></span><span class="med reg"></span>图像处理与计算机视觉算法及应用(第2版)</a> 》。</li></ul>

<h1 style="margin:0px; padding:0px; color:rgb(51,51,51); font-family:Arial; line-height:26px"><a name="t14"></a>

<a name="t0" style="color:rgb(51,102,153)" target="_blank"></a>轮廓检测</h1>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

轮廓检测也是图像处理中经常用到的。OpenCV-Python接口中使用cv2.findContours()函数来查找检测物体的轮廓。</p>

<h2 style="margin:0px; padding:0px; color:rgb(51,51,51); font-family:Arial; line-height:26px"><a name="t15"></a>

<a name="t1" style="color:rgb(51,102,153)" target="_blank"></a>实现</h2>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

使用方式如下:</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

</p>

<div class="dp-highlighter bg_python" style="font-family:Consolas,'Courier New',Courier,mono,serif; width:700.906px; overflow:auto; padding-top:1px; color:rgb(51,51,51); line-height:26px; margin:18px 0px!important; background-color:rgb(231,229,220)">

<div class="bar" style="padding-left:45px">

<div class="tools" style="padding:3px 8px 10px 10px; font-size:9px; line-height:normal; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; color:silver; border-left-width:3px; border-left-style:solid; border-left-color:rgb(108,226,108); background-color:rgb(248,248,248)">

<strong>[python]</strong> <a title="view plain" class="ViewSource" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px;
background-color:inherit" href="http://blog.csdn.net/sunny2038/article/details/12889059#" target="_blank">view

plain</a><span> <a title="copy" class="CopyToClipboard" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px; background-color:inherit"
href="http://blog.csdn.net/sunny2038/article/details/12889059#" target="_blank">copy</a><div style="left: 487px; top: 11096px; width: 18px; height: 18px; position: absolute; z-index: 99;"><embed name="ZeroClipboardMovie_12" width="18" height="18" align="middle"
id="ZeroClipboardMovie_12" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" wmode="transparent" flashvars="id=12&width=18&height=18"
allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false"></div></span>

<div style="position:absolute; left:587px; top:967px; width:18px; height:18px; z-index:99">

</div>

<span></span></div>

</div>

<ol class="dp-py" style="padding:0px; border:none; color:rgb(92,92,92); margin:0px 0px 1px 45px!important; background-color:rgb(255,255,255)" start="1">

<li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">import</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> cv2  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">img = cv2.imread(<span class="string" style="margin:0px; padding:0px; border:none; color:blue; background-color:inherit">'D:\\test\\contour.jpg'</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">)  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108);
list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">ret, binary = cv2.threshold(gray,<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">127</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit">,</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">255</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">,cv2.THRESH_BINARY)  </span></span></li><li
style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)  </span></li><li style="border-left-width:3px; border-style:none
none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">cv2.drawContours(img,contours,-<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">1</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">,(</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">,</span><span class="number" style="margin:0px;
padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">,</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">255</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit">),</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">3</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">)  </span></span></li><li
class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  </span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">cv2.imshow(<span class="string" style="margin:0px; padding:0px; border:none; color:blue; background-color:inherit">"img"</span><span style="margin:0px; padding:0px; border:none;
background-color:inherit">, img)  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">cv2.waitKey(<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">)  </span></span></li></ol>

</div>

<br style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">需要注意的是cv2.findContours()函数接受的参数为二值图,即黑白的(不是灰度图),所以读取的图像要先转成灰度的,再转成二值图,参见4、5两行。第六行是检测轮廓,第七行是绘制轮廓。</span>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

</p>

<h2 style="margin:0px; padding:0px; color:rgb(51,51,51); font-family:Arial; line-height:26px"><a name="t16"></a>

<a name="t2" style="color:rgb(51,102,153)" target="_blank"></a>结果<br>

</h2>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

原图如下:</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<img style="border:none; max-width:100%" alt="" src="https://img-blog.csdn.net/20131030153346984?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VubnkyMDM4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast"></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

检测结果如下:</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<img style="border:none; max-width:100%" alt="" src="https://img-blog.csdn.net/20131030153441656?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VubnkyMDM4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast"></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<strong>注意</strong>,findcontours函数会“原地”修改输入的图像。这一点可通过下面的语句验证:<br>

</p>

<div class="dp-highlighter bg_python" style="font-family:Consolas,'Courier New',Courier,mono,serif; width:700.906px; overflow:auto; padding-top:1px; color:rgb(51,51,51); line-height:26px; margin:18px 0px!important; background-color:rgb(231,229,220)">

<div class="bar" style="padding-left:45px">

<div class="tools" style="padding:3px 8px 10px 10px; font-size:9px; line-height:normal; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; color:silver; border-left-width:3px; border-left-style:solid; border-left-color:rgb(108,226,108); background-color:rgb(248,248,248)">

<strong>[python]</strong> <a title="view plain" class="ViewSource" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px;
background-color:inherit" href="http://blog.csdn.net/sunny2038/article/details/12889059#" target="_blank">view

plain</a><span> <a title="copy" class="CopyToClipboard" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px; background-color:inherit"
href="http://blog.csdn.net/sunny2038/article/details/12889059#" target="_blank">copy</a><div style="left: 487px; top: 12664px; width: 18px; height: 18px; position: absolute; z-index: 99;"><embed name="ZeroClipboardMovie_13" width="18" height="18" align="middle"
id="ZeroClipboardMovie_13" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" wmode="transparent" flashvars="id=13&width=18&height=18"
allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false"></div></span>

<div style="position:absolute; left:587px; top:2409px; width:18px; height:18px; z-index:99">

</div>

<span></span></div>

</div>

<ol class="dp-py" style="padding:0px; border:none; color:rgb(92,92,92); margin:0px 0px 1px 45px!important; background-color:rgb(255,255,255)" start="1">

<li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span style="margin:0px; padding:0px; border:none; background-color:inherit">cv2.imshow(</span><span class="string" style="margin:0px; padding:0px; border:none; color:blue;
background-color:inherit">"binary"</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">, binary)  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108);
list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)  </span></li><li class="alt" style="border-left-width:3px;
border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">cv2.imshow(<span class="string" style="margin:0px; padding:0px; border:none; color:blue; background-color:inherit">"binary2"</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">, binary)  </span></span></li></ol>

</div>

<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">执行这些语句后会发现原图被修改了。</span><br style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

</p>

<h1 style="margin:0px; padding:0px; color:rgb(51,51,51); font-family:Arial; line-height:26px"><a name="t17"></a>

<a name="t3" style="color:rgb(51,102,153)" target="_blank"></a>cv2.findContours()函数</h1>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

函数的原型为</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

</p>

<div class="dp-highlighter bg_python" style="font-family:Consolas,'Courier New',Courier,mono,serif; width:700.906px; overflow:auto; padding-top:1px; color:rgb(51,51,51); line-height:26px; margin:18px 0px!important; background-color:rgb(231,229,220)">

<div class="bar" style="padding-left:45px">

<div class="tools" style="padding:3px 8px 10px 10px; font-size:9px; line-height:normal; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; color:silver; border-left-width:3px; border-left-style:solid; border-left-color:rgb(108,226,108); background-color:rgb(248,248,248)">

<strong>[python]</strong> <a title="view plain" class="ViewSource" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px;
background-color:inherit" href="http://blog.csdn.net/sunny2038/article/details/12889059#" target="_blank">view

plain</a><span> <a title="copy" class="CopyToClipboard" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px; background-color:inherit"
href="http://blog.csdn.net/sunny2038/article/details/12889059#" target="_blank">copy</a><div style="left: 487px; top: 12865px; width: 18px; height: 18px; position: absolute; z-index: 99;"><embed name="ZeroClipboardMovie_14" width="18" height="18" align="middle"
id="ZeroClipboardMovie_14" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" wmode="transparent" flashvars="id=14&width=18&height=18"
allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false"></div></span>

<div style="position:absolute; left:587px; top:2638px; width:18px; height:18px; z-index:99">

</div>

<span></span></div>

</div>

<ol class="dp-py" style="padding:0px; border:none; color:rgb(92,92,92); margin:0px 0px 1px 45px!important; background-color:rgb(255,255,255)" start="1">

<li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span style="margin:0px; padding:0px; border:none; background-color:inherit">cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])  </span></span></li></ol>

</div>

<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">返回两个值:contours:hierarchy。</span><br style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

</p>

<h2 style="margin:0px; padding:0px; color:rgb(51,51,51); font-family:Arial; line-height:26px"><a name="t18"></a>

<a name="t4" style="color:rgb(51,102,153)" target="_blank"></a>参数</h2>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

第一个参数是寻找轮廓的图像;</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

第二个参数表示轮廓的检索模式,有四种(本文介绍的都是新的cv2接口):<br>

    cv2.RETR_EXTERNAL表示只检测外轮廓<br>

    cv2.RETR_LIST检测的轮廓不建立等级关系<br>

    cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。<br>

    cv2.RETR_TREE建立一个等级树结构的轮廓。</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

第三个参数method为轮廓的近似办法<br>

    cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1<br>

    cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息<br>

    cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法<br>

</p>

<h2 style="margin:0px; padding:0px; color:rgb(51,51,51); font-family:Arial; line-height:26px"><a name="t19"></a>

<a name="t5" style="color:rgb(51,102,153)" target="_blank"></a>返回值</h2>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

cv2.findContours()函数返回两个值,一个是轮廓本身,还有一个是每条轮廓对应的属性。<br>

</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

</p>

<h2 style="margin:0px; padding:0px; color:rgb(51,51,51); font-family:Arial; line-height:26px"><a name="t20"></a>

<a name="t6" style="color:rgb(51,102,153)" target="_blank"></a>contour返回值</h2>

<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">cv2.findContours()函数首先返回一个list,list中每个元素都是图像中的一个轮廓,用numpy中的ndarray表示。这个概念非常重要。在下面drawContours中会看见。通过</span><br style="color:rgb(51,51,51); font-family:Arial; font-size:14px;
line-height:26px">

<div class="dp-highlighter bg_python" style="font-family:Consolas,'Courier New',Courier,mono,serif; width:700.906px; overflow:auto; padding-top:1px; color:rgb(51,51,51); line-height:26px; margin:18px 0px!important; background-color:rgb(231,229,220)">

<div class="bar" style="padding-left:45px">

<div class="tools" style="padding:3px 8px 10px 10px; font-size:9px; line-height:normal; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; color:silver; border-left-width:3px; border-left-style:solid; border-left-color:rgb(108,226,108); background-color:rgb(248,248,248)">

<strong>[python]</strong> <a title="view plain" class="ViewSource" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px;
background-color:inherit" href="http://blog.csdn.net/sunny2038/article/details/12889059#" target="_blank">view

plain</a><span> <a title="copy" class="CopyToClipboard" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px; background-color:inherit"
href="http://blog.csdn.net/sunny2038/article/details/12889059#" target="_blank">copy</a><div style="left: 487px; top: 13446px; width: 18px; height: 18px; position: absolute; z-index: 99;"><embed name="ZeroClipboardMovie_15" width="18" height="18" align="middle"
id="ZeroClipboardMovie_15" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" wmode="transparent" flashvars="id=15&width=18&height=18"
allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false"></div></span>

<div style="position:absolute; left:587px; top:3343px; width:18px; height:18px; z-index:99">

</div>

<span></span></div>

</div>

<ol class="dp-py" style="padding:0px; border:none; color:rgb(92,92,92); margin:0px 0px 1px 45px!important; background-color:rgb(255,255,255)" start="1">

<li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">print</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> (type(contours))  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">print</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> (type(contours[</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">]))  </span></span></li><li
class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">print</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> (len(contours))  </span></span></li></ol>

</div>

<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">可以验证上述信息。会看到本例中有两条轮廓,一个是五角星的,一个是矩形的。每个轮廓是一个ndarray,每个ndarray是轮廓上的点的集合。</span>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

由于我们知道返回的轮廓有两个,因此可通过<br>

</p>

<div class="dp-highlighter bg_python" style="font-family:Consolas,'Courier New',Courier,mono,serif; width:700.906px; overflow:auto; padding-top:1px; color:rgb(51,51,51); line-height:26px; margin:18px 0px!important; background-color:rgb(231,229,220)">

<div class="bar" style="padding-left:45px">

<div class="tools" style="padding:3px 8px 10px 10px; font-size:9px; line-height:normal; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; color:silver; border-left-width:3px; border-left-style:solid; border-left-color:rgb(108,226,108); background-color:rgb(248,248,248)">

<strong>[python]</strong> <a title="view plain" class="ViewSource" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px;
background-color:inherit" href="http://blog.csdn.net/sunny2038/article/details/12889059#" target="_blank">view

plain</a><span> <a title="copy" class="CopyToClipboard" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px; background-color:inherit"
href="http://blog.csdn.net/sunny2038/article/details/12889059#" target="_blank">copy</a><div style="left: 487px; top: 13621px; width: 18px; height: 18px; position: absolute; z-index: 99;"><embed name="ZeroClipboardMovie_16" width="18" height="18" align="middle"
id="ZeroClipboardMovie_16" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" wmode="transparent" flashvars="id=16&width=18&height=18"
allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false"></div></span>

<div style="position:absolute; left:587px; top:3558px; width:18px; height:18px; z-index:99">

</div>

<span></span></div>

</div>

<ol class="dp-py" style="padding:0px; border:none; color:rgb(92,92,92); margin:0px 0px 1px 45px!important; background-color:rgb(255,255,255)" start="1">

<li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span style="margin:0px; padding:0px; border:none; background-color:inherit">cv2.drawContours(img,contours,</span><span class="number" style="margin:0px; padding:0px;
border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">,(</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit">,</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">,</span><span class="number"
style="margin:0px; padding:0px; border:none; background-color:inherit">255</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">),</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">3</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">)  </span></span></li></ol>

</div>

<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">和</span>

<div class="dp-highlighter bg_python" style="font-family:Consolas,'Courier New',Courier,mono,serif; width:700.906px; overflow:auto; padding-top:1px; color:rgb(51,51,51); line-height:26px; margin:18px 0px!important; background-color:rgb(231,229,220)">

<div class="bar" style="padding-left:45px">

<div class="tools" style="padding:3px 8px 10px 10px; font-size:9px; line-height:normal; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; color:silver; border-left-width:3px; border-left-style:solid; border-left-color:rgb(108,226,108); background-color:rgb(248,248,248)">

<strong>[python]</strong> <a title="view plain" class="ViewSource" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px;
background-color:inherit" href="http://blog.csdn.net/sunny2038/article/details/12889059#" target="_blank">view

plain</a><span> <a title="copy" class="CopyToClipboard" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px; background-color:inherit"
href="http://blog.csdn.net/sunny2038/article/details/12889059#" target="_blank">copy</a><div style="left: 487px; top: 13734px; width: 18px; height: 18px; position: absolute; z-index: 99;"><embed name="ZeroClipboardMovie_17" width="18" height="18" align="middle"
id="ZeroClipboardMovie_17" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" wmode="transparent" flashvars="id=17&width=18&height=18"
allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false"></div></span>

<div style="position:absolute; left:587px; top:3671px; width:18px; height:18px; z-index:99">

</div>

<span></span></div>

</div>

<ol class="dp-py" style="padding:0px; border:none; color:rgb(92,92,92); margin:0px 0px 1px 45px!important; background-color:rgb(255,255,255)" start="1">

<li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span style="margin:0px; padding:0px; border:none; background-color:inherit">cv2.drawContours(img,contours,</span><span class="number" style="margin:0px; padding:0px;
border:none; background-color:inherit">1</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">,(</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit">,</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">255</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">,</span><span class="number"
style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">),</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">3</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">)  </span></span></li></ol>

</div>

<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">分别绘制两个轮廓,关于该参数可参见下面一节的内容。同时通过</span><br style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<div class="dp-highlighter bg_python" style="font-family:Consolas,'Courier New',Courier,mono,serif; width:700.906px; overflow:auto; padding-top:1px; color:rgb(51,51,51); line-height:26px; margin:18px 0px!important; background-color:rgb(231,229,220)">

<div class="bar" style="padding-left:45px">

<div class="tools" style="padding:3px 8px 10px 10px; font-size:9px; line-height:normal; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; color:silver; border-left-width:3px; border-left-style:solid; border-left-color:rgb(108,226,108); background-color:rgb(248,248,248)">

<strong>[python]</strong> <a title="view plain" class="ViewSource" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px;
background-color:inherit" href="http://blog.csdn.net/sunny2038/article/details/12889059#" target="_blank">view

plain</a><span> <a title="copy" class="CopyToClipboard" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px; background-color:inherit"
href="http://blog.csdn.net/sunny2038/article/details/12889059#" target="_blank">copy</a><div style="left: 487px; top: 13847px; width: 18px; height: 18px; position: absolute; z-index: 99;"><embed name="ZeroClipboardMovie_18" width="18" height="18" align="middle"
id="ZeroClipboardMovie_18" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" wmode="transparent" flashvars="id=18&width=18&height=18"
allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false"></div></span>

<div style="position:absolute; left:587px; top:3784px; width:18px; height:18px; z-index:99">

</div>

<span></span></div>

</div>

<ol class="dp-py" style="padding:0px; border:none; color:rgb(92,92,92); margin:0px 0px 1px 45px!important; background-color:rgb(255,255,255)" start="1">

<li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">print</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> (len(contours[</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">]))  </span></span></li><li
style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">print</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> (len(contours[</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">1</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">]))  </span></span></li></ol>

</div>

<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">输出两个轮廓中存储的点的个数,可以看到,第一个轮廓中只有4个元素,这是因为轮廓中并不是存储轮廓上所有的点,而是只存储可以用直线描述轮廓的点的个数,比如一个“正立”的矩形,只需4个顶点就能描述轮廓了。</span><br style="color:rgb(51,51,51); font-family:Arial; font-size:14px;
line-height:26px">

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

</p>

<h2 style="margin:0px; padding:0px; color:rgb(51,51,51); font-family:Arial; line-height:26px"><a name="t21"></a>

<a name="t7" style="color:rgb(51,102,153)" target="_blank"></a>hierarchy返回值</h2>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

此外,该函数还可返回一个可选的hiararchy结果,这是一个ndarray,其中的元素个数和轮廓个数相同,每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为负数。<br>

</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

通过<br>

</p>

<div class="dp-highlighter bg_python" style="font-family:Consolas,'Courier New',Courier,mono,serif; width:700.906px; overflow:auto; padding-top:1px; color:rgb(51,51,51); line-height:26px; margin:18px 0px!important; background-color:rgb(231,229,220)">

<div class="bar" style="padding-left:45px">

<div class="tools" style="padding:3px 8px 10px 10px; font-size:9px; line-height:normal; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; color:silver; border-left-width:3px; border-left-style:solid; border-left-color:rgb(108,226,108); background-color:rgb(248,248,248)">

<strong>[python]</strong> <a title="view plain" class="ViewSource" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px;
background-color:inherit" href="http://blog.csdn.net/sunny2038/article/details/12889059#" target="_blank">view

plain</a><span> <a title="copy" class="CopyToClipboard" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px; background-color:inherit"
href="http://blog.csdn.net/sunny2038/article/details/12889059#" target="_blank">copy</a><div style="left: 487px; top: 14108px; width: 18px; height: 18px; position: absolute; z-index: 99;"><embed name="ZeroClipboardMovie_19" width="18" height="18" align="middle"
id="ZeroClipboardMovie_19" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" wmode="transparent" flashvars="id=19&width=18&height=18"
allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false"></div></span>

<div style="position:absolute; left:587px; top:4113px; width:18px; height:18px; z-index:99">

</div>

<span></span></div>

</div>

<ol class="dp-py" style="padding:0px; border:none; color:rgb(92,92,92); margin:0px 0px 1px 45px!important; background-color:rgb(255,255,255)" start="1">

<li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">print</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> (type(hierarchy))  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">print</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> (hierarchy.ndim)  </span></span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">print</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> (hierarchy[</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">].ndim)  </span></span></li><li
style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); font-weight:bold; background-color:inherit">print</span><span style="margin:0px;
padding:0px; border:none; background-color:inherit"> (hierarchy.shape)  </span></span></li></ol>

</div>

<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">得到</span><br style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<div class="dp-highlighter bg_python" style="font-family:Consolas,'Courier New',Courier,mono,serif; width:700.906px; overflow:auto; padding-top:1px; color:rgb(51,51,51); line-height:26px; margin:18px 0px!important; background-color:rgb(231,229,220)">

<div class="bar" style="padding-left:45px">

<div class="tools" style="padding:3px 8px 10px 10px; font-size:9px; line-height:normal; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; color:silver; border-left-width:3px; border-left-style:solid; border-left-color:rgb(108,226,108); background-color:rgb(248,248,248)">

<strong>[python]</strong> <a title="view plain" class="ViewSource" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px;
background-color:inherit" href="http://blog.csdn.net/sunny2038/article/details/12889059#" target="_blank">view

plain</a><span> <a title="copy" class="CopyToClipboard" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px; background-color:inherit"
href="http://blog.csdn.net/sunny2038/article/details/12889059#" target="_blank">copy</a><div style="left: 487px; top: 14275px; width: 18px; height: 18px; position: absolute; z-index: 99;"><embed name="ZeroClipboardMovie_20" width="18" height="18" align="middle"
id="ZeroClipboardMovie_20" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" wmode="transparent" flashvars="id=20&width=18&height=18"
allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false"></div></span>

<div style="position:absolute; left:587px; top:4280px; width:18px; height:18px; z-index:99">

</div>

<span></span></div>

</div>

<ol class="dp-py" style="padding:0px; border:none; color:rgb(92,92,92); margin:0px 0px 1px 45px!important; background-color:rgb(255,255,255)" start="1">

<li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">3</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li
style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">2</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li
class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">(<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">1</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">, </span><span
class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">2</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">, </span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">4</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">)  </span></span></li></ol>

</div>

<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">可以看出,hierarchy本身包含两个ndarray,每个ndarray对应一个轮廓,每个轮廓有四个属性。</span><br style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

</p>

<h1 style="margin:0px; padding:0px; color:rgb(51,51,51); font-family:Arial; line-height:26px"><a name="t22"></a>

<a name="t8" style="color:rgb(51,102,153)" target="_blank"></a>轮廓的绘制</h1>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

OpenCV中通过cv2.drawContours在图像上绘制轮廓。  <br>

</p>

<h2 style="margin:0px; padding:0px; color:rgb(51,51,51); font-family:Arial; line-height:26px"><a name="t23"></a>

<a name="t9" style="color:rgb(51,102,153)" target="_blank"></a>cv2.drawContours()函数</h2>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

</p>

<div class="dp-highlighter bg_python" style="font-family:Consolas,'Courier New',Courier,mono,serif; width:700.906px; overflow:auto; padding-top:1px; color:rgb(51,51,51); line-height:26px; margin:18px 0px!important; background-color:rgb(231,229,220)">

<div class="bar" style="padding-left:45px">

<div class="tools" style="padding:3px 8px 10px 10px; font-size:9px; line-height:normal; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; color:silver; border-left-width:3px; border-left-style:solid; border-left-color:rgb(108,226,108); background-color:rgb(248,248,248)">

<strong>[python]</strong> <a title="view plain" class="ViewSource" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px;
background-color:inherit" href="http://blog.csdn.net/sunny2038/article/details/12889059#" target="_blank">view

plain</a><span> <a title="copy" class="CopyToClipboard" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px; background-color:inherit"
href="http://blog.csdn.net/sunny2038/article/details/12889059#" target="_blank">copy</a><div style="left: 487px; top: 14502px; width: 18px; height: 18px; position: absolute; z-index: 99;"><embed name="ZeroClipboardMovie_21" width="18" height="18" align="middle"
id="ZeroClipboardMovie_21" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" wmode="transparent" flashvars="id=21&width=18&height=18"
allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false"></div></span>

<div style="position:absolute; left:587px; top:4549px; width:18px; height:18px; z-index:99">

</div>

<span></span></div>

</div>

<ol class="dp-py" style="padding:0px; border:none; color:rgb(92,92,92); margin:0px 0px 1px 45px!important; background-color:rgb(255,255,255)" start="1">

<li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span style="margin:0px; padding:0px; border:none; background-color:inherit">cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset ]]]]])  </span></span></li></ol>

</div>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

</p>

<ul style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<li>第一个参数是指明在哪幅图像上绘制轮廓;</li><li>第二个参数是轮廓本身,在Python中是一个list。</li><li>第三个参数指定绘制轮廓list中的哪条轮廓,如果是-1,则绘制其中的所有轮廓。后面的参数很简单。其中thickness表明轮廓线的宽度,如果是-1(cv2.FILLED),则为填充模式。绘制参数将在以后独立详细介绍。</li></ul>

<h1 style="margin:0px; padding:0px; color:rgb(51,51,51); font-family:Arial; line-height:26px"><a name="t24"></a>

<a name="t10" style="color:rgb(51,102,153)" target="_blank"></a>补充:</h1>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

写着写着发现一篇文章介绍不完,所以这里先作为入门的。更多关于轮廓的信息有机会再开一篇文章介绍。<br>

<br>

但有朋友提出计算轮廓的极值点。可用下面的方式计算得到,如下</p>

<div class="dp-highlighter bg_python" style="font-family:Consolas,'Courier New',Courier,mono,serif; width:700.906px; overflow:auto; padding-top:1px; color:rgb(51,51,51); line-height:26px; margin:18px 0px!important; background-color:rgb(231,229,220)">

<div class="bar" style="padding-left:45px">

<div class="tools" style="padding:3px 8px 10px 10px; font-size:9px; line-height:normal; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; color:silver; border-left-width:3px; border-left-style:solid; border-left-color:rgb(108,226,108); background-color:rgb(248,248,248)">

<strong>[python]</strong> <a title="view plain" class="ViewSource" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px;
background-color:inherit" href="http://blog.csdn.net/sunny2038/article/details/12889059#" target="_blank">view

plain</a><span> <a title="copy" class="CopyToClipboard" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px; background-color:inherit"
href="http://blog.csdn.net/sunny2038/article/details/12889059#" target="_blank">copy</a><div style="left: 487px; top: 14829px; width: 18px; height: 18px; position: absolute; z-index: 99;"><embed name="ZeroClipboardMovie_22" width="18" height="18" align="middle"
id="ZeroClipboardMovie_22" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" wmode="transparent" flashvars="id=22&width=18&height=18"
allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false"></div></span>

<div style="position:absolute; left:587px; top:4889px; width:18px; height:18px; z-index:99">

</div>

<span></span></div>

</div>

<ol class="dp-py" style="padding:0px; border:none; color:rgb(92,92,92); margin:0px 0px 1px 45px!important; background-color:rgb(255,255,255)" start="1">

<li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span style="margin:0px; padding:0px; border:none; background-color:inherit">pentagram = contours[</span><span class="number" style="margin:0px; padding:0px;
border:none; background-color:inherit">1</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">] </span><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">#第二条轮廓是五角星</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">  </span></span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px;
margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  </span></li><li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero
outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">leftmost = tuple(pentagram[:,<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">][pentagram[:,:,</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">].argmin()])  </span></span></li><li
style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">rightmost = tuple(pentagram[:,<span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">][pentagram[:,:,</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">].argmin()])  </span></span></li><li
class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">  </span></li><li style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside;
line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; background-color:rgb(248,248,248)">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">cv2.circle(img, leftmost, <span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">2</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">, (</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">,</span><span class="number"
style="margin:0px; padding:0px; border:none; background-color:inherit">255</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">,</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">),</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">3</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">)   </span></span></li><li
class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">cv2.circle(img, rightmost, <span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">2</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">, (</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">,</span><span class="number"
style="margin:0px; padding:0px; border:none; background-color:inherit">0</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">,</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">255</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">),</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">3</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">)   </span></span></li></ol>

</div>

<br style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<span style="color:rgb(255,0,0)"><strong>注意!假设轮廓有100个点,OpenCV返回的ndarray的维数是(100, 1, 2)!!!而不是我们认为的(100, 2)。切记!!!</strong><span style="font-size:12px; color:rgb(0,0,0)">人民邮电出版社出版了一本《NumPy攻略:Python科学计算与数据分析》,推荐去看一下。</span></span></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<strong><span style="color:rgb(255,0,0)"><span style="color:rgb(0,0,0)">更新:关于pentagram[:,0]的意思</span></span></strong></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<span style="color:rgb(255,0,0)"><span style="font-size:12px; color:rgb(0,0,0)">在numpy的数组中,用逗号分隔的是轴的索引。举个例子,假设有如下的数组:</span></span></p>

<div class="dp-highlighter bg_python" style="font-family:Consolas,'Courier New',Courier,mono,serif; width:700.906px; overflow:auto; padding-top:1px; color:rgb(51,51,51); line-height:26px; margin:18px 0px!important; background-color:rgb(231,229,220)">

<div class="bar" style="padding-left:45px">

<div class="tools" style="padding:3px 8px 10px 10px; font-size:9px; line-height:normal; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; color:silver; border-left-width:3px; border-left-style:solid; border-left-color:rgb(108,226,108); background-color:rgb(248,248,248)">

<strong>[python]</strong> <a title="view plain" class="ViewSource" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px;
background-color:inherit" href="http://blog.csdn.net/sunny2038/article/details/12889059#" target="_blank">view

plain</a><span> <a title="copy" class="CopyToClipboard" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px; background-color:inherit"
href="http://blog.csdn.net/sunny2038/article/details/12889059#" target="_blank">copy</a><div style="left: 487px; top: 15155px; width: 18px; height: 18px; position: absolute; z-index: 99;"><embed name="ZeroClipboardMovie_23" width="18" height="18" align="middle"
id="ZeroClipboardMovie_23" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" wmode="transparent" flashvars="id=23&width=18&height=18"
allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false"></div></span>

<div style="position:absolute; left:587px; top:5257px; width:18px; height:18px; z-index:99">

</div>

<span></span></div>

</div>

<ol class="dp-py" style="padding:0px; border:none; color:rgb(92,92,92); margin:0px 0px 1px 45px!important; background-color:rgb(255,255,255)" start="1">

<li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span style="margin:0px; padding:0px; border:none; background-color:inherit">a = np.array([[[</span><span class="number" style="margin:0px; padding:0px; border:none;
background-color:inherit">3</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">,</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">4</span><span style="margin:0px; padding:0px;
border:none; background-color:inherit">]], [[</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">1</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">,</span><span class="number"
style="margin:0px; padding:0px; border:none; background-color:inherit">2</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">]],[[</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">5</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">,</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">7</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">]],[[</span><span
class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">3</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">,</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">7</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">]],[[</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">1</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">,</span><span
class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">8</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">]]])  </span></span></li></ol>

</div>

<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">其shape是(5, 1, 2)。与我们的轮廓是相同的。那么a[:,0]的结果就是:</span>

<div class="dp-highlighter bg_python" style="font-family:Consolas,'Courier New',Courier,mono,serif; width:700.906px; overflow:auto; padding-top:1px; color:rgb(51,51,51); line-height:26px; margin:18px 0px!important; background-color:rgb(231,229,220)">

<div class="bar" style="padding-left:45px">

<div class="tools" style="padding:3px 8px 10px 10px; font-size:9px; line-height:normal; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; color:silver; border-left-width:3px; border-left-style:solid; border-left-color:rgb(108,226,108); background-color:rgb(248,248,248)">

<strong>[python]</strong> <a title="view plain" class="ViewSource" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px;
background-color:inherit" href="http://blog.csdn.net/sunny2038/article/details/12889059#" target="_blank">view

plain</a><span> <a title="copy" class="CopyToClipboard" style="color:rgb(160,160,160); text-decoration:none; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px; background-color:inherit"
href="http://blog.csdn.net/sunny2038/article/details/12889059#" target="_blank">copy</a><div style="left: 487px; top: 15268px; width: 18px; height: 18px; position: absolute; z-index: 99;"><embed name="ZeroClipboardMovie_24" width="18" height="18" align="middle"
id="ZeroClipboardMovie_24" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" wmode="transparent" flashvars="id=24&width=18&height=18"
allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false"></div></span>

<div style="position:absolute; left:587px; top:5370px; width:18px; height:18px; z-index:99">

</div>

<span></span></div>

</div>

<ol class="dp-py" style="padding:0px; border:none; color:rgb(92,92,92); margin:0px 0px 1px 45px!important; background-color:rgb(255,255,255)" start="1">

<li class="alt" style="border-left-width:3px; border-style:none none none solid; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">

<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span style="margin:0px; padding:0px; border:none; background-color:inherit">[</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">3</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">,</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">4</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">], [</span><span
class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">1</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">,</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">2</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">], [</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">5</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">,</span><span
class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">7</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">], [</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">3</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">,</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">7</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">], [</span><span
class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">1</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">,</span><span class="number" style="margin:0px; padding:0px; border:none; background-color:inherit">8</span><span
style="margin:0px; padding:0px; border:none; background-color:inherit">]  </span></span></li></ol>

</div>

<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">这里a[:,0]的意思就是a[0:5,0],也就是a[0:5,0:0:2]</span><span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">,这三者是等价的</span><span style="color:rgb(51,51,51);
font-family:Arial; font-size:14px; line-height:26px">。</span><span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px"></span>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<span style="color:rgb(255,0,0)"><span style="color:rgb(0,0,0)">回头看一下,a的shape是(5,1,2),表明是三个轴的。在numpy的数组中,轴的索引是通过逗号分隔的。同时冒号索引“:”表示的是该轴的所有元素。因此a[:, 0]表示的是第一个轴的所有元素和第二个轴的第一个元素。在这里既等价于a[0:5, 0]。</span></span></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<span style="color:rgb(255,0,0)"><span style="color:rgb(0,0,0)">再者,若给出的索引数少于数组中总索引数,则将已给出的索引树默认按顺序指派到轴上。比如a[0:5,0]只给出了两个轴的索引,则第一个索引就是第一个轴的,第二个索引是第二个轴的,而第三个索引没有,则默认为[:],即该轴的所有内容。因此a[0:5,0]也等价于a[0:5,0:0:2]。</span></span></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<span style="font-size:14px; color:#FF0000"><span style="color:rgb(0,0,0)">再详细一点,a的全体内容为:[[[3,4]], [[1,2]],[[5,7]],[[3,7]],[[1,8]]]。<span style="color:rgb(255,0,0)"><span style="color:rgb(0,0,0)">去掉第一层方括号,</span></span>其中有五个元素,每个元素为[[3,4]]这样的,所以第一个索引的范围为[0:5]。<strong>注意OpenCV函数返回的多维数组和常见的numpy数组的不同之处!</strong></span></span></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<span style="color:rgb(255,0,0)"><span style="color:rgb(0,0,0)">观察[[3,4]],我们发现其中只有一个元素,即[3, 4],第二个索引为[0:1]。</span></span></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<span style="color:rgb(255,0,0)"><span style="color:rgb(0,0,0)">再去掉一层方括号,我们面对的是[3,4],有两个元素,所以第三个索引的范围为[0:2]。</span></span></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<span style="color:rgb(255,0,0)"><span style="font-size:12px; color:rgb(0,0,0)"><span style="font-size:14px">再次强调一下OpenCVPython接口函数返回的NumPy数组和普通的NumPy数组在组织上的不同之处。</span></span></span></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<span style="color:rgb(255,0,0)"><span style="font-size:12px; color:rgb(0,0,0)"><span style="font-size:14px"><strong>PS:OpenCV-Python讨论群——219962286,欢迎大家加入互相探讨学习。</strong></span><br>

</span></span></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

</p>

<p class="python" style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px" name="code">

得到的结果为如下:<br>

<br>

<img style="border:none; max-width:100%" alt="" src="https://img-blog.csdn.net/20131030171817578?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VubnkyMDM4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast"><br>

</p>

<h1 style="margin:0px; padding:0px; color:rgb(51,51,51); font-family:Arial; line-height:26px"><a name="t25"></a>

<a name="t11" style="color:rgb(51,102,153)" target="_blank"></a>参考资料:</h1>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

1、《Opencv2 Computer Vision Application Programming Cookbook》</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

2、《OpenCV References Manule》</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

3、<a style="color:rgb(51,102,153); text-decoration:none" href="http://blog.csdn.net/sunny2038/article/details/12889059" target="_blank">OpenCV官方文档Contour部分</a></p>

<br>

<p><br>

</p>

<p><br>

</p>

<p>from: http://blog.csdn.net/sunny2038/article/category/904451<br>
</p>

</div>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息