首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将颜色填充与主大方框分开,并使用正确的标签保存它们

如何将颜色填充与主大方框分开,并使用正确的标签保存它们
EN

Stack Overflow用户
提问于 2018-12-13 23:48:14
回答 1查看 32关注 0票数 0

下面是主输入图像(名为1.png):

现在,我想要识别哪个盒子是用颜色填充的,哪个盒子是空的,在中间的大盒子里,而不是有数字的20个边框中。

我写了从图片中提取main big box的代码:

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)

现在图像看起来像这样:

然后,我对轮廓进行排序,得到包含所有彩色和非彩色盒子的主矩阵盒。

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)

所以,主框现在看起来像这样:

标记外框

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 (完全标记):

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

例如:在main_box.jpg镜像中:

橙色应另存为8.jpg

红色应另存为12.jpg

绿色应另存为18.jpg

黄色应另存为19.jpg

蓝色应为number 21.jpg

请帮助我的代码,以提取和保存颜色填充物内的正确的数字标签的盒子。

EN

回答 1

Stack Overflow用户

发布于 2018-12-14 00:55:19

您需要解决两个子集的问题。

  1. 获取彩色方框的边界框。
  2. 使用方框索引命名它们,因此首先我们需要裁剪与每种颜色对应的图像。要获取图像中的颜色,请使用以下命令:

0) max_y = max(idx_set:,1) #这将为您提供该特定颜色的边界框

步骤2:指定正确的名称,让bbox_small作为主大框中每个小框的边界框,然后根据所有矩形(=sorted_bbox数组)一角的y坐标对其进行排序。并将密钥(Id)分配给每个框=该框在sorted_bbox +1中的索引

现在

每个彩色框的名称:

= i+1,这样colored_box就位于sorted_boxi内部

我没有写任何代码,这只是一个想法。此外,我认为使用Hough变换来获取矩形的角点也是一个很好的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53765484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档