我需要在一张方格纸上移除下图中数字的线条,而不会使我的数字出现任何失真。如果没有这个,我的数字检测算法就会失败,因为在感兴趣的区域中存在纸张的划线伪影。
没有任何人为因素的文件的更清晰版本
最佳答案
傅立叶域变换的经典任务。
- 执行傅里叶变换:
将 numpy 导入为 np
从 scipy.misc 导入 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))
角度 = np.angle(np.fft.fftshift(imfft))
视觉= np.log(杂志)
visual2 = (visual - visual.min())/(visual.max() - visual.min())*255
visual2 将如下所示:
注意穿过中心的对角线 - 它代表您的线。
现在,我已经为这条线手动创建了掩码,但理想情况下您可以通过编程将其过滤掉
然后我们读取掩码并画出线条:
mask = imread("fftimg4_mask.jpg")[:,:,:3]
掩码 = (np.mean(掩码,-1) > 20)
视觉[掩码] = np.mean(视觉)
然后反转 fft:
newmagsshift = np.exp(视觉)
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
当然,您可以在傅里叶空间中进行更精确的修补,也可以将结果应用回原始图像以保持颜色,但我认为这篇文章说明了这个想法。
关于python - 从图像中删除线条用于数字检测 python 的笔记本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29360025/