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")
実行結果: