「openCVでカラー画像の編集を行いたいんだけど、やり方がまったくわからない。」
この記事では、こんな悩みを解決します。
私自身、openCVで画像処理の勉強を始めたころ、画像とはどのような情報の集合体で、それがどのようにコンピューター上で表現されているのか、ということがよく理解できず苦労しました。
今ではある程度理解することができるようになりましたが、昔の私のように理解できず苦しんでいる人は多いはず。
ということで、この記事では、openCVにおけるカラー画像の配列概念を詳細に説明していきます。
それでは早速やっていきます!
画像配列の概念説明
まず始めに、カラー画像とはどのような情報の集合体であるのかを説明します。
カラー画像では、上の図に示すように、【画像の縦方向の画素位置】、【横方向の画素位置】、【それぞれの画素位置における色の三要素(青、緑、赤)の度合い】という大きく分けて3つの軸から成り立っています。
※この色度合というのは、0から255までの数値で現れており、数値が大きいほどその色の度合いが強いことを意味しています。
また、色というのは、青、緑、赤という三つの要素を度合を変えてブレンドしてあげることでほとんどの色は表現することが可能です。
例えば、青50%と赤50%を混ぜたら紫になるという感じです。
まずはこれらのざっくりとした概念を覚えておきましょう。
画像配列処理の基礎知識
次にこれらの情報を操作する練習をしていきましょう。
※ここではpythonでopenCVを扱うことを想定して説明します。
python-openCVで画像の配列を表現する際は、
[ * , * , * ]という形で表現されます。
ここでそれぞれの * は画像の縦方向の位置、画像の横方向の位置、何色の面か、ということを表現しています。
基本的には、この*の部分を指定し、数値を与えてあげることで、ある場所の赤の度合いがこれくらい、青の度合いはこれくらい、というように設定してあげることが可能です。
とはいえ、これだけではまだよくわからないと思いますので、ここからは実際の処理事例をイメージできるように具体的に説明していきます。
◆事前準備
画像の配列処理を、ベースとなる配列がなければ話になりません。
今回は縦500ピクセル、横500ピクセル、色の三要素がすべてゼロという配列が準備されていることを想定して説明していきます。
※今回はpicという配列名にしています。
これをイメージで表すと以下の通りです。
すべての色の要素がゼロ、つまり真っ黒なので、この配列は縦500ピクセル、横500ピクセルの真っ黒な画像を表しています。
この真っ黒な画像配列に対して、いろいろな処理を施していこうと思います。
ここからはいろいろな処理事例をどんどん紹介します。
ひとつひとつの処理内容と、その結果画像の配列がどう変わるのかを見え行けば、画像の情報操作方法をイメージできるはずです。
◆例題①
◆例題②
◆例題③
どうでしょうか?
画素位置の指定方法と色の三要素の指定方法をイメージできてきたのではないでしょうか?
まだまだいきます。
◆例題④
◆例題⑤
例題④、⑤ではある列や行をすべて選択できる : の使用方法についてご紹介しました。
非常に便利なので、ぜひマスターしておきましょう。
最後に色の度合いも変更してみましょう。
◆例題⑥
これまではすべて色の度合いを255に指定していましたが、このように色の度合いを現象させると鮮やかさが減り、くすんだような色に変化していきます。
基本的には、青、緑、赤の三要素の度合いをうまく調整し、かつブレンドすることで、色というのは表現されています。
ここまでの6つの例題を通して、
◆画素の場所の指定方法
◆青、緑、赤のどの要素をいじるのかを指定する方法
◆画素を列や面で一気に指定する方法
◆色の度合いを調整する方法
を学べたと思います。
おおよそ画像の配列概念と、その中の情報を操作する方法がわかったとおもいますので、実際のプログラミングコードの書き方を簡単にご紹介していきます。
openCVにおける画像配列処理の事例コード
今回は以下のような画像を作成してみようと思います。
この画像を作成するpython-openCVのプログラミングコードは以下の通りです。
詳細な説明は省略しますが、ここまでで習得した知識と簡単なpythonコードを読む力さえあれば、どんな処理をやっているのかは理解できるはずです。
import cv2
import numpy as np
pic=np.zeros((500,500,3))
for i in range(500):
for j in range(500):
if abs(i-j)<20:
pic[i,j,0]=255
elif abs(i-j-100)<20:
pic[i,j,1]=50
elif abs(i-j+100)<20:
pic[i,j,2]=255
else:
pic[i,j,:]=255
pic[:,0,:]=0
pic[:,499,:]=0
pic[0,:,:]=0
pic[499,:,:]=0
cv2.imwrite('pic.jpg', pic)
◆処理の流れの簡単な説明
✔pic=np.zeros(***)で基準となる配列を準備
✔pic[*,*,*]=*で使用画素の色要素を指定
(今回はabs関数を使って斜めに各色の線が入るようにしています。)
✔cv2.imwriteで作成した配列を画像化
こんな感じです。
もし意味がわからない点があればお気軽にコメント欄やTwitterから質問してください。
おわりに
というわけで今回はpython-openCVでの画像配列の概念説明&配列内の情報操作方法について、初心者向けに詳細解説を行いました。
画像処理について、あなたの理解が深まっていれば幸いです。
このように私のブログでは様々なプログラミングスキルを紹介しています。
・もっと革新的なことをやりたい。
・プログラミングについてもっと詳しくなりたい。
こんな思いを持っている人は、ぜひ他の記事も見てみてくださいね。
この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
それではまた!
コメント