我是怎样利用python PIL将图片数字读出来的?

一、需求来源

因为在编写爬虫程序时,经常会遇到,电话号码使用图片格式显示。程序无法直接拿到其中的电话号码。

二、解决思路

1、拿到该网站从0-9的数字的图片,并将每个图片转换成相应的向量。

2、需要使用python读取图片。160609_7ErF_3280685.png

3、将读取出来的图片分割开来。160656_lyJd_3280685.png160659_N65V_3280685.png160704_xlqp_3280685.png160713_Is4d_3280685.png160717_4cGK_3280685.png160720_h5Be_3280685.png160723_cd1R_3280685.png160727_Xw7C_3280685.png160730_VTVA_3280685.png160733_r3vF_3280685.png160736_138p_3280685.png

4、将分割出来的数字图片和已经转换成向量的的图片相比较。如果相等就返回该数值。

三、用到的模块

1、urllib2

2、Image

3、cStringIO

4、os

四、上代码

# -*- coding:utf-8 -*-
import os
from PIL import Image
import cStringIO
import urllib2

class Number2vector(object):
	def __init__(self):
        #在构造函数时就拿到{'数字':'向量'}的字典。
		numdict = self.get_numberdict()
		file_path = "phoneimage/phone3.png"
	
	# 这里是将之前已经转换为向量的数字拿到一个字典里面,方便之后的比对。
	def get_numberdict(self):
		numdict = dict()
		path = "numbertxt"
		file_list = os.listdir(path)
		for filex in file_list:
			filex = path + '/' + filex
			f = open(filex)
			c = f.read()
			key = filex.split('/')[1].split('.')[0].replace('m', '')
			numdict[key] = c
		return numdict

        #将图片转换为用0和1表示的字符串
	def image2text(self, im):
		width = im.size[0]
		height = im.size[1]
		
		tmstr = ""
		for i in range(0,width):
			for j in range(0,height):
				cl=im.getpixel((i,j))
				if(cl==0):
					#黑色
					tmstr = tmstr + "1"
				else:
					tmstr = tmstr + "0"
			tmstr = tmstr + "\n"
		return tmstr
        # 用来比较向量是否相等。如果相等则返回该数字
	def get_number(self, im):
		text = self.image2text(im)
		numdict = self.get_numberdict()
		keys = list()
		vals = list()
		for k, v in numdict.items():
			keys.append(k)
			vals.append(v)
			
		if text in vals:
			i = vals.index(text)
			return keys[i]
		else:
			return None


	def splitimage(self,file_path):
		region_list = list()
                # 判断该文件是本地文件还是web文件。
		if "http://" in file_path or "https://" in file_path:
			image = cStringIO.StringIO(urllib2.urlopen(file_path).read())
			im = Image.open(image)
		else:
			im = Image.open(file_path)
		width = im.size[0]
		i = 0
		while i < width - 9:
			box = (i, 0, i+9, 25)
			region = im.crop(box)
			i += 9
			region_list.append(region)
		return region_list

	def getimagefromweb(file_path):
		file = cStringIO.StringIO(urllib2.urlopen(file_path).read())

	def do_main(self, file_path = "phoneimage/phone3.png"):
		region_list = self.splitimage(file_path)
		strx = ""
		for r in region_list:
			tmpnum = self.get_number(r)
			if tmpnum != None:
				strx = strx + tmpnum
		return strx

file_path = "这里填写你的图片路径"
n = Number2vector()
print n.do_main(file_path)

五、备注

在之前准备工作中,我为了拿到准确的{"数字":"向量"}的键值对。需要多次进行比较。并且要拿到该网站中从0-9所有的数字。

转载于:https://my.oschina.net/u/3280685/blog/888516

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值