プログラミング

Pythonで画像処理 画像配列とRGBを理解しよう!

投稿日:

Pythonで画像処理を扱う上で、理解しておかなければならない要素のRGBを理解することを目的に学習してみました。

 

<この記事はこんな人におすすめ>

・RGBの操作方法がわからない

・画像処理を始めたばかり

・OpenCVを使い始めた人

 

今回は、画像処理でよく扱われるライブラリのOpenCVを使って、画像を加工する方法を紹介したいと思います。

目標は、RGBを理解し画像の色加工ができるようになることです。

具体的には、画像の数値配列の構造を知ることで、画素の指定・色変更の方法を紹介します。

 

 

スポンサーリンク

 

 

 

■使用するライブラリ

今回使用するライブラリ、モジュールは以下の通りです。

ライブラリ・モジュール名 説明 インストールコマンド(コンソール上で入力する) 
OpenCV 画像処理を行う pip install opencv-python
Numpy 行列計算を高速に行う pip install numpy
matplotlib.pyplot 画像を表示する pip install matplotlib

 

OpenCVのライブラリをインストールすれば、Numpyのパッケージも同時にインストールされるようです。

 

 

 

■RGBの解説

画像をコードで操作する前に、そもそもの色の三原色RGBについて確認しておきましょう。

 

画像の色は、RGBそれぞれが0~255の数値を持つことで決まります。

RGBが全て0の場合は黒、逆に全て255(MAX)の場合は白となります。

 

例えば、赤色の部分はR:255 G:0 B:0でRの成分だけしか持っていません。

黄色の部分は赤色と緑色の成分がマックスの状態でR:255 G:255 B:0で表されます。

 

プログラミングでは、色をRGBの3つの数値を使って表現するわけです。RGBの値を調節することで、すべての色を表現できます。

 

 

まとめると、以下のようになります。

RGBについてのまとめ

・0~255の数値を持つ

・RGB値全て0で黒、RGB値全て255(MAX)で白

 

 

 

■画像配列の理解

RGBについて学んだところで、実際の画像はどのような配列になっているのか確認していきましょう。

 

まずは、画像の読み込み&コンソール上へ画像配列をそのまま出力してみます。

なお、OpenCVは、画像の色をBGRの順に読み込むため、元の順番RGBと比べてRとBの位置が入れ替わってしまいます。

そのためOpenCVを使って画像を配列として扱う際は、色の順番をRGBの順に変換しておきましょう。

以下のコードで実装できます。

 

出力すると、画像の配列は、以下のような形になっていることがわかりました。

3つの数値の配列がいくつも並んでいます。

勘がいい人はもうわかっていると思いますが、この3つの数値がRGBの値です。(色配置の変換を行ったので、RGBの順番になっています。)

 

しかし、これだけでは画像のどの部分のRGBを表しているのか見当がつかないので、画像配列の形を調べてみました。

Numpyには、配列の形状を表示するメソッドがあるので、今回はそちらを使います。

以下のようなコードで配列の形状が調べられます。

 

出力は以下のようになりました。

3つの数字が表示されていますね。

 

結論から言いますと、(画像の高さ(縦の画素数), 画像の幅(横の画素数), RGB)の順にそれぞれのサイズが出力されています。

つまり、今回読み込んだ画像は高さ2592画素、幅3456画素、RGBの3つで表現される色ということがわかります。

matplotlibで表示された画像を確認してみると、高さ幅ともに正しいことがわかりますね。

 

以上のことから、画像配列は[高さ, 幅, 色]の順に指定すれば、各画素を操作することができることがわかったかと思います。

例えば、先ほどのコードに以下を書き加えると、高さ=0, 幅=0のRGBの値を出力できます。

※「:」は全ての意味です。この場合はRGB3つを選択しています。

 

出力は以下の配列です。

先に出力した画像配列の一番上の数字[[[156 198 184] [159 201 187] [161 203 193] …と一致していることが確認できますね。

 

以上のことをまとめてみたので、参考までにどうぞ。

 

 

■RGBの操作方法

最後にRGBを操作して、RGBそれぞれの単色成分のみの画像を生成してみましょう。

 

例としてR単色の画像をつくる方法を解説します。

画像の全画素においてR以外の色成分、つまりGとBの成分を0にしてしまえば、R成分のみの画像が生成できます。

 

このとき便利なのが、「:(コロン)」です。配列の指定時に利用することで、範囲指定が可能となります。

記述式 説明 例array=[0,1,2,3,4,5,6]
: 全ての要素を指定 a[:]=[0,1,2,3,4,5,6]
3: 3番目から最後までの要素を指定 a[3:]=[3,4,5,6]
:3 3番目より手前の要素を指定 a[:3]=[0,1,2]

(これ以外にもいろいろあるので、詳しくは配列の記述を調べてみてください。)

 

コロンを使って、全画素を選択するにはimg_array[:,:, 3色の順番(0or1or2)]で記述できそうですね。

 

以下のコードをplt.imshowの上にコピペしてみてください。

配列としてR単色に処理する際は、以下のコードで問題ないです。

 

OpenCVを使って画像として出力する際は、色配列の順番がBGRになるため、以下のように記述します。

 

結果はご覧の通り、赤色のみの画像が出力されました。

 

img[:,:,(0,2)]=0とすると緑、img[:,:,(1,2)]=0とすると青単色の画像が生成できます。

次いでに画素の指定も行えば、こんな風に加工できます。

 

 

 

 

 

これで、画素のRGBを自在に操れるようになりました。

配列の知識をさらに付ければ、自分の思ったように色を加工することができるようになりますよ!

 

 

 

■まとめ

記事内の内容を簡潔にまとめました。

RGBのまとめ

・0~255の数値を持つ

・RGB値全て0で黒、RGB値全て255(MAX)で白

 

画像配列のまとめ

・[高さ(縦の画素数), 幅(横の画素数), 色]

 色の順番 R:0 G:1 B:2

・調べたい配列.shapeで型がわかる

 

画像配列の理解ができたので、これからは、画像のRGBの加工なども簡単に実装することができるようになりました。

画像認識とは趣向が違いますが、どこかで役に立てたいと思います。

 

 

最後まで読んでいただきありがとうございました。

 

スポンサーリンク

OpenCVとPythonによる機械学習プログラミング

OpenCVとPythonによる機械学習プログラミング

Michael Beyeler
3,938円(11/13 11:12時点)
発売日: 2018/08/29
Amazonの情報を掲載しています

当サイト(your-3d.com)の管理人のゆあーさんと申します。

このサイトでは、私がZBrushやunityなどで調べたことをわかりやすく共有出来たらいいなと思い開設しました。

読んでくださった皆様のお役に立てたら幸いです。

 

Twitter:

@yoursun3d

 

Booth(3Dモデル販売してます!):

https://your-3d.booth.pm/

 

Amazonほしいものリスト:

https://www.amazon.jp/hz/wishlist/ls/YIXXWB7FVXHG?ref_=wl_share