python - 如何使用 Python 沿着轮廓边框裁剪图像
问题描述
我基本上有数千张带有黑色轮廓的字符图像,所有这些图像要么有白色背景,要么有一些图形背景,通常只是后面的木质纹理。
我想要的是创建一个函数(opencv/pil/whatever),它允许我自动裁剪这些图像,基本上删除角色轮廓之外的所有内容。
左侧是未裁剪的原始图像,右侧是裁剪后的图像。这甚至可能吗?
解决方案
使用简单的方法,您可以获得大部分的方法。假设背景中没有任何黑色,我们可以通过仅遮盖黑色来查找轮廓字符。
然后我们要填写大纲内的所有内容
最后我们可以把面具之外的一切都涂白
这张特定图片的明显问题是我们最终在 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);
推荐阅读
- arrays - 在垂直连接的查询之间添加标题行(或如何填充数组/创建固定大小的数组)
- time - 在 Google 表格中计算两个日期时间之间的时间的更好方法?
- python - 如何使用输入触发谷歌云功能
- javascript - NodeJS 应用程序在 MySQL 数据库上运行查询失败 6 次以上
- python - __init__() 缺少 7 个必需的位置参数
- reactjs - 如何访问 Material UI 数据网格上的“箭头”按钮单击事件?
- php - 如何在一个循环中计算 2 个不同的关系?
- javascript - 我想将信息从表单发送到 JavaScript 数组,然后显示
- javascript - 在不提交表单的情况下使用 JavaScript 计算
- ruby-on-rails - 我如何在运行时检查 rails 应用程序是否在 sidekiq 工作者的上下文中运行?