代码之家  ›  专栏  ›  技术社区  ›  Dev Roy

从图像中删除行用于数字检测的笔记本python

  •  4
  • Dev Roy  · 技术社区  · 10 年前

    我需要从一张方格纸上的数字图像中删除线条,而不会导致我的数字失真。如果没有这一点,我的数字检测算法将失败,因为在感兴趣的区域中存在纸张的划线伪影。

    https://www.dropbox.com/s/mjtnldwme4qqc4v/Issue_file.jpeg?dl=0 "Issue Image"

    文件的干净版本,没有任何瑕疵 Cleaner version of file

    3 回复  |  直到 10 年前
        1
  •  5
  •   vzaguskin    10 年前

    傅里叶域变换的经典任务。

    1. 执行傅里叶变换:

    import numpy as np from scipy.misc import imshow, imsave, imread img = imread("10XIn.jpg")[:,:,:3] imggray = np.mean(img, -1) imfft = np.fft.fft2(imggray) mags = np.abs(np.fft.fftshift(imfft)) angles = np.angle(np.fft.fftshift(imfft)) visual = np.log(mags) visual2 = (visual - visual.min()) / (visual.max() - visual.min())*255

    visual2将如下所示: enter image description here

    注意穿过中心的对角线-它代表你的线条。

    现在,我已经手动创建了这行的掩码,但理想情况下,您可以通过编程过滤掉它 enter image description here

    然后我们读了面具,画出了线条: mask = imread("fftimg4_mask.jpg")[:,:,:3] mask = (np.mean(mask,-1) > 20) visual[mask] = np.mean(visual)

    然后反转fft: newmagsshift = np.exp(visual) newffts = newmagsshift * np.exp(1j*angles) newfft = np.fft.ifftshift(newffts) imrev = np.fft.ifft2(newfft) newim2 = 255 - np.abs(imrev).astype(np.uint8) imsave("fftimg2.jpg", newim2 )

    这是newim2 enter image description here

    当然,您可以在傅里叶空间中进行更精确的修补,也可以将结果应用回原始图像以保持颜色,但我认为这篇文章说明了这一想法。

        2
  •  1
  •   jnovacho bmargulies    10 年前

    好吧,这可能有点复杂,因为笔记本线条的颜色与数字的颜色非常接近,正如您的示例所示。我认为,绿色框是您添加的,而不是数据本身的一部分。

    您没有说明您使用的是哪个框架,所以我只提供一些一般性的提示来解决这个问题。

    第一步是设置阈值。您可以使用二进制阈值,也可以使用大小正确的窗口的自适应阈值。你必须对此进行实验。阈值保持的结果将是二进制图像。还有台词。

    第二步是使用形态学操作来清除图像。如果你不确定什么是形态学,看看这个 morphology tutorial .

    大约进行到一半,有一些从图像中删除线条的示例。最大的问题是,有些数字还包含水平线。因此,一种选择是使用相当小的形态学内核(可能是3行1列),因为笔记本的线条更细。并更新识别器,以识别甚至扭曲的数字。这应该是可行的,因为所有的数字都将以相同的方式失真。

        3
  •  0
  •   qu1j0t3    6 年前

    另一种方法是利用已知的结构。

    1. 对图像进行去斜处理(可以在opencv中使用霍夫变换来发现扭曲)
    2. 定位行和中的峰值
    3. 物理克隆线上和线下的像素

    我刚刚为另一个数据集实现了这一点,示例如下。这可以进一步调整。

    Sample result