【问题标题】:Using Python OpenCV, How would you extract an image area inside a particular color bounding box?使用 Python OpenCV,您将如何提取特定颜色边界框内的图像区域?
【发布时间】:2015-08-15 15:31:16
【问题描述】:

给定一张我手动绘制的彩色边界框的照片, 我想复制/裁剪图像内容,以将内容保留在边界框内。

目标是检测颜色边界框,然后使用它告诉脚本复制/裁剪的位置。

我已经尝试过轮廓,但似乎我需要额外的步骤。

也许是一种方法:

  • 检测有界区域
  • 找到最小的区域(框线的粗细可能不同,所以我需要内部边界区域 - 边界最终将是物理世界中的彩色海报板剪切框)
  • 脚本为该区域创建掩码
  • 抓图

可能有更好的方法; 解决此问题的最佳方法是什么? 我会使用哪些 Python OpenCV 方法?

基于我目前的实验代码(我正在探索按轮廓大小获取区域,但我认为我需要更好的轮廓代码):

import numpy as np
import cv2

image_dir = "/Users/admin/Documents/dir/dir2/"

im = cv2.imread(image_dir+'test_image_bounded.png')
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,176,190,43)
#ret,thresh = cv2.threshold(imgray,127,255,0)
contours, hierarchy =         cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

areaArray = []
count = 1

for i, c in enumerate(contours):
    area = cv2.contourArea(c)
    areaArray.append(area)

#first sort the array by area
sorteddata = sorted(zip(areaArray, contours), key=lambda x: x[0], reverse=True)

#find the nth largest contour [n-1][1], in this case 2
largestcontour = sorteddata[0][2]

#draw it
x, y, w, h = cv2.boundingRect(largestcontour)
cv2.drawContours(im, largestcontour, -1, (255, 0, 0), 2)
cv2.rectangle(im, (x, y), (x+w, y+h), (0,255,0), 2)
cv2.imwrite(image_dir+'output.jpg', im)

编辑--------------------------------

我已经通过颜色检测、形态学和抓取第二大阈值获得了一些相当不错的结果

以下是一些相关代码:

green_MIN = np.array([45, 25, 25],np.uint8)
green_MAX = np.array([55, 255, 255],np.uint8)

hsv_img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

frame_threshed = cv2.inRange(hsv_img, green_MIN, green_MAX)

#image = cv2.imread('...') # Load your image in here
# Your code to threshold
#image = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 45, 0)    

# Perform morphology
se = np.ones((20,20), dtype='uint8')
image_close = cv2.morphologyEx(frame_threshed, cv2.MORPH_CLOSE, se)

HSV 值很痛苦;我想自动化那部分。 这有助于获得价值: https://achuwilson.wordpress.com/2012/02/14/hsv-pixel-values-in-opencv/

【问题讨论】:

    标签: python image opencv computer-vision


    【解决方案1】:

    我的快速建议是:

    1) 按颜色过滤,因为矩形是绿色的。图像本身也可能存在绿色,但这会减少误报。

    2) 检测形成矩形的线条。

    现在这可以通过多种方式完成。更通用的方法是使用霍夫变换。我不知道可以直接搜索矩形的实现,尽管您也可以实现它。 HoughLinesP 函数将查找线条,您可以选择形成矩形的线条。

    但是,在您的应用程序中,您可能有非常严格的假设,这会使这个问题变得更容易。如果从不旋转边界框,您可以简单地遍历行和列以找到具有您要查找的颜色的最大像素数量的行和列。这可以扩展为寻找连续像素以找到线段,但可能甚至没有必要。

    【讨论】:

    • 您会专门建议哪些方法来按颜色过滤?;我对 openCV 很陌生。我环顾四周;似乎颜色跟踪有潜力,如果我弄清楚如何为静止图像调整东西,我将无法指望永远不会旋转的矩形,但也许我可以找到线条,然后找到一定范围内的颜色,并从那里解决。但最简单的就是最好的
    • 这又取决于假设。你知道矩形颜色的精确 RGB 值吗?
    • 我确实通过颜色过滤获得了不错的效果;我更新了我原来的帖子。一个主要的痛点是 HSV 范围 - 范围应该始终相同,因为将使用相同的颜色。
    猜你喜欢
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 2021-09-27
    • 1970-01-01
    • 2021-05-05
    • 2023-03-26
    • 2021-12-23
    相关资源
    最近更新 更多