【发布时间】:2019-09-20 17:28:23
【问题描述】:
我有一个小脚本 (GitHub)(基于 this answer)来检测白色背景上的对象。该脚本工作正常并检测到对象。例如这张图片:
变成这样:
我裁剪了boundingRect(红色的)。
我将对这张图片做进一步的操作。例如,我将只裁剪轮廓,而不是矩形裁剪。 (无论如何,这些都是要面对的进一步问题。)
我现在想做的是扩大/扩大轮廓(绿色)。我不确定在这种情况下规模和增长是否意味着同样的事情,因为当我想到规模时,通常有一个原点/锚点。随着增长,它与边缘有关。我想要这样的东西(在 Photoshop 中创建):
所以在我检测到对象/找到轮廓之后,我想将它增加一些值/比率,以便我有一些空间/像素可以修改,这不会影响对象。我该怎么做?
提到的脚本:
# drop an image on this script file
img_path = Path(sys.argv[1])
# open image with Pillow and convert it to RGB if the image is CMYK
img = Image.open(str(img_path))
if img.mode == "CMYK":
img = ImageCms.profileToProfile(img, "Color Profiles\\USWebCoatedSWOP.icc", "Color Profiles\\sRGB_Color_Space_Profile.icm", outputMode="RGB")
img = cv2.cvtColor(numpy.array(img), cv2.COLOR_RGB2BGR)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
threshed = cv2.threshold(gray, 240, 255, cv2.THRESH_BINARY_INV)[1]
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (11,11))
morphed = cv2.morphologyEx(threshed, cv2.MORPH_CLOSE, kernel)
contours = cv2.findContours(morphed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
contour = sorted(contours, key=cv2.contourArea)[-1]
x, y, w, h = cv2.boundingRect(contour)
final = cv2.drawContours(img, contours, -1, (0,255,0), 2)
cv2.rectangle(final, (x,y), (x+w,y+h), (0,0,255), 2)
cv2.imshow("final", final)
cv2.waitKey(0)
cv2.destroyAllWindows()
此处发布的图片已按比例缩小以保持问题简短。原始图像和脚本可以在提到的(第一段)GitHub页面上找到。
【问题讨论】:
-
一种天真的方法可能是:在一些黑色图像(填充的白色)上绘制你找到的轮廓。然后在那个“面具”上使用形态膨胀,并重新找到现在更大的轮廓。根据您的图像有多大,以及此步骤必须完成的速度/效率,这可能是编程方面的一种简单方法。
-
@HansHirse 您想用一些示例代码发布答案吗?我设法让它工作,如果你不这样做,我会发布它。
-
欢迎发布您的解决方案! :) 我只是给出了一个想法,没有(完整的)答案。很高兴它对你有用!
-
@HansHirse 是的。我对 Python 比较陌生,对 OpenCV 完全陌生。所以这是一场胜利:)
标签: python opencv scale opencv-contour