【问题标题】:How to seperate coloured boxes from the main box如何将彩色盒子与主盒子分开
【发布时间】:2019-05-12 15:55:09
【问题描述】:

这里是主要的输入图片(命名为 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

请帮助我提取代码并将颜色填充保存在带有正确数字标签的框内。

提前致谢

【问题讨论】:

  • 我们需要更多信息才能提供帮助。您所说的“将盒子与白色盒子分开”到底是什么意思?
  • 本网站旨在帮助您找出您发布的代码存在的问题,而不是为您编写代码。我建议再次阅读规则和this article,然后编辑您的帖子以符合本网站的指南。到目前为止,您的帖子中几乎没有足够的信息来解决您的问题,即使这个网站是一个代码编写服务。
  • 那么图片链接会是输入图片吗?好像是手机拍的?您应该提供准确的原始图片。

标签: python opencv


【解决方案1】:

我希望您正在尝试获取主图像方形框内的彩色框。 如果是这种情况,您可以尝试以下方法。

  1. 因为主盒子的形状是方形的。裁剪图像并保存每个框单独的图像。
  2. 然后使用查找计数器在您需要的形状周围绘制计数器。
  3. 裁剪图像区域,因为您已经有了计数器值

【讨论】:

  • 第一步怎么做,其实先生,我是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 是您可以使用 Find Counters 找到的计数器值。 img_Load_To_Crop:加载要裁剪的图像
猜你喜欢
  • 2023-02-14
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多