如何将彩色盒子与主盒子分开

时间:2018-12-11 15:57:35

标签: python opencv

这是主输入图像(名为1.png)

https://drive.google.com/open?id=1Ga5sP89jttP4pWhdnBet9l_bwYxC97f5

现在,我想确定哪个框填充了颜色,哪个框为空, 在中间的大盒子里,而不是有数字的20个侧边盒子。

我编写了从图像中提取主要大盒子的代码

image = cv2.imread(path)

gray = cv2.cvtColor(image , cv2.COLOR_BGR2GRAY)

edge = cv2.Canny(gray.copy() , 10 ,70)

_,contours,_ = cv2.findContours(edge.copy() , cv2.RETR_EXTERNAL ,cv2.CHAIN_APPROX_SIMPLE)

cv2.drawContours(image, contours , -1, (0,0,255) , 3)
plt.imshow(image)
cv2.imwrite('image.jpg',image)

现在图像看起来像这样

https://drive.google.com/open?id=1bbqUac1Da2gLuMLly_tTAKPdkutQ5jJ-

然后我对轮廓进行排序,以获得包含所有有色和无色框的主矩阵框。

sorted_contours = sorted(contours,key = cv2.contourArea,reverse=True)

然后我分开了主机箱

img = cv2.imread('1.png')
cnt = sorted_contours[0]
x,y,w,h = cv2.boundingRect(cnt)
main_box = img[y:y+h,x:x+w].copy()
cv2.imwrite('main_box.jpg',main_box)
plt.imshow(main_box)

主框如下:

https://drive.google.com/open?id=1iEhLxBkENWyam0CVFTPx-IbmNOl843MN

标记外部框

main_box_gray = cv2.cvtColor(main_box,cv2.COLOR_BGR2GRAY)
_, main_box_gray = cv2.threshold(main_box_gray,5,255,cv2.THRESH_BINARY)


_,t_c,_ = cv2.findContours(main_box_gray.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

colored_main_box = img[y:y+h,x:x+w].copy()

cv2.drawContours(colored_main_box,t_c,-1,(255,0,0),2)

标记了外框,现在我将外轮廓分开以将框放入其中:

sorted_box = sorted(t_c,key = cv2.contourArea,reverse=True)

colored_main_box = img[y:y+h,x:x+w].copy()
cnt = sorted_box[0]

x2,y2,w2,h2 = cv2.boundingRect(cnt)

temp_image = colored_main_box[y2:y2+h2,x2:x2+w2].copy()


edge_temp = cv2.Canny(temp_image,100,200)

_,t_c_1,_ = cv2.findContours(edge_temp.copy(),cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

colored_main_box = img[y:y+h,x:x+w].copy()

colored_main_box = colored_main_box[y2:y2+h2,x2:x2+w2].copy()

cv2.drawContours(colored_main_box,t_c_1,-1,(0,0,255),1)

plt.imshow(colored_main_box)
cv2.imwrite("full_marked.jpg",colored_main_box)

colored_main_box(完整标记):

https://drive.google.com/open?id=1lGKXlc_7g9kYWSWfXnfYIZQZonNygKer

现在,我已经标记了所有内部框,并且可以使用cv2.countNonZero函数找到哪个框被填充,但是我的主要任务是将填充框内的颜色另存为单独的图像,而没有框的外部黑色边框包含该颜色填充,以及保存的仅包含颜色填充的图像, 应该以提取的框命名。

例如:在main_box图片中:

https://drive.google.com/open?id=1iEhLxBkENWyam0CVFTPx-IbmNOl843MN

橙色应另存为8.jpg

红色应另存为12.jpg

绿色应另存为18.jpg

黄色应另存为19.jpg

蓝色应为数字21.jpg

请帮助我提取代码,并用正确的数字标签在框中填充颜色填充。

预先感谢

1 个答案:

答案 0 :(得分:0)

我希望您尝试将彩色方框放在图像的主方框内。 如果是这样,您可以尝试以下方法。

  1. 因为主箱的形状是正方形。裁剪图像并将每个框保存为单独的图像。
  2. 然后使用findcounters围绕所需的形状绘制计数器。
  3. 在已经具有计数器值的情况下裁剪图像区域