0-5 「Python カラー値R/G/Bの入れ替え」
PILで取得した画像データをNumpy配列へ代入し、R,G,B各色を入れ替える実験をしました。
#!/usr/bin/python # -*- coding: utf-8 -*- # カラー画像のR,G,B色情報を入れ替える。 from PIL import Image import numpy as np from matplotlib import pylab as plt # 画像の読み込み im = np.array(Image.open('input2x3.bmp')) print(im) # imの中身 # [[[255 0 0] # [ 0 255 0] # [ 0 0 255]] # # [[ 0 0 0] # [128 128 128] # [255 255 255]]] # 画像の表示 plt.imshow(im) plt.show() # 色の入れ替え #青を緑、赤を青、緑を赤の色情報へ入れ替える im_swap = im.copy() im_swap[:,:,1] = im_swap[:,:,2] # Blue -> Green im_swap[:,:,2] = im_swap[:,:,0] # Red -> Blue im_swap[:,:,0] = im[:,:,1] # Green -> Red print(im_swap) # imの中身 #[[[ 0 0 255] # [255 0 0] # [ 0 255 0]] # # [[ 0 0 0] # [128 128 128] # [255 255 255]]] # # 画像の表示 plt.imshow(im_swap) plt.show() #保存 Image.fromarray(im_swap).save('imswap_save.bmp')
実行結果
分かりやすくするために色情報を変換する前後で並べてみました。
記載されている数値は(Red, Blue, Green)の色情報です。
各ピクセル座標について、色情報を変換する前後の色値を左上のピクセルから記述すると、次のようになります。
(色変換前)Red=255, Green= 0, Blue=0 -> (色変換後)Red= 0, Green= 0, Blue=255
(色変換前)Red= 0, Green=255, Blue=0 -> (色変換後)Red=255, Green= 0, Blue= 0
(色変換前)Red= 0, Green= 0, Blue=255 -> (色変換後)Red= 0, Green=255, Blue= 0
(色変換前)Red= 0, Green= 0, Blue=0 -> (色変換後)Red= 0, Green= 0, Blue= 0
(色変換前)Red=128, Green=128, Blue=128 -> (色変換後)Red=128, Green=128, Blue=128
(色変換前)Red=255, Green=255, Blue=255 -> (色変換後)Red=255, Green=255, Blue=255
赤→青、緑→赤、青→緑へと入れ替えられていることが確認できます。
白色、灰色、黒色は、それぞれRGBの色が同じ割合で構成されているので、色情報の変換前後で色合いは変化しません。
色の入れ替えについてプログラムの処理内容を確認します。
># 色の入れ替え
>im_swap = im.copy()
>im_swap[:,:,1] = im_swap[:,:,2] # Blue -> GReen
>im_swap[:,:,2] = im_swap[:,:,0] # Red -> Blue
>im_swap[:,:,0] = im[:,:,1] # Green -> Red
im.copy()で画像配列を、im_swapへコピーしています。
配列の複数要素にはスライスを用いてアクセスしています。
スライスとは、例えば
im_swap[:, :, 1]
と指定すると、以下のすべての配列を表す指定方法で、: 記号を用います。
im_swap[0, 0, 1]
im_swap[0, 1, 1]
im_swap[0, 2, 1]
im_swap[1, 0, 1]
im_swap[1, 1, 1]
im_swap[1, 2, 1]
プログラム上の im_swap[:,:,1] = im_swap[:,:,2] は、読み込んだ画像のすべてのピクセルについて、青色の情報を緑色に入れる処理を行っているということになります。
参考に、それぞれの配列をスライスを使用して表示すると以下のようになります。