您的位置:首页 > 编程语言 > Python开发

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

2012-12-12 13:03 323 查看
简单的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目录里的特征图片像这样的:


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: