【问题标题】:crop unwanted black space of image裁剪不需要的图像黑色空间
【发布时间】:2017-06-14 03:49:51
【问题描述】:

我有一组灰度图像,如下所示:

这是示例图片,因为我无法发布原始图片。每个图像都有一个带有纹理的区域、一个纯白色水印 (pos) 和许多不需要的黑色空间。

理想情况下,该图像应裁剪为:

每张图片的水印可能略有不同,但总是很细的纯白色文字。

图片可能看起来很不一样,这是另一个例子

这个只需要在左边裁剪

另一个:

这个需要上下裁剪:

还有一个

这个需要在顶部和右侧裁剪。请注意,我在这张照片中留下了水印。理想情况下水印也会被删除,但我想没有水印会更容易。

这是水印在现实中的样子。

图片大小不一,但通常都很大(超过 2000x2000)。

我正在寻找 Python 中的解决方案(可能是 cv2)。

我的第一个想法是使用这样的东西: Python & OpenCV: Second largest object

但是这个解决方案代码对我来说失败了

【问题讨论】:

  • 显示你到目前为止所做的事情。
  • @MarkSetchell 感谢 Mark,您的解决方案很棒而且有效,但我现在意识到我需要对图像进行即时处理,这必须在 python 中完成。
  • 使用阈值(+可能扩张+侵蚀)+轮廓提取+最大轮廓边界框+对最大轮廓边界框进行子图像化。

标签: python image opencv image-processing opencv3.0


【解决方案1】:

我在 C# 和 C++ 中工作,不在 python 中工作,但可以向您推荐逻辑。

您需要对图像进行两次扫描,一次扫描,另一列扫描。

由于您说图像中不需要的部分始终是黑色的,因此只需在两次扫描中读取像素值即可。如果某一行中所有像素的颜色都是黑色,那么您可以删除或删除该行。可以按照类似的步骤进行逐列扫描。

现在我们不能简单地删除行和列,所以只需记下多余的行和列,然后您可以使用以下代码裁剪图像:(我将使用 emgucv 库在 C# 中编写代码,但它很容易理解对于python)

Mat original_image = new Mat();
Rect ROI = new Rect(x,y,width,height);
Mat image_needed_to_crop = new Mat(original_image,ROI);

此代码仅从原始图像中提取感兴趣的区域。

【讨论】: