zoukankan      html  css  js  c++  java
  • 简单的python (orc)图片识别(识别京东价格图片)

    简单的python (orc)图片识别(识别京东价格图片) - fc_lamp的日志 - 网易博客

    简单的python (orc)图片识别(识别京东价格图片)   

    2012-12-11 23:27:51|  分类: Web技术-Python |  标签:  |字号 订阅

    网上有很多关于python orc 图片识别技术的文章,我这里只是简单的一个例事。原理就是用创建的图像特征库去作对比(方法很笨)。
    其它的我就不多说了,不过在开始前你可能先得看一下这两篇文章:
    http://fc-lamp.blog.163.com/blog/static/174566687201282424018946/
    http://fc-lamp.blog.163.com/blog/static/1745666872011626510810/

    好了,下面的例子是简单的识别京东(360buy)的价格图片。注意的是:由于只是简单的处理,所以小数部分我是没有去做处理的,还有一点是可能部分图片不能正常的识别出来(有时间再修整吧,全当工作备忘录)。
    我直接贴上代码:

    #coding:utf-8

    '''

    @author:fc_lamp

    @blog:fc-lamp.blog.163.com

    '''

    import urllib2

    import Image as image

    import socket

    socket.setdefaulttimeout(60)

    class Price360buy():
    '''
    分析出360图片价格
    '''
    def __init__(self):
    self.flags_array = {}
    self.frist_w = 14
    self.last_w = 31
    self.pixel_f = 246
    self.crop_h =20
    self.pic_pr = ['png','jpeg','jpg']

    def FlagToImg(self,path):
    '''
    创建特征库(一点点对比图片)
    '''
    j=0
    #下载所有包含0-9的图片,然后在本地处理
    for img in os.listdir(path):
    if img.split('.')[-1] not in self.pic_pr:
    continue
    im = image.open('%s%s'%(path,img))
    o_w,o_h = im.size
    #只留数字(从x:14,y:0开始切,切到xx,yy)
    #截去Y与小数部分
    frist_w = self.frist_w
    last_w = self.last_w
    box = (frist_w,0,o_w-last_w,self.crop_h)
    gray_img = im.crop(box)
    #gray_img.show()
    #new_img = path+'test_'+img.split('\/')[-1]
    #gray_img.save(new_img)
    gray_img = gray_img.convert('1')
    #gray_img.show()
    #exit()

    #分割出每个数字
    width,height = gray_img.size
    w=0
    while w<width:
    column = []
    for h in range(height):
    column.append(gray_img.getpixel((w,h)))

    #print column
    if sum(column) / height < self.pixel_f:
    box = (w,0,w+9,self.crop_h)
    region = gray_img.crop(box)
    region.save('%s%s.png'%(path,str(w)+'_'+str(j)))
    w+=10
    else:
    w=w+1
    j+=1


    def FlagTotxt(self,path):
    '''
    将所有特征0-9图片保存为文本
    '''
    for img in os.listdir(path):
    if img.split('.')[-1] not in self.pic_pr:
    continue
    im = image.open('%s%s'%(path,img))
    pre = img.split('.')[0]
    width,height = im.size
    h =0
    f_path = '%s%s.txt'%(path,pre)
    with open(f_path,'a') as ff:
    while h<height:
    col =''
    for w in xrange(width):
    piexl = im.getpixel((w,h))
    if piexl < self.pixel_f:
    col+='0'
    else:
    col+='1'
    ff.write('%s\n'%(col))
    h+=1

    def FlagToArray(self,path):
    '''
    将所有特征0-9图片写入内存
    '''
    for img in os.listdir(path):
    if img.split('.')[-1] not in self.pic_pr:
    continue
    im = image.open('%s%s'%(path,img))
    pre = int(img.split('.')[0])
    self.flags_array[pre] = []
    width,height = im.size
    h =0
    while h<height:
    col = []
    for w in xrange(width):
    piexl = im.getpixel((w,h))
    if piexl < self.pixel_f:
    col.append(0)
    else:
    col.append(1)

    self.flags_array[pre].append(col)
    h+=1

    def parse(self,img_url):
    '''
    分析对比图片
    '''
    try:
    im = urllib2.urlopen(img_url).read()
    im =image.open(StringIO.StringIO(im))
    #im =image.open(img_url)
    except Exception as e:
    return str(e)

    o_w,o_h = im.size
    #截去Y与小数部分
    frist_w = self.frist_w
    last_w = self.last_w
    box = (frist_w,0,o_w-last_w,self.crop_h)
    gray_img = im.crop(box)
    gray_img = gray_img.convert('1')
    #gray_img.show()
    #exit()

    #分割出每个数字
    width,height = gray_img.size
    w=0
    return_num = ''
    while w<width:
    column = []
    for h in range(height):
    column.append(gray_img.getpixel((w,h)))

    #print column
    if sum(column) / height < self.pixel_f:
    box = (w,0,w+9,self.crop_h)
    number_img = gray_img.crop(box)
    #number_img.show()
    #number_img.save('%s%s.png'%(os.getcwd(),'/'+str(w)))
    #exit()
    #分析每一个数字
    num_w,num_h = number_img.size
    n_h =0
    num_array = []
    while n_h < num_h:
    #获取每个数字的像素行
    num_col = []
    for n_w in xrange(num_w):
    piexl = number_img.getpixel((n_w,n_h))
    if piexl < self.pixel_f:
    num_col.append(0)
    else:
    num_col.append(1)
    num_array.append(num_col)
    n_h+=1
    #print num_array
    #exit()
    #特证对比,返回数字
    return_num += str(self._get_num(num_array))
    w+=10
    else:
    w=w+1

    return return_num


    def _get_num(self,pixels):
    '''
    特征对比找出数字
    '''
    #分别去对比每一个特证数字
    for num in xrange(10):
    pixels_orc = self.flags_array[num]
    p_l = len(pixels)
    if p_l != len(pixels_orc):
    return '?'
    #获取一行像素点
    yes =0
    for i in xrange(p_l):
    if pixels[i]==pixels_orc[i]:
    yes+=1
    #print p_l
    #print yes
    if yes >= p_l-1:
    return num

    return '?'


    if __name__=='__main__':
    price_url = 'http://jprice.360buyimg.com/price/gp740746-1-1-3.png'
    s = Price360buy()
    #先下载包含0-9的数字的价格
    #生成特征图像 (os.getcwd()当前工作目录)
    #s.FlagToImg('%s%s'%(os.getcwd(),'/orc_lib/'))
    #生成可视化的文本
    #print s.FlagTotxt('%s%s'%(os.getcwd(),'/orc_lib/'))
    #写入内存
    s.FlagToArray('%s%s'%(os.getcwd(),'/orc_lib/'))
    #print s.flags_array[0]
    #分析图片,获取出数字
    #price_url = os.getcwd()+'/109.png'
    print s.parse(price_url)

    #输出 598

    orc_lib目录里的特征图片像这样的:
    简单的python (orc)图片识别(识别京东价格图片) - fc_lamp - @fc_lamp
  • 相关阅读:
    centos7系统最小系统安装并配置网络
    解决 JAAVA springboot 数据存储到数据库数据显示??的方案
    vue scoped
    Vue插件
    Git命令学习
    深度拷贝
    ES6学习_简化对象写法
    ES6学习_字符串的拼接
    ES6学习_变量的解构赋值
    ES6学习_const关键字
  • 原文地址:https://www.cnblogs.com/lexus/p/2814455.html
Copyright © 2011-2022 走看看