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

时间:2015-03-31 03:19:14

标签: python computer-vision ocr

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

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

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

3 个答案:

答案 0 :(得分:5)

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

  1. 执行傅立叶变换:
  2. 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

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

    现在,我已手动为此行创建了蒙版,但理想情况下,您可以通过programmatucally过滤掉它 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

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

答案 1 :(得分:1)

好吧,这可能有点复杂,因为笔记本行的颜色非常接近数字的颜色,就像你的例子所示。我认为,绿色框是你添加的,而不是数据本身的一部分。

您没有说明您使用的是哪个框架,因此我将仅提供一些如何解决此问题的一般提示。

第一步是一些阈值处理。您可以使用二进制阈值或更好的一些自适应阈值与正确大小的窗口。你将不得不对此进行试验。阈值的结果将是二值图像。仍然有线。

第二步将使用形态学操作来清除图像。如果您不确定形态是什么,请查看此morphology tutorial

大约一半时间,有一些从图像中删除线条的例子。最大的问题是,有些数字还包含水平线。因此,一种选择是使用相当小的形态内核(可能是3行和1列),因为笔记本电脑线更薄。并更新识别器,以识别扭曲的数字。这应该是可行的,因为所有的数字都会以相同的方式分散。

答案 2 :(得分:0)

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

  1. 对图像进行偏斜校正(可以在opencv中使用Hough变换找到偏斜)
  2. 在行总和中定位峰
  3. 物理克隆线条上方和下方的像素

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

Sample result