在OpenCV for Python中查找标记对象中的区域边界

时间:2017-07-31 22:45:15

标签: python opencv contour boundary

我正在寻找图像中四边形的区域边界(轮廓)。我知道该区域内一个点的位置,但我不太了解该区域的颜色/大小属性。我所知道的是,整个地区都会有一个强大的边缘,而且它是一个四边形。

目前,我正在使用阈值算法查找强度/颜色与起点接近的区域,然后找到包含参考点的最大结果轮廓。但是,该区域的强度/颜色可能会逐渐发生变化,从而导致失败。下面是一个示例图像以及使用此方法的代码片段。它适用于第一张图片,但不适用于第二张图片。

I = imread('bluerect.jpg') # Read image
reference_marker = np.array([460,950]) # Manually mark note
I_hsv = cv2.cvtColor(I, cv2.COLOR_BGR2HSV)

# Set bounds based on color of reference point
hsv_value = I_hsv[reference_marker[0],reference_marker[1],:]
lower = np.array([hsv_value[0]-8,hsv_value[1]-hsv_value[1]*.3, hsv_value[2]-hsv_value[2]*.7])
upper = np.array([hsv_value[0]+8,hsv_value[1]+hsv_value[1]*.3, hsv_value[2]+hsv_value[2]*.7])
mask = cv2.inRange(I_hsv, lower, upper) # Find what's in that range

# Fill holes in mask with morphological close
closed_mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, np.ones((5,5),np.uint8))

# Find the contour with the maximum area that contains marker
ret, contours, hierarchy = cv2.findContours(closed_mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for target in sorted(contours, key = cv2.contourArea, reverse=True):
    bb = cv2.boundingRect(target)
    if (bb[0] < center[0] < bb[0]+bb[2]) & (bb[1] < center[1] < bb[1] + bb[3]):
        break

Image 1 - Blue Rectangle Image 2 - White Rectangle

我认为最好的方法是从参考点“填写”,直到我遇到一个强大的,连续的边界......类似于分水岭算法?有人有什么建议吗?

谢谢!

0 个答案:

没有答案