【发布时间】:2021-09-01 15:55:10
【问题描述】:
我是 CV 新手,我刚刚学会了如何检测纸张的边缘。我想尝试一些更复杂的东西。所以我从一个电影网站截屏,想从网站上检测海报。如果背景颜色与海报不同,效果很好。但是当它们颜色相似时,我找不到图片的边缘
cv2.findContours()
原图为:
Poster
而我所做的是:
img = cv2.imread('pic5.jpg')
orig = img.copy()
image = orig
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
binary = cv2.medianBlur(gray,3)
# blur = cv2.GaussianBlur(binary, (5, 5), 0)
# ret, binary = cv2.threshold(blur,127,255,cv2.THRESH_TRUNC)
edged = cv2.Canny(binary, 3, 30)
show(edged)
# detect edge
contours, hierarchy = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
cnts = sorted(contours, key=cv2.contourArea, reverse=True)[:5]
#
for c in cnts:
# approx
peri = cv2.arcLength(c, True)
eps = 0.02
approx = cv2.approxPolyDP(c, eps*peri, True)
# detect square (4 points)
if len(approx) == 4:
screenCnt = approx
break
res = cv2.drawContours(image, [screenCnt], -1, (0, 255, 0), 2)
show(orig)
结果是: after preprocess What I detect
我不知道这种方法是否有效。是否可以根据背景颜色(与海报颜色无关)检测正方形部分?
【问题讨论】:
-
嗨!您可以在检测到边缘后尝试进行闭合操作,这样您就可以填补海报中的空白并获得更平滑,更接近矩形的东西。 docs.opencv.org/master/d9/d61/…
-
但是在这里检测边缘听起来不是一个好方法,因为它在很大程度上取决于海报的内容和颜色。您可以尝试定位网站的一些固定元素,然后从已知的 x,y 偏移量中剪切海报。
-
另一种方法是遍历图像,并找到边界框,其中您有一些与背景不同的颜色和与文本颜色不同的颜色。但是,如果您的海报与网站背景颜色相同,这可能会失败。
-
如果这是一项真正的任务,那么您可能需要结合几种方法,检查每个算法找到的海报有多大,如果算法失败,则回退到另一个。如果只是为了教育,你可以继续解决一些明确定义的问题,或者按照这里的优秀教程:docs.opencv.org/master/d6/d00/tutorial_py_root.html
-
感谢您的回复!我想到了海报与网站背景颜色相同的情况。但我想只有极少部分的海报有相同的颜色。在这种情况下,即使没有找到边缘的某些部分,我们也可以找到包含剩余部分的最小矩形。
标签: python opencv image-processing deep-learning computer-vision