python字符识别_Python 实现字符识别—Part2

如果你看的比较困惑的话,可以参考

Python 实现字符识别—Part1:关于PIL库的使用

http://www.jianshu.com/p/0a94d8ea2bf3

Python 实现字符识别—Part2:关于图形格式的基础知识和我的一个问题(欢迎大神来指点迷津)

http://www.jianshu.com/p/252ff113d1d0

Python 实现字符识别—Part3:关于完成验证码识别的前置操作,字符的提取和图像的分割

http://www.jianshu.com/p/4ff1559c1cf6

Python 实现字符识别—Part4 : 关于空间向量搜索算法paper的介绍

http://www.jianshu.com/p/b13b3905cc7d

Python 实现字符识别—Part5:关于使用空间向量搜索算法实现字符识别

http://www.jianshu.com/p/1905bf78f0bd

这一部分想写图像的模式,和模式之间的相互转换。

关于PIL创建图片的模式有很多种。PIL创建图片有很多模式,比如下面这个,是P。

#創建pic2

#以一個像素8bit的,大小是Im.size 背景顏色是255 白色

im2=Image.new("P",im.size,255)

但有的时候,也可能是这样

image = Image.new('RGB', (width, height), (255, 255, 255))

问题是这个P 和RGB 指的是什么?

252ff113d1d0

image.png

1、模式“1”

模式“1”为二值图像,非黑即白。但是它每个像素用8个bit表示,0表示黑,255表示白。将lena图像转换为“1”图像。

252ff113d1d0

image.png

>>>from PIL import Image

>>> lena =Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")

>>> lena.mode

'RGB'

>>> lena.getpixel((0,0))

(197, 111, 78)

>>> lena_1 = lena.convert("1")

>>> lena_1.mode

'1'

>>> lena_1.size

(512, 512)

>>>lena_1.getpixel((0,0))

255

>>> lena_1.getpixel((10,10))

255

>>>lena_1.getpixel((10,120))

0

>>>lena_1.getpixel((130,120))

255

2、模式“L”

模式L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。在PIL中,从模式“RGB”转换为“L”模式是按照下面的公式转换的:

L = R * 299/1000 + G * 587/1000+ B * 114/1000

252ff113d1d0

image.png

>>> from PIL importImage

>>> lena = Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")

>>> lena.mode

'RGB'

>>> lena.getpixel((0,0))

(197, 111, 78)

>>> lena_L =lena.convert("L")

>>> lena_L.mode

'L'

>>> lena_L.size

(512, 512)

>>>lena.getpixel((0,0))

(197, 111, 78)

>>>lena_L.getpixel((0,0))

132

3、模式“P”

模式“P”为8位彩色图像,它的每个像素用8个bit表示,其对应的彩色值是按照调色板查询出来的。下面我们使用默认的调色板将lena图像转换为“P”图像。

252ff113d1d0

image.png

>>> from PIL importImage

>>> lena = Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")

>>> lena.mode

'RGB'

>>> lena.getpixel((0,0))

(197, 111, 78)

>>> lena_P =lena.convert("P")

>>> lena_P.mode

'P'

>>>lena_P.getpixel((0,0))

62

除了这个,其他的还有PIL还有其他的模式,RGB,RGBA,CMYK,YCbCr,I,F。总共九种模式。

概括一下,就是这样:

252ff113d1d0

捕获.JPG

使用PIL库,可以很方便的创建一个任意模式下的图片。

from PIL import Image

#创建一个rgb模式的图片,大小是200*200,颜色是(100,100,150)

im_RGB=Image.new("RGB",(200,200),(100,100,150))

im_RGB.show()

print im_RGB.mode

from PIL import Image

#创建一个P模式的图片,背景颜色是212

im_P=Image.new("P",(im.size),212)

im_P.show()

print im_P.mode

#打印出来分布的直方图

print im_P.histogram()

#模式之间的转换

im=Image.open('captcha.gif')

#(将图片转换为8位像素模式)

im.convert("P")

这里我遇到了一个问题

就是RGB模式向P模式的转换,这个问题现在还没有解决。关于p模式,p模式是8bit一个像素的彩色图。用8bit实现彩色图的是基于调色板的原理。

现在做一个测试,打开一张RGB模式的jpg图片,然后将它转换位P模式的图片,记为im。

如果这个时候,print 转换后的图片的每一个像素,结果居然是一个8bit3的数据结构。!!!*(这个我不知道是为什么)。print出来的结果是如下图这样的。

252ff113d1d0

image.png

然后,我创建一个p模式的图片im_p,把im的每一个像素都出来,保存到im_P。伪代码如下:

#test1

pix=im.getpixel((x,y))

#这样就报错了,原因还是,解释器认为pix是一个 类似与(255,255,255)的list,而不是一个0~255之内的数字

im_P.putpixel((x,y),pix)

----分割线------

#test2 于是我尝试第二种写法

pix=im.getpixel((x,y))

#print pix

xx=pix[0]

yy=pix[1]

zz=pix[2]

# print xx,yy,zz

#但是下面这一句依然报错,理由和上面一样

im_P.putpixel((x,y),(xx,yy,zz))

----分割线------

#test3 于是我尝试第三种写法

pix=im.getpixel((x,y))

#print pix

xx=pix[0]

yy=pix[1]

zz=pix[2]

# print xx,yy,zz

#终于不报错了,但是这样其实相当于丢失了 G,B的分量

im_P.putpixel((x,y),(xx))

所以,概括一下这个问题,就是创建一个p模式的图片,每个像素是8bit的彩色图。但是如果将一个rgb模式的图片,转换为p模式,每个像素就是8bit*3。

我现在怀疑,这个问题,可能有两点原因:

convert函数 转换的机制问题

p模式的调色板的机制

欢迎大神施以援手,求救。

下面是源码,分析大神来分析

#coding:utf-8

from PIL import Image

im=Image.open('1111.jpg')

print im.mode

im.convert("P")

im.show()

#print im.histogram()

#print im.size[0],im.size[1]

im_P=Image.new("P",(im.size),220)

im_P.show()

print im_P.mode

for x in range(im.size[0]):

for y in range(im.size[1]):

pix=im.getpixel((x,y))

#print pix

xx=pix[0]

yy=pix[1]

zz=pix[2]

# print xx,yy,zz

im_P.putpixel((x,y),xx)

im_P.show()


版权声明:本文为weixin_35049095原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。