Python で画像処理をするためのモジュールは Pillow (PIL)です.この Pillow のドキュメントは https://pillow.readthedocs.io/en/stable/ にあります. さらに,numpy と os をインポートします.
モジュールを読み込む (01-readfile.py(抜粋))
from PIL import Image
import numpy as np
import os
モジュールの読み込みができれば,ファイルを開いて numpy の配列に変換して表示してみよう.なお,Windows 環境では,フォルダの区切りが円マーク(またはバックスラッシュ)で,Mac や Linux で '/' になります.この違いを吸収するために os.path.sep.join( )
を利用しています.詳細はここを参照してください.
画像データを読み込み,配列として表示 (01-readfile.py)
from PIL import Image
import numpy as np
import os
filepath = os.path.sep.join(['png', '0-01.png'])
img = Image.open(filepath)
data = np.asarray(img)
print(data)
[[[255 255 255 255] [255 255 255 255] [255 255 255 255] [255 255 255 255] [ 34 24 21 255] [ 34 24 21 255] [ 34 24 21 255] [ 34 24 21 255] [ 34 24 21 255] [ 34 24 21 255] [255 255 255 255] [255 255 255 255] [255 255 255 255] [255 255 255 255] [255 255 255 255]] ...(中略)... [[255 255 255 255] [255 255 255 255] [255 255 255 255] [255 255 255 255] [255 255 255 255] [255 255 255 255] [255 255 255 255] [255 255 255 255] [255 255 255 255] [255 255 255 255] [255 255 255 255] [255 255 255 255] [255 255 255 255] [255 255 255 255] [255 255 255 255]]]
上記の出力はピクセル(画素)ごとの RGBA データです.ここで A は透明度を意味しています.つまり,出力の最初の15行は画像データの1行目の各ピクセルの RGBA 値であり,出力の最後の15行は画像データの最後の1行の RGBA 値です.画像データの最初の1行は5番目のピクセルから10番目のピクセルが RGBA = [34, 24, 21, 255] の色(黒に近い色)で,それ以外のピクセルは RGBA =[255, 255, 255, 255] の白色であることを意味しています.さらに,最後の15行はすべてのピクセルが白です.なお,Python での配列の添字(インデックス)は0番目からスタートすることにも注意しておこう.
画像データを RGBA 形式で読み込むことができたので,データを様々な形式変換してみよう.
まず,RGBA データを RGB に変換します.つまり,透明度の指定を削除する変換です.これには img.convert("RGB")
を実行すると良いでしょう.
画像データをRGBに変換 (01-readfile.py)
from PIL import Image
import numpy as np
import os
filepath = os.path.sep.join(['png', '0-01.png'])
img = Image.open(filepath)
img = img.convert("RGB") ## RGBカラーに変換
data = np.asarray(img)
print(data)
[[[255 255 255] [255 255 255] [255 255 255] [255 255 255] [ 34 24 21] [ 34 24 21] [ 34 24 21] [ 34 24 21] [ 34 24 21] [ 34 24 21] [255 255 255] [255 255 255] [255 255 255] [255 255 255] [255 255 255]] ...(中略)... [[255 255 255] [255 255 255] [255 255 255] [255 255 255] [255 255 255] [255 255 255] [255 255 255] [255 255 255] [255 255 255] [255 255 255] [255 255 255] [255 255 255] [255 255 255] [255 255 255] [255 255 255]]]
次に,CMYK に変換します.これには img.convert("CMYK")
を実行すると良いでしょう.
画像データをCMYKに変換 (01-readfile.py)
from PIL import Image
import numpy as np
import os
filepath = os.path.sep.join(['png', '0-01.png'])
img = Image.open(filepath)
img = img.convert("CMYK") ## CMYKカラーに変換
data = np.asarray(img)
print(data)
[[[ 0 0 0 0] [ 0 0 0 0] [ 0 0 0 0] [ 0 0 0 0] [221 231 234 0] [221 231 234 0] [221 231 234 0] [221 231 234 0] [221 231 234 0] [221 231 234 0] [ 0 0 0 0] [ 0 0 0 0] [ 0 0 0 0] [ 0 0 0 0] [ 0 0 0 0]] ...(中略)... [[ 0 0 0 0] [ 0 0 0 0] [ 0 0 0 0] [ 0 0 0 0] [ 0 0 0 0] [ 0 0 0 0] [ 0 0 0 0] [ 0 0 0 0] [ 0 0 0 0] [ 0 0 0 0] [ 0 0 0 0] [ 0 0 0 0] [ 0 0 0 0] [ 0 0 0 0] [ 0 0 0 0]]]
次に,グレースケールに変換します.これには img.convert("L")
を実行すると良いでしょう.実行結果を確認すると,0が黒,255が白となるようなグレースケールになっていることがわかります.
画像データをグレースケールに変換 (01-readfile.py)
from PIL import Image
import numpy as np
import os
filepath = os.path.sep.join(['png', '0-01.png'])
img = Image.open(filepath)
img = img.convert("L") ## グレースケールに変換
data = np.asarray(img)
print(data)
[[255 255 255 255 26 26 26 26 26 26 255 255 255 255 255] [255 255 255 26 26 26 26 26 26 26 26 255 255 255 255] [255 255 26 26 26 26 255 255 26 26 26 26 255 255 255] [255 255 26 26 26 255 255 255 255 26 26 26 26 255 255] [255 255 26 26 255 255 255 255 255 255 26 26 26 255 255] [255 255 26 26 255 255 255 255 255 255 255 26 26 26 255] [255 255 26 26 255 255 255 255 255 255 255 26 26 26 255] [255 255 26 26 26 255 255 255 255 255 255 255 26 26 255] [255 255 26 26 26 255 255 255 255 255 255 255 26 26 255] [255 255 255 26 26 26 255 255 255 255 255 26 26 26 255] [255 255 255 26 26 26 26 255 255 255 26 26 26 255 255] [255 255 255 255 26 26 26 26 26 26 26 26 26 255 255] [255 255 255 255 255 26 26 26 26 26 26 26 255 255 255] [255 255 255 255 255 255 255 255 255 255 255 255 255 255 255] [255 255 255 255 255 255 255 255 255 255 255 255 255 255 255]]
最後に,白黒データに変換します.これには img.convert("P")
を実行すると良いでしょう.実行結果を確認すると,0が白,1が黒となるような白黒データになっていることがわかります.
画像データを白黒に変換 (01-readfile.py)
from PIL import Image
import numpy as np
import os
filepath = os.path.sep.join(['png', '0-01.png'])
img = Image.open(filepath)
img = img.convert("P") ## 白黒に変換
data = np.asarray(img)
print(data)
[[0 0 0 0 1 1 1 1 1 1 0 0 0 0 0] [0 0 0 1 1 1 1 1 1 1 1 0 0 0 0] [0 0 1 1 1 1 0 0 1 1 1 1 0 0 0] [0 0 1 1 1 0 0 0 0 1 1 1 1 0 0] [0 0 1 1 0 0 0 0 0 0 1 1 1 0 0] [0 0 1 1 0 0 0 0 0 0 0 1 1 1 0] [0 0 1 1 0 0 0 0 0 0 0 1 1 1 0] [0 0 1 1 1 0 0 0 0 0 0 0 1 1 0] [0 0 1 1 1 0 0 0 0 0 0 0 1 1 0] [0 0 0 1 1 1 0 0 0 0 0 1 1 1 0] [0 0 0 1 1 1 1 0 0 0 1 1 1 0 0] [0 0 0 0 1 1 1 1 1 1 1 1 1 0 0] [0 0 0 0 0 1 1 1 1 1 1 1 0 0 0] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]