🙂

【Python】NumPy配列(画像データなど)の色を反転させる方法

2024/10/05に公開

はじめに

PythonのNumPyは、数値計算を高速に行うための強力なライブラリです。

画像処理においても広く利用されており、NumPy配列で画像データを表現できます。

今回は、NumPy配列で表された画像データの色を反転させる方法について解説します。

色を反転(Invert)

画像データをNumPy配列で扱う場合、各画素は0から255までの数値で表されます。

この数値は、その画素の色を表しており、一般的に0が黒、255が白に対応します。

色を反転させるには、各画素の値を255からその値を引くことで、白と黒を反転させることができます。

import numpy as np

# サンプル画像データを作成
img = np.random.randint(0, 256, size=(3, 3, 3))

# 色を反転
result = 255 - img

# 結果を表示(matplotlibなどを使用)
import matplotlib.pyplot as plt
plt.imshow(img)
plt.title('Original Image')
plt.show()

plt.imshow(result)
plt.title('Inverted Image')
plt.show()

▼ 出力

▼ コード解説

1. NumPyのインポート:

import numpy as np でNumPyをインポートします。

2. サンプル画像データの作成:

img = np.random.randint(0, 256, size=(3, 3, 3)) で、0から255までのランダムな値を持つ、3x3ピクセルの3チャンネル画像データを作成します。

3. 色の反転:

result = 255 - img で、各画素の値を255から引いて、反転後の画像データをresultに格納します。

こんなシンプルな記述で、全ピクセルの色を反転できる理由は、NumPyのブロードキャスト機能を使用しているからです。

ブロードキャストとは?

NumPyでは、同じ形状の配列同士の四則演算が要素ごとに自動的に行われます。

異なる形状の配列同士の演算でも、ある条件を満たせば、自動的に形状が調整されて要素ごとの演算が行われます。

この機能をブロードキャストといいます。

スカラー値のブロードキャスト

今回のコードにおけるブロードキャストとして、imgは3次元配列で、各要素は0から255までの整数値です。

255はスカラー値(単一の値)ですが、NumPyではスカラー値も0次元配列として扱われます。

imgと255の減算を行う際、255がimgと同じ形状に拡張され、各要素に対して255が引かれることになります。

NumPyのブロードキャスト機能のおかげで、個々のピクセルに対してループ処理などを書く必要がありません。

255 - imgという簡潔な式で、全ピクセルの色を反転させることができます。

より具体的には、まず、スカラー値の255は、(1, 1, 1)の「0次元配列」とみなされます。

255のような単一の値は、本質的には次元を持たない値ですが、NumPyでは、計算の都合上、スカラー値を0次元の配列として扱うことがあります。

ブロードキャストの際には、この0次元のスカラー値が、他の配列の形状に合わせるために、あたかも(1, 1, 1)のような形状を持つ配列として扱われます。

(1, 1, 1)は、あくまでスカラー値が、他の3次元配列と演算を行う際に、仮想的にもつ形状を表しています。

3つの要素がありますが、各要素が1つしかないため、本質的には「0次元」と同じです。

1次元におもえますが、0次元です。

なぜなら、(1, 1, 1)はある特定の点、つまり原点を表していると考えることができるからです。

原点を特定するために、必要な座標は存在しないので、0次元です。

逆に1次元は、直線のように、ある方向に無限に伸びる空間です。

上記コード例

以下の経緯をたどり、ブロードキャストによって255は、imgと同じ(3, 3, 3)の形状に拡張されます。

・まず、255の次元数が3に増やされ、(1, 1, 1)になります。
・次に、各次元について、imgの対応する次元の大きさに合わせて要素が繰り返されます。
・結果として、255は[[[255, 255, 255], [255, 255, 255], [255, 255, 255]]]という3次元配列になります。

ブロードキャストのルール

異なる形状の配列同士の演算を行う際、以下のルールに従って、より大きな形状に合わせられます。

・次元数の合わせ方:

次元数が少ない配列の左側に1が追加されます。

・要素数の合わせ方:

次元の大きさが1の軸については、その次元を持つもう一方の配列の大きさに合わせて要素が繰り返されます。

4. 結果の表示:

matplotlib.pyplot を使って、元の画像と反転後の画像を表示します。

▼ ポイント

  • チャンネル:

画像データのチャンネルは、色空間を表します。RGBの場合は3チャンネル、グレースケールの場合は1チャンネルになります。

  • データ型:

NumPy配列のデータ型は、uint8など、0から255までの値を表現できる型が一般的です。

  • 他の反転方法:

255から引く代わりに、最大値から現在の値を引くことで、任意の範囲の値を持つ配列に対しても反転処理を行うことができます。

まとめ

NumPyを用いることで、画像データの色を簡単に反転させることができます。

この処理は、画像の前処理や可視化など、様々な画像処理の基礎となる技術です。

今回の例では、シンプルな画像の反転処理を紹介しましたが、NumPyはより複雑な画像処理も可能にします。

この解説が、NumPyを用いた画像処理の理解の一助となれば幸いです。

Discussion