ga('set', 'anonymizeIp', 1);
Categories: CodingPython

[python] 圖像處理 使用PIL Module(Pillow)實作圖片濾鏡

Share

python圖像處理中,常被使用的有cv2, PIL等套件,本文介紹如何使用PIL module實作圖片濾鏡,實作的濾鏡包括彩色轉灰階、圖片高亮、柔焦效果、減少色調(ex:RED)、反相圖片等算法。

本站相關文章:[Python] PIL基本介紹

1. Install PIL module (Pillow)

使用pip安裝python PIL模組。
pip3 install Pillow

2. Import module

from PIL import Image

3. Python code

以下透過PIL取得圖片pixel的RGB數值,並藉調整pixel RGB實做幾種濾鏡。

  • 彩色轉灰階
  • 高亮
  • 柔焦
  • 減少色調
  • 反相

取圖片每個pixel的RGB值

# Read image
im = Image.open("targetImage.png")
# Get the width and height of the image
im_width, im_height = im.size
# Load image pixels as array(im_width, im_height)
pixels = im.load()
# Traverse the image pixels
for i in range(im_width):
    for j in range(im_height):
        # Get pixel RGB information
        r, g, b = pixels[i, j]
        print(r, g, b)
# Close image file
im.close()

Implement Image Filters

以下介紹個濾鏡的實作算法。
其中有用到math套件,記得需先import math。

import math

– 彩色轉灰階

彩色轉灰階最原本的公式為:
Gray = R x 0.299 + G x 0.587 + B x 0.114

若調整為整數處理:
這個方式是32位整數乘除方式(RGB的精度是8位)。
Gray = (R x 299 + G x 587 + B x 114 + 500) / 1000
加上500是為了四捨五入。

最後是16位整數乘除運算方式:
Gray = (R x 30 + G x 59 + B x 11 + 50) / 100

def RGBtoGRAY(im):
    im_width, im_height = im.size
    pixels = im.load()
    for i in range(im_width):
        for j in range(im_height):
            r, g, b = pixels[i, j]
            gray = math.floor((r*30 + g*59 + b*11 + 50)/100)
            pixels[i,j] = (gray, gray, gray)
    im.save("gray.png", "PNG")

– 高亮

將原圖RGB分別加上45,提高亮度。

def softlightFilter(im):
    im_width, im_height = im.size
    pixels = im.load()
    for i in range(im_width):
        for j in range(im_height):
            r, g, b = pixels[i, j]
            r = 250 if r+30>250 else r+45
            g = 250 if g+30>250 else g+45
            b = 250 if b+30>250 else b+45
            pixels[i,j] = (r, g, b)
    im.save("softlightFilter.png", "PNG")

– 柔焦

這邊簡單對每個將每個pixel的RGB值改為周圍9×9 matrix的平均值,存為新的pixel matrix後輸出。
此演算法沒有特別處理邊緣pixel,如有要求的話要特別對邊緣值做處理。

第一種code直觀取3×3 matrix值平均。程式碼較長。

def blur(im):
    im_width, im_height = im.size
    pixels = im.load()
    pixels_new = im.load()
    for i in range(im_width):
        for j in range(im_height):
            if(i>0 and j>0 and i 

第二種直接操作pixel tuple。較簡短。

def blur(im):
    im_width, im_height = im.size
    pixels = im.load()
    pixels_new = im.load()
    for i in range(im_width):
        for j in range(im_height):
            if(i>0 and j>0 and i 

- 減少色調

此範例演示減少紅色(R)後的圖。

def rmRED(im):
    im_width, im_height = im.size
    pixels = im.load()
    for i in range(im_width):
        for j in range(im_height):
            r, g, b = pixels[i, j]
            r = 0 if (g 250 else g+45
            b = 250 if b+30>250 else b+45
            pixels[i,j] = (r, g, b)
    im.save("removeRED.png", "PNG")

- 反相

用255扣掉原RGB值,取得新的RGB值即為反相圖。

def inverted(im):
    im_width, im_height = im.size
    pixels = im.load()
    for i in range(im_width):
        for j in range(im_height):
            r, g, b = pixels[i, j]
            r = 255-r
            g = 255-g
            b = 255-b
            pixels[i,j] = (r, g, b)
    im.save("inverted.png", "PNG")

4. DEMO

原圖

原圖 灰階 高亮
柔焦 減少色調(減少紅) 反相

後續將實作更多濾鏡。

Jys

Published by
Jys

Recent Posts

[python] Flask Create RESTful API

This article gi... Read More

3 年 前發表

[Javascript] 新增/刪除JSON中key值

在web訊息交換常會需要對JS... Read More

3 年 前發表

[JAVA] SQL Server Connection

本文介紹JAVA連線SQL s... Read More

3 年 前發表