【问题标题】:How To Crop An Image Following Its Outline Border With Python如何使用 Python 沿着轮廓边框裁剪图像
【发布时间】:2021-07-12 16:30:17
【问题描述】:

我基本上有数千张带有黑色轮廓的字符图像,所有这些图像要么有白色背景,要么有一些图形背景,通常后面只有木质纹理。

我想要的是创建一个函数(opencv/pil/whatever),它允许我自动裁剪这些图像,基本上删除角色轮廓之外的所有内容。

左侧是未裁剪的原始图像,右侧是裁剪后的图像。这甚至可能吗?

【问题讨论】:

  • 如果前景色和背景色之间存在对比,则可以使用恒定的背景色。但是任意纹理背景非常困难。你需要一种人工智能/深度学习方法。见remove.bg

标签: python opencv image-processing python-imaging-library


【解决方案1】:

使用简单的方法,您可以获得大部分的成功。假设背景中没有任何黑色,我们可以通过在黑色上进行遮罩来查找轮廓字符。

然后我们要填写大纲里面的所有东西

最后我们可以把面具之外的所有东西都涂白

这张特定图片的明显问题是我们最终捕捉到了 Bean 先生手臂中的封闭背景。我没有看到解决此问题的简单方法。我们可以在遮罩内的区域尝试一些颜色直方图匹配;尝试寻找与蒙版外部区域具有相同颜色配置文件的蒙版内部区域,但这将比当前提供的代码复杂得多。

如果当前方法适用于您的大部分图像,并且您可以轻松地手动编辑其余图像,请执行此操作。如果确实不能作为答案,请告诉我,如果我有时间,我会尝试解决它。​​

import cv2
import numpy as np

# load image
img = cv2.imread("outlined.png");

# mask for black
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY);
mask = cv2.inRange(gray, 0, 50);

# find contours (this is using OpenCV 3, if you're using OpenCV 2 or 4, then it returns as [contours, _])
_, contours, _ = cv2.findContours(mask, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE);

# reset and fill mask
mask[:] = 0;
for con in contours:
    mask = cv2.drawContours(mask, [con], -1, 255, -1);

# redraw image using mask
img[mask != 255] = (255,255,255);

# show
cv2.imshow("Image", img);
cv2.imshow("Mask", mask);
cv2.waitKey(0);

【讨论】:

    猜你喜欢
    • 2020-10-26
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多