<p>在这个函数的三参数版本中,它返回附加的“im2”参数。我将简要介绍轮廓和层次结构返回,因为它们有很好的文档记录。这两个返回值取决于传入的两个常量。它们是下面的变体。</p>
<p>等高线是点列表或点列表树。这些点描述了每一个轮廓,也就是说,一个矢量,可以根据它与背景的不同,围绕形状的各个部分绘制轮廓。</p>
<p>层次结构显示了形状之间的相互关系,如层-如果形状在彼此之上,这可以在这里确定。</p>
<h2>实验im2返回值</h2>
<p>位于<a href="https://docs.opencv.org/3.3.1/d4/d73/tutorial_py_contours_begin.html" rel="nofollow noreferrer">https://docs.opencv.org/3.3.1/d4/d73/tutorial_py_contours_begin.html</a>的文档表明im2是一个经过修改的图像。我对这个返回值感兴趣,因为文档并没有真正告诉我它的用途。</p>
<p>实际实验表明没有区别。
我的代码:</p>
<pre><code>import cv2
im = cv2.imread('shapes_and_colors.jpg')
imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
cv2.imwrite("gray.jpg", imgray)
ret, thresh = cv2.threshold(imgray, 127, 255, 0)
cv2.imwrite("thresh.jpg", thresh)
im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.imwrite("contour.jpg", im2)
</code></pre>
<p>形状和颜色是来自pyimagesearch的测试图像:</p>
<p><a href="https://i.stack.imgur.com/MD2zw.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/MD2zw.jpg" alt="The original image"/></a></p>
<p>这将变为灰度来阈值:</p>
<p><a href="https://i.stack.imgur.com/8Fk20.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/8Fk20.jpg" alt="Image converted to greyscale"/></a></p>
<p>然后我应用一个阈值,得到一个二进制图像:</p>
<p><a href="https://i.stack.imgur.com/qMqU5.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/qMqU5.jpg" alt="enter image description here"/></a></p>
<p>最后,我运行findcontours-只需将“im2”参数写入图像:</p>
<p><a href="https://i.stack.imgur.com/kN090.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/kN090.jpg" alt="enter image description here"/></a></p>
<p>没有明显的区别。也许一个复杂的图像差异算法可以找到一些我找不到的东西。我意识到这些是有损JPG的,这可能会混淆。
到目前为止,我看不出im2返回值有多大用处,但轮廓和层次结构绝对有用。</p>
<p>我会说,我本来希望看到类似于绘制轮廓的东西,但在二值图像中只有一个通道,所以即使它有,我也不相信我能看到它。在正常模式下,无法将其应用于32位图像。我也看到没有阈值的灰度图像没有明显的差异。</p>