python—PIL庫影像處理

  • 2019 年 10 月 8 日
  • 筆記

這裡主要說的是PIL, PIL(Python Image Library)是python的第三方影像處理庫,但是由於其強大的功能與眾多的使用人數,幾乎已經被認為是python官方影像處理庫了。其官方主頁為:PIL。 PIL歷史悠久,原來是只支援python2.x的版本的,後來出現了移植到python3的庫pillow

所以直接給你電腦安裝pillow就可以使用了

pip install pillow

首先先獲取圖片,然後對圖片修改尺寸。

圖片原圖:

程式碼:

from PIL import Image  image = Image.open('lufei.png')  image = image.resize((150, 200), Image.ANTIALIAS)  print(type(image))

將圖片轉換為灰度值影像用convert函數:

程式碼:

from PIL import Image  image = Image.open('lufei.png')  m = image.convert('L')  m.show()

效果:

將圖片保存則用save函數:

m.save('lefei.png')

如果想將灰度值還原為rgb的格式,只需要底下在寫一條句子,將L換成RGB

將灰度值反相,可以得到一種不一樣的效果,將灰度值轉為矩陣,再用255-去矩陣的數值,接著用fromarray函數還原成Image的格式。

from PIL import Image  import numpy as np  image = Image.open('lufei.png')  im = image.convert('L')  m = np.array(im)  m = 255-m  img =Image.fromarray(m)  img.show()

將圖片的顏色通道分離用split函數:

from PIL import Image  image = Image.open('lufei.png')  image.show()  r,g,b = image.split()  r.show()  g.show()  b.show()

將圖片的顏色通道合併用merge函數:

from PIL import Image  image = Image.open('lufei.png')    r,g,b = image.split()  im_merge = Image.merge("RGB",[b,g,r])  im_merge.show()

不同的rgb排列方式會得到不同的顏色效果

對圖片的像素操作,強化像素的效果:

左邊為像素值*1.5,中間原圖,右邊*2.5的效果比較

point()函數:

from PIL import Image  image = Image.open('lufei.png')  im_point = image.point(lambda x:x*2.5)  im_point.show()

小應用:

利用python做一個影像轉字元串,並保存到文本之中。

首先導入PIL庫和numpy庫

讀取圖片,並將圖片重新調整大小,接著轉換為矩陣,轉換為矩陣的時候,

矩陣是一個(x,y,z)的數據,x和y是他的長和寬,然後z是他的rgb數值,0就是r,1就是g,2就是b。

然後定義一個數值轉換為字元的字元表備用

接著做一個轉換函數,按一定比例,將一定的rgb數據轉為特定字元,接著再利用之前獲取到的矩陣的長度和寬度,獲取矩陣的像素的rgb數據,傳給轉換函數C,再將獲得到的字元串寫入文本文件即可

from PIL import Image  import numpy as np  image = Image.open('lufei.png')  image = image.resize((150, 200), Image.ANTIALIAS)  img = np.array(image)  x = np.shape(img)  W = x[0]  H = x[1]  C_char = list(" 0")  def C(r,g,b):      leng = len(C_char)      g = int(0.2126 * r + 0.7152 * g + 0.0722 * b)      u = (256.0+1)/leng      return C_char[int(g/u)]  t = ''  for i in range(W):      for j in range(H):          r = img[i][j][0]          g = img[i][j][1]          b = img[i][j][2]          t+=C(r,g,b)          t+='  '      t+='n'  txt = open('w.txt','w')  txt.write(t)