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

Python 如何将彩色盒子与主盒子分开,python,opencv,Python,Opencv,这是主输入图像(名为1.png) 现在,我想确定哪个盒子是彩色的,哪个盒子是空的, 在中间的大盒子里,而不是有数字的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.R

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

现在,我想确定哪个盒子是彩色的,哪个盒子是空的, 在中间的大盒子里,而不是有数字的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)
现在图像看起来像这样

然后我对轮廓进行排序,得到主矩阵框,其中包含所有彩色和非彩色框

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)
彩色主接线盒(全标记):

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

例如:在主框图像中:

橙色应另存为8.jpg

红色应另存为12.jpg

绿色应另存为18.jpg

黄色应另存为19.jpg

蓝色应该是数字21.jpg

请帮助我的代码提取和保存的颜色填充框内正确的数字标签


提前感谢

我希望您尝试获取图像主方形框内的彩色框。 如果是这样的话,你可以试试下面的方法

  • 因为主盒子是方形的。裁剪图像并将每个框保存为单独的图像
  • 然后使用findcounters在所需形状周围绘制计数器
  • 裁剪图像区域,因为已经有计数器值

  • 我们需要更多的信息来提供帮助。你所说的“分开盒子和白色盒子”到底是什么意思?这个网站的目的是帮助你找出你发布的代码的问题,而不是为你写代码。我建议再次阅读规则,然后编辑你的帖子,以符合本网站的指导原则。到目前为止,你的帖子中几乎没有足够的信息来开始你的问题,即使这个网站是一个代码编写服务。那么图像链接会是输入图像吗?好像是手机拍的照片?您应该提供准确的原始图像。如何执行第一步,先生,事实上,我是OpenCV新手,请帮助我编写代码。@Dettrax下面是代码片段,根据您的需要修改它
    area=cv2.contourArea(cnt)x,y,w,h=cv2.boundingRect(cnt)crop=img_Load_to_crop[y:h+y,x:w+x]
    此处Cnt是可以使用查找计数器查找的计数器值。img_Load_To_Crop:加载要裁剪的图像