Python / PIL / 画像を明るくしたり暗くしたりする

PIL.Imageは画像の読み込み、生成、エクスポートに使うだけにして、あとはnumpyだけで処理する。

from PIL import Image

import matplotlib.pyplot as plt
import numpy             as np

class IMAGE:
    def __init__(self, imgPath):
        self.srcImg = Image.open(imgPath)
        self.__initialize()
        
    def __initialize(self):
        self.srcArr        = np.asarray(self.srcImg)
        self.size          = self.srcArr.shape
        self.width         = self.size[1]
        self.height        = self.size[0]
        self.numOfPixels   = self.width * self.height
        self.AllRGB        = self.srcArr.reshape(self.numOfPixels, 3)
        self.AllBrightness = np.mean(self.AllRGB, axis=1, dtype="uint16")
        
    def showImg(self):
        plt.imshow(self.srcImg)
        plt.show()
        return self
        
    def showHist(self):
        plt.figure()
        plt.xlabel("val")
        plt.ylabel("freq")
        plt.hist(self.AllBrightness, range=(-0.5, 255.5), bins=256)
        plt.show()
        return self
    
    def changeBrightness(self, shift):
        rgb = self.AllRGB.astype(np.int16) + shift
        rgb = np.clip(rgb, 0, 255)
        rgb = rgb.astype(np.uint8)
        rgb = rgb.reshape(self.height, self.width, 3)
        
        self.srcImg = Image.fromarray(rgb) # 新しいImageオブジェクトを生成して元のImageオブジェクトに上書きする。
        self.__initialize()
        return self    
        
    def export(self, filepath):
        self.srcImg.save(filepath)
        return self
    
########
# test #
########
if __name__ == "__main__":
    img = IMAGE("H:\\img\\fujiko.png") # 画像を読み込んで、
    img.showImg()
    img.showHist()

    img.changeBrightness(-150)           # 暗くしてみるが、
    img.showImg()                      # 単にただrgb値をずらしているだけなので元々暗かった部分は黒く潰れてしまう。
    img.showHist()
    
    img = IMAGE("H:\\img\\fujiko.png") # 今度はもう一度元の画像を読み込んで、
    img.changeBrightness(200)            # 明るくしてみるが、
    img.showImg()                      # 単にただrgb値をずらしているだけなので元々明るかった部分は白く飛んでしまう。
    img.showHist()
    
    img.export("H:\\img\\sute.png")

実行結果:
f:id:ti-nspire:20180804162626p:plain:h350 f:id:ti-nspire:20180804162700p:plain:h350 f:id:ti-nspire:20180804162721p:plain:h350