我有一组灰度图像,如下所示:
这是一个示例图像,因为我无法发布原始图像。每个图像都有一个带纹理的区域,一个纯白色水印(pos)和许多不需要的黑色空间。
理想情况下,此图片应裁剪为:
每张图片中的水印可能略有不同,但纯白色文字总是非常薄。
图片看起来非常不同,这是另一个例子
这个只需要在左边裁剪
另一个:这个需要在顶部和底部裁剪:
和另一个
这个需要在顶部和右侧裁剪。请注意,我在此图片中留下了水印。理想情况下,水印也会被删除,但我想没有它会更容易。
这是水印的图片,它在现实中的样子。
图像大小不一,但通常很大(超过2000x2000)。
我正在寻找python中的解决方案(也许是cv2)。
我的第一个想法是使用这样的东西: Python & OpenCV: Second largest object
但此解决方案代码对我失败
答案 0 :(得分:0)
我在C#和C ++中工作并且不在python中工作,但可以向你推荐逻辑。
您需要对图像进行两次扫描,一行扫描,另一行扫描。
由于您说图像的不需要部分始终是黑色,因此只需读取两次扫描中的像素值。如果某行中所有像素的颜色为黑色,则可以选择或删除该行。列式扫描可以遵循类似的步骤。
现在我们不能如此轻易地消除行和列,所以只需记下冗余的行和列,然后使用以下代码裁剪图像:(我将使用emgucv库在C#中编码,但它很容易理解for python)
Mat original_image = new Mat();
Rect ROI = new Rect(x,y,width,height);
Mat image_needed_to_crop = new Mat(original_image,ROI);
此代码仅从原始图像中提取感兴趣的区域。