画像処理の基本解説 OpenCVの使い方入門[ソースコード有]
画像処理ってそもそもなに? 画像の基本単位をソースコードで紹介
私は製造業で生産性の改善や人で作業を自動化するような仕事をしているプログラマーです。
社内で画像処理システムを構築していますが,私以外はみんな機械系出身なので懇切丁寧に説明することを繰り返しています。
そんな経験から画像処理って基本的なところを含めてあまり知られていないのかもと思い,今回記事にしたいと思います。
画像処理の大人気ライブラリであるOpenCVの画像読み込み手法を紹介
画像処理を使ったアプリケーション開発で,最初に決めるのはどのライブラリを使用するかです。画像処理はもはや一大分野と言っていいほど成熟しているので処理の基本的な部分は先人の方々がライブラリとして作ってくれています。プログラマとして少ないコストで開発するためにもライブラリを使用するのは必須になります。
こういったライブラリ選定においてシステム開発者として意識すべきなのは運用をローコストに実施することです。誰も聞いたことのないようなライブラリを「便利だから」という理由で使ってしまうと保守する人が困ってしまい,最悪システム自体を保守できずに捨てるような結果になります。そのため可能な限り多くの人に使用されている汎用的なライブラリを使用しましょう。
有名なライブラリを列挙してみます。
- ライブラリ名:OpenCV 使用可能言語:Python,C++
- ライブラリ名:Pillow 使用可能言語:Python
- ライブラリ名:LibJpeg 使用可能言語:C言語
- ライブラリ名:PIL 使用可能言語:Python
多くのライブラリで使用できる言語としてPythonが目立ちますね。この中ならばどのライブラリでも良いような気はしますが汎用性を考えるとOpenCVになるかなと思います。ちなみにOpenCVの公式サイトはこちらになります。
また,今回おススメしているOpenCVはシェアが多くいろいろな人が使っているため書籍やネットから情報を収集しやすいです。プログラミングしている人だと分かると思いますが情報源の多さは重要ですよね。
OpenCVで見る!画像処理の基本 画像データの取得
OpenCVを使った画像データの取得をソースコード含めて解説していきます。
今回使用している開発環境は以下の通りです。ちなみにVisual Studioはなくても構いません。
- 開発環境:VisualStudio2019
- 開発言語:Python
- 使用ライブラリ:OpenCV
この条件で,特定の画像データを取得し,画像の大きさ取得,保存までする動画を作りました。
モデルはVTuberグループであるホロライブ所属の常闇トワ様です。私は彼女のルックスを初めて見た時に,彼女を画像処理におけるLennaにしたいと思いました。
ちなみにLennaとは画像処理におけるサンプル画像筆頭の方です。プログラマーは男性が多いので少しでも美人と触れ合いたいんでしょうね。物悲しいことです。
読み込んだ画像の大きさを調べるプログラミングを以下に記載します。
import cv2
img = cv2.imread('C:/Temp/towa.jpg') #ファイルをimgというnumpy.ndarrayで入る
#len関数はリスト形式の要素数を出してくれる C#経験者は配列だと思ってください
print(len(img)) #imgの要素数を出す これは画像の高さ方向です
print(len(img[0])) #img[0]の要素数を出す これは画像の幅方向です
cv2.imwrite('C:/Temp/TMT2.jpg',img) #所定のパスに画像を作成します
出力は以下の画像になります。どちらもリストの要素数は500のようです
つまりこの画像は500×500のデータで構成されているようです
これはどういう事なのでしょうか。読み込んだ際の画像のプロパティを調べてみましょう。
上図の右側にあるプロパティからこの画像は500×500ピクセルで構築される画像である事が分かります
プログラム上でimgに読み込んだ値は1ピクセルあたりのデータを500×500個分格納しているという事になるんですね
OpenCVで読み込んだ画像データ編集 画像の一部切り抜きを実施
これまでの内容から,画像処理は画像データを縦横のデータを変数に格納し,処理していく事が分かると思います。
今回PythonでOpenCVを使いながら画像取得しましたが,簡単なプログラミングで元画像を一部切り抜くプログラムを作ってみます。たった3行のプログラムですがこれだけで編集した画像が手に入ります。
import cv2
img = cv2.imread('C:/Temp/towa.jpg') #ファイルをimgというnumpy.ndarrayで入る
cv2.imwrite('C:/Temp/TMT2.jpg',img[250:500]) #下半分(250~500)を指定して保存する
プログラム上で読み込んだデータであるimgの下半分であるimg[250]~img[500]を指定して保存しています。上図の説明では当然下半分の画像になるはずです。では出力画像を以下に示します。
はい,綺麗に下半分の画像が手に入りましたね。しっかしエロティックですね・・・スタイル抜群で健康的です。
OpenCV 画像処理の基本まとめ
今回の記事のまとめを行います。
- 画像処理プログラムのライブラリは数多くあり,オススメはOpenCV
- 画像を取得すると,その画像のピクセル数に応じたデータリストを取得できる
- 取得した画像データの大きさが500×500の場合,画像左上がimg[0],左下がimg[500],右上がimg[0]の[500]となる
- 取得した画像データimgの一部を抜粋して保存すれば一部のみ切り抜いた画像を取得できる
となります。ちょっとまとめが堅苦しいですが画像処理なんて大して難しくなさそうだと感じてもらえたと思います。
少なくとも私はこの構成でデータを取ってきていると分かった時点で「画像処理なんて余裕そうだな」と思った事を覚えています。正直この程度の短いソースコードでも簡単な画像処理は出来てしまうので是非色々と試してみてください。他にもOpenCVを使ったプログラムをサンプルに書いていますので是非利用してください。
またWEBカメラを使ったリアルタイムな画像処理の方法はこちらの記事で紹介しています。