【问题标题】:How to detect a specific border detail of an image and crop according to it using python and PIL?如何使用 python 和 PIL 检测图像的特定边界细节并根据它进行裁剪?
【发布时间】:2019-12-10 02:10:57
【问题描述】:

我目前正在尝试通过检测文档右上角和左下角的 2 个大黑角来裁剪图像:http://www.suiteexpert.fr/AideProd/SalaireExpert/Images/Editions/aemapercu.png 我试图找到一种比深度学习 OCR 更简单的方法以获得更好的性能。

我尝试了一些不同的方法,例如检测颜色的变化,从文档的边缘开始检测从白色到黑色的变化。这似乎可行,但它首先检测到一些图像示例上的非常小的垂直文本:https://www.movinmotion.com/wp-content/uploads/2018/03/AEM-V5-MM-.jpg

这也会导致其他问题,因为我要分析的文档也可能是不同颜色的,也可能是扫描件或照片。

但是,这些文件将始终具有相同的内部形状和结构(这是一个标准化的行政文件)。

我希望得到您关于如何检测文档右上角和左下角的 2 个大黑角的反馈,这将允许我通过旋转和裁剪来处理和标准化图像。

from PIL import Image, ImageChops

def trim(im, border):
     bg = Image.new(im.mode, im.size, border)
     diff = ImageChops.difference(im, bg)
     bbox = diff.getbbox()
     if bbox:
         return im.crop(bbox)
     else:
         # found no content
         raise ValueError("cannot trim; image was empty")

提前感谢您的帮助!

【问题讨论】:

  • 正如您所说的“这些文档将始终具有相同的内部形状和结构”,因此您可以尝试获取两个黑角的坐标,然后通过他们。我的方法是,正如您所说,每个文档都将使用相同的内部形状/格式,因此它们的大小/框架也将相同。如果他们是那么裁剪可能是要走的路
  • 那么文档的内部结构是相同的,我的意思是这两个黑角里面是什么。但文档边缘的空白边距可能会有所不同。这就是为什么我不能只使用两个黑角的坐标,因为它们并不总是相同的。

标签: python-3.x image-processing python-imaging-library crop object-detection


【解决方案1】:

我现在没有时间用 Python 写这个,但如果你按照以下步骤操作,你就可以做到:

  • 使用矩形 5x5 结构元素执行 “形态闭合”,以消除边缘(以及其他任何地方)周围的细线

  • 修剪图像以去除边缘周围多余的白色边框

我在终端中使用 ImageMagick 做到了,如下所示:

convert form.png -threshold 50% -morphology close rectangle:5 -trim result.png

然后偷偷地添加了一个红色边框,以便您可以在 Stack Overflow 的白色背景上看到图像的范围:

在 Python 中,使用 skimage 进行形态学 - 如下所示:

# Convert edges to Numpy array and dilate (fatten) with our square structuring element
selem = square(6)
fatedges = dilation(np.array(edges),selem)

this answer 中,除非您需要binary_closing() 代替dilation() - 请参阅documentation here

然后您可以使用 PIL/Pillow 的 Image.getbbox() 进行修剪。当然,您将裁切框应用于原始图像的干净副本,而不是形态改变的副本:-)

【讨论】:

    【解决方案2】:

    您还可以使用“命中或未命中形态”在右上角查找Lshape。您定义了一个必须击中图像的形状和一个必须错过图像的形状,它会告诉您这两种情况在哪里是正确的。文档是here

    如果我们放大右上角的L 形状直到你可以计算出单个像素,你会看到L 的水平条大约是 18x6 像素:

    所以,

    import scipy as sp 
    import numpy as np
    import cv2
    
    # Load image
    form=cv2.imread('form.png',cv2.IMREAD_GRAYSCALE)
    
    # We are going to do Hit-or-Miss morphology, define structuring elements
    hit = np.zeros((10,10), dtype=np.int) 
    hit[:,-4:]=1
    hit[:4,:]=1
    

    看起来像这样:

    array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
           [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
           [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
           [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
           [0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
           [0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
           [0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
           [0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
           [0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
           [0, 0, 0, 0, 0, 0, 1, 1, 1, 1]])
    

    现在定义我们必须错过的内容:

    miss = np.zeros_like(hit)
    miss[-4:,:4]=1
    

    看起来像这样:

    array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
           [1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
           [1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
           [1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
           [1, 1, 1, 1, 0, 0, 0, 0, 0, 0]])
    

    现在应用 Hit-or-Miss:

    res = sp.ndimage.binary_hit_or_miss(1-(form.astype(np.bool)),structure1=hit,structure2=miss)                                                                                          
    
    cv2.imwrite('result.png',res*255) 
    

    希望您能在右上角看到一个白点,即发现此图案的位置。

    形态处理的最终效果是我们正在寻找一个与之匹配的形状,其中B 代表黑色,W 代表白色,X 表示“不关心” em>:

    B, B, B, B, B, B, B, B, B, B
    B, B, B, B, B, B, B, B, B, B
    B, B, B, B, B, B, B, B, B, B
    B, B, B, B, B, B, B, B, B, B
    X, X, X, X, X, X, B, B, B, B
    X, X, X, X, X, X, B, B, B, B
    W, W, W, W, X, X, B, B, B, B
    W, W, W, W, X, X, B, B, B, B
    W, W, W, W, X, X, B, B, B, B
    W, W, W, W, X, X, B, B, B, B
    

    然后重复转置形状以在左下角寻找L 形状。

    关键字:Python、skimage、scikit-image、形状检测、形态学、形态学、Hit-or-miss、hit or miss、don't care、hit miss、图像、图像处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-07
      • 2013-03-06
      • 1970-01-01
      • 2012-04-16
      • 2015-03-08
      • 1970-01-01
      相关资源
      最近更新 更多