图像处理:在(非常)相同的背景颜色上检测对象的边界

Image Processing : Border detection of an object on (quite) the same background color

我正在研究 Python 3.6,几乎只有 OpenCV.3。 我正在尝试自动找到 sheet 纸张的轮廓以将其裁剪为合适的尺寸,示例如下:

我看过很多关于完全相同主题的帖子,但最后没有一个真正适合我。

所以这是我使用的代码:

orig = cv2.imread("Image.jpg")
cv2.imshow('result', imutils.resize(orig, height=600))
cv2.waitKey(0)

img = cv2.cvtColor(orig, cv2.COLOR_BGR2GRAY)
cv2.GaussianBlur(img, (3,3), 0, img)


edges = cv2.Canny(img,10,20,apertureSize = 3)
cv2.imshow('result', imutils.resize(edges, height=600))
cv2.waitKey(0)

这是输出:

所以现在我尝试使用 HougLines 或 HougLinesProbabilities 来查找计数。

#minLineLength=100000
#maxLineGap=50
#lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap)
lines = cv2.HoughLines(edges,1,np.pi/180*10,150,0,0)

但是我没有任何可用的..(如果我在这里有更多的声望,我可以添加我获得的东西) 我不知道我是否不必使用 HoughLines 或者我是否只是无法获得正确的参数.. 我已经看过角点检测,但这是完全相同的问题。

有什么想法吗?

颜色比你想象的更不一样。

拉平图像的亮度以校正照明伪影,然后使像素更接近 sheet 的颜色而不是背景的颜色。

好的,对于那些将到达此页面的人,我发现了一些不错的东西。

首先,找出所有的轮廓,在一张黑图上画出来。 (我把它们画得更大了,这样如果 OpenCv 找到的等高线之间有 space,你就不会被打扰)

_, contours, _ = cv2.findContours(edges.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
contours=list(filter(lambda cont: cv2.arcLength(cont, False) > 60, contours))
# show only contours
blank = np.zeros((orig.shape[0],orig.shape[1],3), np.uint8)
cv2.drawContours(blank, contours,-1,(0,255,0),5)

contours

edges = cv2.Canny(blank,10,20,apertureSize = 3)
_, contours, _ = cv2.findContours(edges.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

然后第二次应用 canny 并找到轮廓。如果你的图像不完美,这一步真的只是为了能够找到真实的轮廓。

maxcontour=0
for cnt in contours:
    cv2.drawContours(img, cnt, 0, (255, 255, 0), 2)
    if cv2.contourArea(cnt)>5000:  # remove small areas like noise etc
        hull = cv2.convexHull(cnt)    # find the convex hull of contour
        hull = cv2.approxPolyDP(hull,0.1*cv2.arcLength(hull,True),True)
        if len(hull)==4:
            cv2.drawContours(img,[hull],0,(0,255,0),2)

final