我使用cv2.findContours定位来自卫星的照片中的轻度污染区域。它们中的许多都不完全是内部污染,我的意思是它们内部有黑洞,不应该被认为是轮廓的一部分,也不能分开轮廓,因为我只是塑造了轻度污染区域。当我开始按尺寸索引轮廓时,我注意到黑洞被视为单独的轮廓。
正如您所看到的,例如#0,#67和#64被归类为轮廓区域,即使它们不应该
使用
查找我的轮廓public void IsMobileBrowser()
{
String labelText = "";
System.Web.HttpBrowserCapabilities myBrowserCaps = Request.Browser;
if (((System.Web.Configuration.HttpCapabilitiesBase)myBrowserCaps).IsMobileDevice)
{
labelText = "Browser is a mobile device.";
}
else
{
labelText = "Browser is not a mobile device.";
}
ScriptManager.RegisterStartupScript(this, this.GetType(), "", "alert('"+ labelText + "');", true);
}
我的目标是不将这些未受污染的区域归类为污染区域
答案 0 :(得分:2)
我相信你可以通过查看层次结构来做到这一点。基本上,如果你传递cv2.RETR_TREE而不是-1的层次结构意味着这个轮廓在另一个内部
_, contours, hierarchy = cv2.findContours(image_gray, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
for i in range(len(contours)):
if hierarchy[0,i,3] == -1:
cv2.drawContours(image_orig, contours, i, (0, 255, 0))
编辑: 那么如果您需要排除形状的内部部分该怎么办呢?现在这不是最优化的解决方案,但我认为它可以让您很好地了解层次结构的工作原理:
for i in range(len(contours)):
if hierarchy[0, i, 3] == -1: # this is the outer contour which we need to draw
cv2.drawContours(image_orig, contours, i, (0, 255, 0), -1)
if hierarchy[0, i, 2] != -1: # if this contour has inner contours
childrenIndex = hierarchy[0, i, 2]
while hierarchy[0, childrenIndex, 0] != -1: # get all children for the outer contour
childrenIndex = hierarchy[0, childrenIndex, 0]
# now the first inner contour is just near the outer one (from the opposite side of the line)
# thats why we are drawing that inner contour's children
if hierarchy[0, childrenIndex, 2] != -1:
cv2.drawContours(image_orig, contours, hierarchy[0, childrenIndex, 2], (0, 0, 255), -1)
您还可以阅读opencv hierarchy tutorial以更好地了解其工作原理