【问题标题】:Using dilation in only one direction?仅在一个方向上使用膨胀?
【发布时间】:2020-03-21 19:44:27
【问题描述】:

这是我在 Stack Overflow 上的第一篇文章,如果问题没有得到足够的定义,我很抱歉。

我目前正在从图像中提取表格数据,我需要一种仅在垂直方向上扩展文本的方法,以便获得清晰的列表示,用于进一步分割。

去除水平和垂直线并按位变换图像后,我处于这个阶段:

这个问题的理想目标是:

是否有对我的情况有帮助的方法或算法?

【问题讨论】:

  • 使用cv2.dilate时,可以设置自定义kernel。在此处使用3 x 1(行x 列)白色矩形,并将iterations 设置为足够大。
  • 也许你可以通过宽度为 1 的垂直内核进行扩张。我不知道它是否有效,但我认为应该只在垂直方向上扩张。
  • 谢谢,我会试试的。
  • 你也可以设置一个合理高度的内核并且只执行一次迭代(见下面我的回答)。

标签: python opencv computer-vision image-morphology dilation


【解决方案1】:

您似乎不想要扩张,而是想要最大投影。对于每一列,检查是否设置了任何像素。为此使用numpy.any

result = np.any(image, axis=0)

【讨论】:

  • 这比使用卷积方法要高效得多。可能会在末尾添加.reshape(image.shape) 以获取 2D 图像,具体取决于用例。
  • @Rob np.tile 更适合将投影转换回二维图像。可能需要或不需要,取决于后续操作。隐式广播可能会让它变得不必要。
  • 你是对的,我的错。应该是np.tile(np.any(image, axis=0), (image.shape[0], 1))。我同意通常不需要它。
【解决方案2】:

您可以使用适当的结构元素调用cv2.dilate

import cv2

pre_img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
h, w = pre_img.shape

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, ksize=(1, 2 * h))

dilated = cv2.dilate(pre_img, kernel)

cv2.imshow('input', pre_img)
cv2.imshow('output', dilated)
cv2.waitKey(0)

输入

输出

为了更好地可视化正在发生的事情:

blended = (pre_img.astype(float) + dilated.astype(float)) / 2
cv2.imshow('blended', blended.astype(np.uint8))
cv2.waitKey(0)

混合

【讨论】:

    猜你喜欢
    • 2019-07-06
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多