如何将图像上的对象轮廓绘制到单独的图像上

时间:2019-05-10 01:28:05

标签: python image numpy opencv matplotlib

我正在研究拼图,我的最后任务是识别拼图的边缘类型。

enter image description here

如上图所示,我有一个旋转角度并裁切出该片的每个边缘以相同角度的菜单。我的下一步是将边缘线分成单独的图像,如下图所示

enter image description here

然后用一种颜色填充线的一侧,并尝试对其进行处理以确定其边缘类型。

我暂时没有找到将边缘线与图像分开的正确方法。

我的方法:: 一种方法是逐像素扫描并找到旁边有一个修女黑色像素的黑色像素。这是我可以实现的代码。但感觉像是一种原始且费时的方法。

因此,如果可以的话,您可以提供任何帮助或想法,或者以任何完全不同的方式来检测凹陷和隆起。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

首先将彩色图像转换为灰度图像。然后应用一个阈值,例如零,以获得二进制图像。如果有孔,您可能必须使用形态学运算来进一步处理二进制图像。然后找到该图像的轮廓并将其绘制到新图像。

rgb

binary

cont

下面给出了一个简单的代码,使用opencv 4.0.1中的python 2.7

bgr = cv2.imread('puzzle.png')
gray = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
_, roi = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY)
cv2.imwrite('/home/dhanushka/stack/roi.png', roi)
cont = cv2.findContours(roi, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
output = np.zeros(gray.shape, dtype=np.uint8)
cv2.drawContours(output, cont[0], -1, (255, 255, 255))

# removing boundary
boundary = 255*np.ones(gray.shape, dtype=np.uint8)
boundary[1:boundary.shape[0]-1, 1:boundary.shape[1]-1] = 0

toremove = output & boundary
output = output ^ toremove