[Python]透過PIL改變圖片的pixel

Posted by John on 2018-02-28
Words 523 and Reading Time 2 Minutes
Viewed Times

這次練習的是透過Python讀取一張彩色的圖片,將圖片每個pixel的RGB減半,最後會是圖片亮度變暗的效果。 PIL(Python Imaging Library),是一款提供給Python的影像處理套件,使用前必須先透過pip安裝相關的套件。 windows如果要在cmd使用pip的話需要設定環境變數:

  1. 先安裝pip(Python3.4以上的版本已經幫你裝好了),安裝方式可以參考這篇網址:在windows下安裝pip
  2. 設定環境變數:對我的電腦點右鍵->內容->進階系統設定->環境變數->使用者變數
  3. 在Path那邊新增pip.exe所在的資料夾(Ex:我的是在D:\Python\Scripts),找不到Path則自己新增一個

安裝PIL:

  1. 如果pip不是最新版要先更新,在cmd下輸入python -m pip install --upgrade pip更新pip
  2. 輸入pip install pillow

影像處理小科普:

圖片就像是一個二維的矩陣,RGB分別代表一個二維的矩陣,也就是說,一張256*256的彩色圖片則會有三層的256*256矩陣。

我用了兩種方式完成這次的練習:

  1. 透過getpixel / putpixel API來直接些改圖片的RGB值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ### (1)透過getpixel / putpixel API來直接些改圖片的RGB值
    from PIL import Image
    img = Image.open("123.jpg")
    print (img.format,img.size,img.mode)
    img.show()
    print(img.size[0],img.size[1])
    for x in range(img.size[0]):
    for y in range(img.size[1]):
    r,g,b = img.getpixel((x,y))
    img.putpixel((x,y),( int(r/2),int(g/2),int(b/2) ))
    img.save("temp.jpg")
    img.show()
  2. 透過load()將圖片載入到記憶體

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
### (2)透過load()將圖片載入到記憶體
### load()會將圖片載入到記憶體,並回傳一個Pixel Access Object
### 透過載入圖片到內存,使得操作比起putpixel / getpixel 來的快很多
from PIL import Image

img = Image.open("123.jpg")
img.show()
pixel = img.load()
for x in range(img.size[0]):
for y in range(img.size[1]):
r,g,b = pixel[x,y]
#print(r,g,b)
pixel[x,y] = (int(r/2),int(g/2),int(b/2))
#print(pixel[x,y])
img.save("temp2.jpg")
img.show()

最後呈現的結果會像這樣:



>