加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

使用PYTHON PIL从Captcha Image中删除背景噪声线

发布时间:2020-12-20 13:33:22 所属栏目:Python 来源:网络整理
导读:我有一个处理过的验证码图像(放大)看起来像: 如您所见,“TEXT”的字体大小比Noisy Lines的宽度略大. 所以我需要一个算法或代码来从这个图像中删除嘈杂的线条. 在Python PIL库和下面提到的斩波算法的帮助下,我得不到OCR可以轻松读取的输出图像. 这是我尝试过
我有一个处理过的验证码图像(放大)看起来像:

如您所见,“TEXT”的字体大小比Noisy Lines的宽度略大.
所以我需要一个算法或代码来从这个图像中删除嘈杂的线条.

在Python PIL库和下面提到的斩波算法的帮助下,我得不到OCR可以轻松读取的输出图像.

这是我尝试过的Python代码:

import PIL.Image
import sys

# python chop.py [chop-factor] [in-file] [out-file]

chop = int(sys.argv[1])
image = PIL.Image.open(sys.argv[2]).convert('1')
width,height = image.size
data = image.load()

# Iterate through the rows.
for y in range(height):
    for x in range(width):

        # Make sure we're on a dark pixel.
        if data[x,y] > 128:
            continue

        # Keep a total of non-white contiguous pixels.
        total = 0

        # Check a sequence ranging from x to image.width.
        for c in range(x,width):

            # If the pixel is dark,add it to the total.
            if data[c,y] < 128:
                total += 1

            # If the pixel is light,stop the sequence.
            else:
                break

        # If the total is less than the chop,replace everything with white.
        if total <= chop:
            for c in range(total):
                data[x + c,y] = 255

        # Skip this sequence we just altered.
        x += total


# Iterate through the columns.
for x in range(width):
    for y in range(height):

        # Make sure we're on a dark pixel.
        if data[x,y] > 128:
            continue

        # Keep a total of non-white contiguous pixels.
        total = 0

        # Check a sequence ranging from y to image.height.
        for c in range(y,height):
            # If the pixel is dark,add it to the total.
            if data[x,c] < 128:
                total += 1

            # If the pixel is light,replace everything with white.
        if total <= chop:
            for c in range(total):
                data[x,y + c] = 255

        # Skip this sequence we just altered.
        y += total

image.save(sys.argv[3])

因此,基本上我想知道一个更好的算法/代码来摆脱噪音,从而能够使图像可以被OCR(Tesseract或pytesser)读取.

解决方法

要快速摆脱大多数线条,您可以将两个或更少相邻黑色像素的所有黑色像素变为白色.这应该可以修复杂散线.然后,当你有很多“块”时,你可以删除较小的块.

这是假设样本图像已被放大,并且线仅为一个像素宽.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读