我正在寻找图像中四边形的区域边界(轮廓)。我知道该区域内一个点的位置,但我不太了解该区域的颜色/大小属性。我所知道的是,整个地区都会有一个强大的边缘,而且它是一个四边形。
目前,我正在使用阈值算法查找强度/颜色与起点接近的区域,然后找到包含参考点的最大结果轮廓。但是,该区域的强度/颜色可能会逐渐发生变化,从而导致失败。下面是一个示例图像以及使用此方法的代码片段。它适用于第一张图片,但不适用于第二张图片。
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
我认为最好的方法是从参考点“填写”,直到我遇到一个强大的,连续的边界......类似于分水岭算法?有人有什么建议吗?
谢谢!