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

本文介绍了一种通过Python解决网页图片电话号码抓取的方法。首先,获取0-9数字的图片并转为向量,然后读取图片、分割并比较向量,找到匹配的数字。主要涉及urllib2、Image、cStringIO和os模块。通过比较图片向量,实现对电话号码图片的识别。
摘要由CSDN通过智能技术生成

一、需求来源

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

二、解决思路

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

2、需要使用python读取图片。

160609_7ErF_3280685.png

3、将读取出来的图片分割开来。

160656_lyJd_3280685.png

160659_N65V_3280685.png

160704_xlqp_3280685.png

160713_Is4d_3280685.png

160717_4cGK_3280685.png

160720_h5Be_3280685.png

160723_cd1R_3280685.png

160727_Xw7C_3280685.png

160730_VTVA_3280685.png

160733_r3vF_3280685.png

160736_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所有的数字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值