如果你看的比較困惑的話摧玫,可以參考
Python 實(shí)現(xiàn)字符識別—Part1:關(guān)于PIL庫的使用
http://www.reibang.com/p/0a94d8ea2bf3
Python 實(shí)現(xiàn)字符識別—Part2:關(guān)于圖形格式的基礎(chǔ)知識和我的一個(gè)問題(歡迎大神來指點(diǎn)迷津)
http://www.reibang.com/p/252ff113d1d0
Python 實(shí)現(xiàn)字符識別—Part3:關(guān)于完成驗(yàn)證碼識別的前置操作光涂,字符的提取和圖像的分割
http://www.reibang.com/p/4ff1559c1cf6
Python 實(shí)現(xiàn)字符識別—Part4 : 關(guān)于空間向量搜索算法paper的介紹
http://www.reibang.com/p/b13b3905cc7d
Python 實(shí)現(xiàn)字符識別—Part5:關(guān)于使用空間向量搜索算法實(shí)現(xiàn)字符識別
http://www.reibang.com/p/1905bf78f0bd
這一部分想寫圖像的模式,和模式之間的相互轉(zhuǎn)換赂蕴。
關(guān)于PIL創(chuàng)建圖片的模式有很多種宝磨。PIL創(chuàng)建圖片有很多模式缘眶,比如下面這個(gè),是P束莫。
#創(chuàng)建pic2
#以一個(gè)像素8bit的懒棉,大小是Im.size 背景顏色是255 白色
im2=Image.new("P",im.size,255)
但有的時(shí)候,也可能是這樣
image = Image.new('RGB', (width, height), (255, 255, 255))
問題是這個(gè)P 和RGB 指的是什么览绿?
1策严、模式“1”
模式“1”為二值圖像,非黑即白饿敲。但是它每個(gè)像素用8個(gè)bit表示享钞,0表示黑,255表示白诀蓉。將lena圖像轉(zhuǎn)換為“1”圖像栗竖。
>>>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”為灰色圖像渠啤,它的每個(gè)像素用8個(gè)bit表示狐肢,0表示黑,255表示白沥曹,其他數(shù)字表示不同的灰度份名。在PIL中,從模式“RGB”轉(zhuǎn)換為“L”模式是按照下面的公式轉(zhuǎn)換的:
L = R * 299/1000 + G * 587/1000+ B * 114/1000
>>> 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位彩色圖像僵腺,它的每個(gè)像素用8個(gè)bit表示,其對應(yīng)的彩色值是按照調(diào)色板查詢出來的壶栋。下面我們使用默認(rèn)的調(diào)色板將lena圖像轉(zhuǎn)換為“P”圖像辰如。
>>> 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
除了這個(gè),其他的還有PIL還有其他的模式贵试,RGB琉兜,RGBA,CMYK毙玻,YCbCr豌蟋,I,F(xiàn)桑滩∥嗥#總共九種模式。
概括一下,就是這樣:
使用PIL庫幌氮,可以很方便的創(chuàng)建一個(gè)任意模式下的圖片缭受。
from PIL import Image
#創(chuàng)建一個(gè)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
#創(chuàng)建一個(gè)P模式的圖片慢洋,背景顏色是212
im_P=Image.new("P",(im.size),212)
im_P.show()
print im_P.mode
#打印出來分布的直方圖
print im_P.histogram()
#模式之間的轉(zhuǎn)換
im=Image.open('captcha.gif')
#(將圖片轉(zhuǎn)換為8位像素模式)
im.convert("P")
<br />
這里我遇到了一個(gè)問題
就是RGB模式向P模式的轉(zhuǎn)換,這個(gè)問題現(xiàn)在還沒有解決陆盘。關(guān)于p模式普筹,p模式是8bit一個(gè)像素的彩色圖。用8bit實(shí)現(xiàn)彩色圖的是基于調(diào)色板的原理隘马。
現(xiàn)在做一個(gè)測試太防,打開一張RGB模式的jpg圖片,然后將它轉(zhuǎn)換位P模式的圖片,記為im酸员。
如果這個(gè)時(shí)候蜒车,print 轉(zhuǎn)換后的圖片的每一個(gè)像素,結(jié)果居然是一個(gè)8bit3的數(shù)據(jù)結(jié)構(gòu)幔嗦。D鹄ⅰ!邀泉!*(這個(gè)我不知道是為什么)嬉挡。print出來的結(jié)果是如下圖這樣的。
然后汇恤,我創(chuàng)建一個(gè)p模式的圖片im_p庞钢,把im的每一個(gè)像素都出來,保存到im_P因谎。偽代碼如下:
#test1
pix=im.getpixel((x,y))
#這樣就報(bào)錯(cuò)了基括,原因還是,解釋器認(rèn)為pix是一個(gè) 類似與(255财岔,255阱穗,255)的list,而不是一個(gè)0~255之內(nèi)的數(shù)字
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
#但是下面這一句依然報(bào)錯(cuò)使鹅,理由和上面一樣
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
#終于不報(bào)錯(cuò)了揪阶,但是這樣其實(shí)相當(dāng)于丟失了 G,B的分量
im_P.putpixel((x,y),(xx))
所以,概括一下這個(gè)問題患朱,就是創(chuàng)建一個(gè)p模式的圖片鲁僚,每個(gè)像素是8bit的彩色圖。但是如果將一個(gè)rgb模式的圖片,轉(zhuǎn)換為p模式冰沙,每個(gè)像素就是8bit*3侨艾。
我現(xiàn)在懷疑,這個(gè)問題拓挥,可能有兩點(diǎn)原因:
- convert函數(shù) 轉(zhuǎn)換的機(jī)制問題
- p模式的調(diào)色板的機(jī)制
歡迎大神施以援手唠梨,求救。
下面是源碼侥啤,分析大神來分析
#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()