![](/img/trans.png)
[英]Removing background noisy lines from Captcha Image using PYTHON PIL
[英]Remove noisy lines from an image
我的图像带有一些随机线条,如下所示:
我想对它们进行一些预处理,以去除不需要的噪音(扭曲书写的线条),以便我可以将它们与 OCR(Tesseract)一起使用。
我想到的想法是使用扩张来消除噪音,然后在第二步中使用侵蚀来修复写作的缺失部分。
为此,我使用了以下代码:
import cv2
import numpy as np
img = cv2.imread('linee.png', cv2.IMREAD_GRAYSCALE)
kernel = np.ones((5, 5), np.uint8)
img = cv2.dilate(img, kernel, iterations=1)
img = cv2.erode(img, kernel, iterations=1)
cv2.imwrite('delatedtest.png', img)
不幸的是,扩张效果不佳,噪声线仍然存在。
我尝试更改内核形状,但情况变得更糟:文字被部分或完全删除。
我还找到了一个答案,说可以通过以下方式删除这些行
将具有两个或更少相邻黑色像素的所有黑色像素变为白色。
这对我来说似乎有点复杂,因为我是计算机视觉和 opencv 的初学者。
任何帮助将不胜感激,谢谢。
像这样的检测线就是路径开口的发明目的。 DIPlib有一个实现(披露:我在那里实现了它)。 作为替代方案,您可以尝试使用我上面链接的论文 作者的实现。 该实现没有我在下面使用的“约束”模式。
这是一个关于如何使用它的快速演示:
import diplib as dip
import matplotlib.pyplot as pp
img = 1 - pp.imread('/home/cris/tmp/DWRTF.png')
lines = dip.PathOpening(img, length=300, mode={'constrained'})
在这里,我们首先反转图像,因为这使以后的其他事情更容易。 如果不反转,请改用路径闭合。 lines
图:
接下来我们减去线条。 一个小区域的开口去除了被路径开口过滤掉的线的几个孤立像素:
text = img - lines
text = dip.AreaOpening(text, filterSize=5)
但是,我们现在在文本中出现了空白。 填写这些并非易事。 这是一个快速而肮脏的尝试,您可以将其用作起点:
lines = lines > 0.5
text = text > 0.5
lines -= dip.BinaryPropagation(text, lines, connectivity=-1, iterations=3)
img[lines] = 0
您可以使用来自 opencv 的函数createLineSegmentDetector()
来做到这一点
import cv2
#Read gray image
img = cv2.imread("lines.png",0)
#Create default parametrization LSD
lsd = cv2.createLineSegmentDetector(0)
#Detect lines in the image
lines = lsd.detect(img)[0] #Position 0 of the returned tuple are the detected lines
#Draw the detected lines
drawn_img = lsd.drawSegments(img,lines)
#Save the image with the detected lines
cv2.imwrite('lsdsaved.png', drawn_img)
for element in lines:
#If the length of the line is more than 50, then draw a white line on it
if (abs(int(element[0][0]) - int(element[0][2])) > 50 or abs(int(element[0][1]) - int(element[0][3])) > 50):
#Draw the white line
cv2.line(img, (int(element[0][0]), int(element[0][1])), (int(element[0][2]), int(element[0][3])), (255, 255, 255), 12)
#Save the final image
cv2.imwrite('removedzz.png', img)
好吧,它不能与当前图像完美配合,但它可能会为不同的图像提供更好的结果。 您可以调整要删除的线的长度和要绘制的白线的粗细,以代替已删除的线。
我希望它有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.