I have an image, for which I've extracted the contours using OpenCV and calculated their areas.
image = cv2.imread("shapes_and_colors.jpg")
"""Find contours"""
gray = cv2.cvtColor(shapes.copy(), cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5, 5), 0)
thresh = cv2.threshold(src=blur, thresh=60, maxval=255, type=cv2.THRESH_BINARY)[1]
new_image, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
"""Plot image and contours"""
fig, ax = plt.subplots(ncols=2)
ax[0].imshow(image)
ax[0].axis('off')
canvas = np.zeros_like(image)
for i, c in enumerate(contours):
M = cv2.moments(c)
if M["m00"] != 0:
cX = int((M["m10"] / M["m00"]))
cY = int((M["m01"] / M["m00"]))
else:
cX,cY = 0,0
cv2.drawContours(canvas, [c], -1, (255, 0, 255), 2)
ax[1].text(x=cX, y=cY, s=u"{}".format(cv2.contourArea(c)), color="cyan", size=8)
ax[1].imshow(canvas)
ax[1].axis('off')
plt.tight_layout()
Now I'd like to plot them using the contour as the marker, something like:
fig, ax = plt.subplots()
"""Convert contour to marker"""
def contour2marker(contour):
...
return marker
for i,c in enumerate(sorted(contours, key=cv2.contourArea)):
ax.scatter(x=i, y=cv2.contourArea(c), marker=contour2marker(c))
plt.tight_layout()
I don't know where to start with converting the contours to markers. I'm aware the contours are saved as a collection of points, and looking at this post, it is not straightforward to crop them out of an image. Rather, masks are created or rectangles are cropped out of images. However, if the shapes don't conform to regular polygons this technique doesn't work. If the contours could be converted to images then they could easily be plotted like in this example.