在这个函数的三参数版本中,它返回了额外的"im2"参数。轮廓和层次结构的返回值因为有很好的文档记录,所以我会简要介绍一下。两个返回值取决于传入的两个常量。它们是以下变体。
轮廓是一个点列表或树形结构的列表。这些点描述了每个轮廓,也就是可以根据形状与背景的差异绘制轮廓线的向量。
层次结构显示了形状之间的关系,就像图层一样——如果形状在彼此之上,则可以在这里确定。
尝试使用im2返回值进行实验
https://docs.opencv.org/3.3.1/d4/d73/tutorial_py_contours_begin.html上的文档建议im2是一个修改后的图像。我对这个返回值很感兴趣,因为文档并没有真正告诉我它的作用或用处。
实际实验表明没有任何区别。
我的代码:
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)
Shapes and colors是来自pyimagesearch的测试图像:
![原始图像](https://istack.dev59.com/MD2zw.webp)
将其转换为灰度图像以进行阈值处理:
![转换为灰度图像的图像](https://istack.dev59.com/8Fk20.webp)
然后应用阈值,得到二进制图像:
![输入图像描述](https://istack.dev59.com/qMqU5.webp)
最后运行findcontours - 并只将“im2”参数写入图像:
![输入图像描述](https://istack.dev59.com/kN090.webp)
没有可见的差异。也许一个复杂的图像差异算法可以找到我找不到的东西。我意识到这些都是有损压缩的JPG,可能会使其更加混乱。到目前为止,我看不出im2返回值有什么作用,但轮廓和层次结构肯定是有用的。
我会说,我原本期望看到像drawcontours这样的东西 - 但那个二进制图像中只有一个通道,所以即使它有,我也不确定我能看到它。你不能在正常模式下将其应用于32位图像。我还看不出在没有阈值处理的灰度图像上应用它的可见差异。
cv2.RETR_EXTERNAL
? - Jeru Luke