使用OpenCV获取外部轮廓(Python)

时间:2018-10-18 19:11:49

标签: python opencv

我正在尝试使用opencv和python获取图像的外部轮廓。

我在这里(Process image to find external contour找到了解决此问题的方法,但是该方法对我不起作用-代替轮廓图像,它打开了两个新图像(一个全为黑色,另一个为黑白) )。

这是我正在使用的代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    <com.example.customviews.views.ClippedCircleView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/test"
        android:paddingTop="@dimen/clipped_circle_padding_top"
        android:scaleType="center"/>
</RelativeLayout>

该图显示了我得到的两个窗口,而不是轮廓。

enter code here

1 个答案:

答案 0 :(得分:0)

您正在犯一些会影响您结果的错误。从documentation中读取的内容是:

  • 为获得更高的准确性,请使用二进制图像(请参阅步骤3)。
  • 查找轮廓就像从黑色背景中找到白色物体(请参阅步骤2)。

您不遵守这些规则,因此不会获得良好的结果。另外,您正在将结果绘制为黑色图像,并且不可见。

以下是您案件的完整解决方案。

我也使用adaptive threshold以获得更好的结果。

# Step 1: Read in the image as grayscale - Note the 0 flag
im = cv2.imread("/home/jorge/Downloads/input.jpg", 0)
cv2.imshow('Original', im)
cv2.waitKey(0)
cv2.destroyAllWindows()

# Step 2: Inverse the image to get black background
im2 = im.copy()
im2 = 255 - im2
cv2.imshow('Inverse', im2)
cv2.waitKey(0)
cv2.destroyAllWindows()

# Step 3: Get an adaptive binary image
im3 = cv2.adaptiveThreshold(im2, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 11, 2)
cv2.imshow('Inverse_binary', im3)
cv2.waitKey(0)
cv2.destroyAllWindows()

# Step 4: find contours
_, contours, hierarchy = cv2.findContours(im3.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

# Step 5: This creates a white image instead of a black one to plot contours being black
out = 255*np.ones_like(im)
cv2.drawContours(out, contours, -1, (0, 255, 0), 3)
cv2.drawContours(im, contours, -1, (0, 255, 0))