来自图像的验证码中断或文本读取器:OCR Python

来自图像的验证码中断或文本读取器:OCR Python,python,python-2.7,opencv,ocr,captcha,Python,Python 2.7,Opencv,Ocr,Captcha,我有一个典型的验证码图像,其中只包含数字 前 我想从这张图像中提取78614 我尝试了一些使用OCR Python的库和代码。但它返回0 示例代码-1 from captcha_solver import CaptchaSolver solver = CaptchaSolver('browser') with open('captcha.png', 'rb') as inp: raw_data = inp.read() print(solver.solve_captcha(raw_data))

我有一个典型的验证码图像,其中只包含数字

我想从这张图像中提取78614

我尝试了一些使用OCR Python的库和代码。但它返回0

示例代码-1

from captcha_solver import CaptchaSolver

solver = CaptchaSolver('browser')
with open('captcha.png', 'rb') as inp:
raw_data = inp.read()
print(solver.solve_captcha(raw_data))
示例代码-2

from PIL import Image

def p(img, letter):
    A = img.load()
    B = letter.load()
    mx = 1000000
    max_x = 0
    x = 0
    for x in range(img.size[0] - letter.size[0]):
        _sum = 0
        for i in range(letter.size[0]):
            for j in range(letter.size[1]):
                _sum = _sum + abs(A[x+i, j][0] - B[i, j][0])
        if _sum < mx :
            mx = _sum
            max_x = x
    return mx, max_x


def ocr(im, threshold=200, alphabet="0123456789abcdef"):
    img = Image.open(im)
    img = img.convert("RGB")
    box = (8, 8, 58, 18)
    img = img.crop(box)
    pixdata = img.load()

    letters = Image.open(im)
    ledata = letters.load()

    # Clean the background noise, if color != white, then set to black.
    for y in range(img.size[1]):
        for x in range(img.size[0]):
            if (pixdata[x, y][0] > threshold) \
                    and (pixdata[x, y][1] > threshold) \
                    and (pixdata[x, y][2] > threshold):

                pixdata[x, y] = (255, 255, 255, 255)
            else:
                pixdata[x, y] = (0, 0, 0, 255)

    counter = 0;
    old_x = -1;

    letterlist = []

    for x in range(letters.size[0]):
        black = True
        for y in range(letters.size[1]):
            if ledata[x, y][0] <> 0 :
                black = False
                break
        if black :
            if True :
                box = (old_x + 1, 0, x, 10)
                letter = letters.crop(box)
                t = p(img, letter);
                print counter, x, t
                letterlist.append((t[0], alphabet[counter], t[1]))
            old_x = x
            counter += 1

    box = (old_x + 1, 0, 140, 10)
    letter = letters.crop(box)
    t = p(img, letter)
    letterlist.append((t[0], alphabet[counter], t[1]))

    t = sorted(letterlist)
    t = t[0:5]  # 5-letter captcha

    final = sorted(t, key=lambda e: e[2])
    answer = ""
    for l in final:
        answer = answer + l[1]
    return answer

print(ocr('captcha.png'))
从PIL导入图像
def p(img,字母):
A=img.load()
B=字母。加载()
mx=1000000
max_x=0
x=0
对于范围内的x(图像大小[0]-字母大小[0]):
_总和=0
对于范围内的i(字母大小[0]):
对于范围内的j(字母大小[1]):
_sum=_sum+abs(A[x+i,j][0]-B[i,j][0])
如果_和阈值)\
和(pixdata[x,y][1]>阈值)\
和(pixdata[x,y][2]>阈值):
pixdata[x,y]=(255,255,255,255)
其他:
pixdata[x,y]=(0,0,0,255)
计数器=0;
old_x=-1;
信函列表=[]
对于范围内的x(字母大小[0]):
黑色=真
对于范围内的y(字母大小[1]):
如果ledata[x,y][0]0:
黑色=假
打破
如果为黑色:
如果为真:
框=(旧的x+1,0,x,10)
字母=字母。裁剪(方框)
t=p(img,字母);
打印计数器,x,t
字母表。附加((t[0],字母表[计数器],t[1]))
old_x=x
计数器+=1
框=(旧x+1,0,140,10)
字母=字母。裁剪(方框)
t=p(img,字母)
字母表。附加((t[0],字母表[计数器],t[1]))
t=已排序(字母列表)
t=t[0:5]#5个字母的验证码
final=已排序(t,key=lambda e:e[2])
答案=”“
对于期末考试中的l:
答案=答案+l[1]
回覆
打印(ocr('captcha.png'))

有没有人有机会从这种典型的验证码中获取/提取文本?

你可以使用机器学习(神经网络)模型来解决验证码问题,它几乎总是优于免费OCR或任何其他方法


这里有一个很好的起点:

我来看看。但它看起来与Pyhon 2.7+版本不兼容。是这样吗?你能给我提供一个在Python2.7中实现的公平的想法吗?再次感谢。到2020年,Python2.7将不再受支持。最佳使用3