Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python OpenCV,如何提取特定颜色边界框内的图像区域?_Python_Image_Opencv_Computer Vision - Fatal编程技术网

使用Python OpenCV,如何提取特定颜色边界框内的图像区域?

使用Python OpenCV,如何提取特定颜色边界框内的图像区域?,python,image,opencv,computer-vision,Python,Image,Opencv,Computer Vision,给定一张我手动绘制彩色边界框的照片, 我想复制/裁剪图像内容,以将内容保留在边界框内 目标是检测颜色边界框,然后使用它告诉脚本复制/裁剪的位置 我尝试过轮廓,但似乎我需要额外的步骤 也许是一种方法: 检测有界区域 找到最小的区域(框线可以是可变厚度的,因此我需要内部边界区域-边界最终将是物理世界中的彩色海报板剪切框) 脚本将为该区域创建一个遮罩 抓住图像 还有更好的办法; 最好的办法是什么? 我将使用哪些Python OpenCV方法 根据我目前的实验代码(我正在探索通过轮廓大小获得面积,但

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

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

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

也许是一种方法:

  • 检测有界区域
  • 找到最小的区域(框线可以是可变厚度的,因此我需要内部边界区域-边界最终将是物理世界中的彩色海报板剪切框)
  • 脚本将为该区域创建一个遮罩
  • 抓住图像
还有更好的办法; 最好的办法是什么? 我将使用哪些Python OpenCV方法

根据我目前的实验代码(我正在探索通过轮廓大小获得面积,但我认为我需要更好的轮廓代码):

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

通过颜色检测、形态学和获取第二大阈值,我获得了一些非常好的结果

以下是一些相关代码:

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值是一种痛苦;我想把那个部分自动化。 这有助于获得价值:
我的建议是:

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

2) 检测形成矩形的线条

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


然而,在您的应用程序中,您可能有相当严格的假设,这将使这个问题变得更容易。如果边界框从未旋转过,则可以简单地在行和列上迭代,以查找具有所需颜色的最大像素数的行和列。可以扩展到查找相邻像素以查找线段,但甚至可能没有必要。

您会特别推荐哪些方法来按颜色过滤?;我对openCV的深入了解还很陌生。我环顾了一下周围;颜色跟踪似乎有潜力,如果我知道如何适应静止图像,我将无法指望矩形永远不会旋转,但也许我可以找到线条,然后找到一定范围内的颜色,并从那里计算出来。但最简单的是最好的,这又取决于假设。你知道矩形颜色的精确RGB值吗?我通过颜色过滤获得了很好的效果;我更新了我原来的帖子。一个主要的痛苦是HSV的范围-范围应始终相同,因为将使用相同的颜色。
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)