文档章节

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

爬虫张小呆
 爬虫张小呆
发布于 2017/04/27 16:20
字数 565
阅读 210
收藏 0

一、需求来源

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

二、解决思路

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

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

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

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

© 著作权归作者所有

爬虫张小呆
粉丝 1
博文 21
码字总数 13945
作品 0
私信 提问
加载中

评论(2)

爬虫张小呆
爬虫张小呆
您好,“phone3.png”的图片就在博客中,因为源文件在我一次大意的操作中给删掉了,T.T所以暂时无法提供numbertxt下的文件,不过您可以尝试使用文中的方法splitimage,把“phone3.png”分割成一个一个的数字图片,然后再使用image2text方法转换成相对应的txt文件,就可以了。
h
hitchc
您好,numbertxt下面的文件和phone3.png能提供一下吗?
使用python PIL库实现简单验证码的去噪

首先要感谢一下字符型图片验证码识别完整过程及Python实现的博主,我的大部分知识点都是从他那里学来的。 想要识别验证码,收集足够多的样本后,首先要做的就是对验证码原始图片进行处理,对...

u012067766
2018/04/20
0
0
Python 中读取和保存图像方法汇总及其区别

方法一:利用PIL中的Image函数,这个函数读取出来不是array格式 这时候需要用 np.asarray(im) 或者 np.array()函数 区别是 np.array() 是深拷贝,np.asarray() 是浅拷贝 关于深拷贝和浅拷贝...

xjtuhit
2018/07/17
0
0
mysql学习笔记(二)--- MySQL数据类型

【正文】 上一章节中,我们学习了MySQL软件的安装,既然软件都装好了,现在就正式开始MySQL的基础知识的学习吧,即使是零基础,也要一步一个脚印。恩,首先要学习的就是MySQL的数据类型。 一...

舞艺超炫
2017/02/27
0
0
jquery获取后天传过来的多张图片

我们的系统有一个要求就是通过手机端从远程上传图片到服务器上,在网页端要读取最新上传的一组图片,但是在数据库中没有存放图片的地址,我是从服务器直接通过输入输出流读出来的,但是怎么使...

zhaonimamade
2013/12/13
371
2
Android中的File文件存储及读取file中的Bitmap

今年看了下android的文件存储,大致和java实现差不多 android提供了如下两个方法来打开本应用程序的数据文件的IO流: FileInputStream openFileInput(fileName); //输入流 FileOutputStream...

爱吃橙子的小石头
2014/12/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

使用kubeadm 搭建K8s集群

1. 参考官网 https://kubernetes.io/docs/setup/independent/install-kubeadm/

whhbb
39分钟前
2
0
Dubbo 3.0 !提升不止一点点!

Dubbo 自 2011 年 10 月 27 日开源后,已被许多非阿里系的公司使用,其中既有当当网、网易考拉等互联网公司,也不乏中国人寿、青岛海尔等大型传统企业。 自去年 12 月开始,Dubbo 3.0 便已正...

编程SHA
40分钟前
2
0
提升不止一点点,Dubbo 3.0 预览版详细解读

Dubbo 自 2011 年 10 月 27 日开源后,已被许多非阿里系的公司使用,其中既有当当网、网易考拉等互联网公司,也不乏中国人寿、青岛海尔等大型传统企业。更多用户信息,可以访问Dubbo @GitHub...

阿里云云栖社区
43分钟前
32
0
HanLP Analysis for Elasticsearch

基于 HanLP 的 Elasticsearch 中文分词插件,核心功能: 兼容 ES 5.x-7.x; 内置词典,无需额外配置即可使用; 支持用户自定义词典; 支持远程词典热更新(待开发); 内置多种分词模式,适合...

左手的倒影
今天
1
0
spark部署之yarn模式

spark部署之yarn模式 hadoop-3.0.0集群搭建 配置相应环境 java环境 scala(可配可不配) hadoop环境 从官网下载spark 解压 配置 /conf/spark-env.sh export JAVA_HOME=/usr/java/jdk1.8.0_4...

jackmanwu
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部