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

Posted

技术标签:

【中文标题】图像处理:在(相当)相同的背景颜色上检测对象的边界【英文标题】:Image Processing : Border detection of an object on (quite) the same background color 【发布时间】:2017-06-20 09:50:08 【问题描述】:

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

我看过很多关于完全相同主题的帖子,但最后对我来说没有任何意义。

这是我使用的代码:

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 或者我是否无法获得正确的参数.. 我已经研究过角点检测,但这是完全相同的问题。

有什么想法吗?

【问题讨论】:

你正在寻找一个矩形吗?尝试在您的精明图像中找到最大的矩形(3D),这将得到纸张。旁注:正如我的建议所见,图像处理解决方案通常是针对特定问题的。如果一张白纸上写着 SO 的好词不是你常见的情况,你应该尝试添加真实的 它会被消耗掉,所以有点像。仍然是矩形,仍然是白色,等等。我试图找到最大的矩形,但大多数情况下它不起作用,因为整个矩形不完整,大部分时间一侧缺少一半。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

首先,找到所有轮廓,然后在一张黑色图片上将它们取出。 (我已经把它们画得更大了,这样如果 OpenCv 找到的轮廓之间有空间,你就不会被打扰)

_, 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 & find 轮廓。这一步真的只是为了在你的图像不完美的情况下能够找到一个真实的轮廓。

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

【讨论】:

以上是关于图像处理:在(相当)相同的背景颜色上检测对象的边界的主要内容,如果未能解决你的问题,请参考以下文章

python-opencv轮廓基本绘制

18KW15/1-OpenCV入门-初识轮廓

检测图像中的类似对象

用php检测png图像的背景颜色是不是为灰色[重复]

如何使用 tf.image.draw_bounding_boxes 在原始图像上绘制边界框以显示检测到对象的位置?

Make R-CNN论文学习