使用python PIL获取图像中显示的数字

使用python PIL获取图像中显示的数字,python,python-imaging-library,Python,Python Imaging Library,我想使用python和PIL获取此图像中的数字: 我的代码: #/usr/bin/env python #编码=utf-8 导入图像、图像增强、图像过滤器 导入数据 调试=错误 def d_打印(*msg): 全局调试 如果调试: 对于msg中的i: 印刷品(i), 打印 其他: 通过 def Get_Num(l=[]): min1=[] min2=[] 印刷品(l) 对于数据中的n.n: count1=count2=count3=count4=0 如果(len(l)!=len(n)): 打印

我想使用python和PIL获取此图像中的数字:

我的代码:

#/usr/bin/env python
#编码=utf-8
导入图像、图像增强、图像过滤器
导入数据
调试=错误
def d_打印(*msg):
全局调试
如果调试:
对于msg中的i:
印刷品(i),
打印
其他:
通过
def Get_Num(l=[]):
min1=[]
min2=[]
印刷品(l)
对于数据中的n.n:
count1=count2=count3=count4=0
如果(len(l)!=len(n)):
打印(“错误图片%s%s”%(长(l)、长(n)))
退出()
对于范围内的i(len(l)):
如果(l[i]==1):
count1+=1
如果(n[i]==1):
count2+=1
对于范围内的i(len(l)):
如果(n[i]==1):
count3+=1
如果(l[i]==1):
count4+=1
d_打印(计数1、计数2、计数3、计数4)
min1.append(count1-count2)
min2.append(count3-count4)
d_打印(最小1,“\n”,最小2)
对于范围(10)内的i:

如果(min1[i]PIL不是您想要使用的工具,您要做的是执行图像识别,这是一项典型的[而且相当复杂的]人工智能任务

用于执行此类操作的规范自由库是,您可以找到python绑定文档


顺便说一句:captcha使用这种图像的原因正是因为教机器如何识别这些数字非常困难……这是一种专门设计用于区分人类和机器人的图像形式……

到目前为止你有什么?我可能会添加一个使用OpenCV的链接。
#!/usr/bin/env python
#encoding=utf-8

import Image,ImageEnhance,ImageFilter
import Data

DEBUG = False

def d_print(*msg):
    global DEBUG
    if DEBUG:
        for i in msg:
            print(i),
        print
    else:
        pass


def Get_Num(l=[]):
    min1 = []
    min2 = []
    print(l)
    for n in Data.N:
        count1=count2=count3=count4=0
        if (len(l) != len(n)):
            print("Wrong pic %s %s " %(len(l),len(n)))
            exit()
        for i in range(len(l)):
            if (l[i] == 1):
                count1+=1
                if (n[i] == 1):
                    count2+=1
        for i in range(len(l)):
            if (n[i] == 1):
                count3+=1
                if (l[i] == 1):
                    count4+=1
        d_print(count1,count2,count3,count4)

        min1.append(count1-count2)
        min2.append(count3-count4)
    d_print(min1,"\n",min2)
    for i in range(10):
        if (min1[i] <= 2 or min2[i] <= 2):
            if ((abs(min1[i] - min2[i])) < 10):
                return i
    for i in range(10):
        if (min1[i] <= 4 or min2[i] <= 4):
            if (abs(min1[i] - min2[i]) <= 2):
                return i

    for i in range(10):
        flag = False
        if (min1[i] <= 3 or min2[i] <= 3):
            for j in range(10):
                if (j != i and (min1[j] < 5 or min2[j] <5)):
                    flag = True
                else:
                    pass
            if (not flag):
                return i
    for i in range(10):
        if (min1[i] <= 5 or min2[i] <= 5):
            if (abs(min1[i] - min2[i]) <= 10):
                return i
    for i in range(10):
        if (min1[i] <= 10 or min2[i] <= 10):
            if (abs(min1[i] - min2[i]) <= 3):
                return i

#end of function Get_Num

def Pic_Reg(image_name=None):
    im = Image.open(image_name)
    im = im.filter(ImageFilter.MedianFilter())
    enhancer = ImageEnhance.Contrast(im)
    im = enhancer.enhance(5)
    im = im.convert('1')
    im.show()
                    #all by pixel
    s = 6          #start postion of first number
    w = 8          #width of each number
    h = 15          #end postion from top
    t = 2           #start postion of top
    im_new = []
    #split four numbers in the picture
    for i in range(4):
        im1 = im.crop((s+w*i+i*2,t,s+w*(i+1)+i*2,h))
        im_new.append(im1.resize((int(10),int(13)), Image.ANTIALIAS))

    s = ""
    for k in range(4):
        l = []
        im_new[k].show()
        for i in range(13):
            for j in range(10):
                if (im_new[k].getpixel((j,i)) == 255):
                    l.append(0)
                else:
                    l.append(1)
        s+=str(Get_Num(l))
    return s
if __name__ == "__main__":
    print(Pic_Reg("3.jpeg"))