【サンプル豊富】ディープラーニングを意識したPythonとOpenCVによる画像処理

当ページのリンクには広告が含まれています。

Pythonで画像処理を行う際は、OpenCVというライブラリがよく使われます。ディープラーニングが登場する前は、検品や自動運転で使われる物体検出、セキュリティで使われる顔認証は、全てOpenCVを使った画像処理が使われていました。

現在において、これらの処理はディープラーニングに置き換わりましたが、OpenCVに取って代わったという事ではなく、むしろディープラーニングによる認識精度を向上させるための前処理に、積極的に使われています。

そこで、今回はディープラーニングの前処理を念頭に、OpenCVの機能とサンプルを紹介したいと思います。

目次

OpenCVとは

OpenCVは、画像処理やパターン認識などのタスクをサポートするオープンソースのライブラリです。OpenCVは、コンピュータがデジタル画像を扱い、画像に含まれる特徴を抽出したり、物体を検出したりすることができるように設計されています。

具体的には、OpenCVは以下の機能が用意されています。

  1. 画像の読み込み、表示、保存
  2. 画像処理(リサイズ、回転、フィルタリングなど)
  3. 特徴抽出(SIFT、SURF、ORBなどのアルゴリズム)
  4. 物体検出(Haar Cascade、DNNモジュール)
  5. カメラキャプチャと動画処理
  6. モーション分析(オプティカルフロー、背景差分など)

OpenCVは、C++、Python、Javaなど複数のプログラミング言語で利用できるため、幅広いプラットフォームで使用されています。また、ディープラーニングのサポートもあり、ディープラーニングモデルを組み込むことで高度な画像処理タスクも可能です。

詳しくは、OpenCV公式ページのチュートリアルをご参照ください。

OpenCVのインストール方法

OpenCVを使う場合は、あらかじめ pip 又は conda コマンドで OpenCVのライブラリをインストールする必要があります。

#Python公式サイトからPythonをインストールしている場合
pip install opencv-python

#anaconda経由でPythonをインストールしている場合
conda install -c conda-forge opencv

また、OpenCVを利用するプログラムには、 import cv2 を記述しておきます。本記事のサンプルでは、 numpy を使っている場合もあるため、下記の2行をプログラム冒頭に記載しておいてください。

OpenCVの機能

ここからは、ディープラーニングの前処理として使えそうなOpenCVの機能についてサンプルを交えて紹介したいと思います。

画像の読み込み/表示/保存

画像の読み込み/表示/保存の処理イメージ

画像の読み込み

画像を読み込みます。

画像の表示

画像をウィンドウ表示し、キーが押されるとウィンドウを閉じます。

画像の保存

画像をファイルに書き出します。

画像のリサイズ

画像のリサイズのイメージ

画像の幅・高さの取得

画像の高さ、幅、チャンネル数を取得します。

画像のリサイズ

画像をリサイズします。

図形の描画

図形描画

四角形の描画

円の描画

楕円の描画

多角形の描画

前処理(標準化/ノイズ除去)

ここから前処理に関する機能の概要とサンプルソースコードを記載していますが、画像の読み込みや表示に関する部分は省略しています。ご自身の環境で試される場合は、下記ソースコードを参考に画像の読み込みと表示を追加の上、実行して下さい。

画像の正規化

画像のピクセル値を0から1の範囲にスケーリングします。

正規化のサンプル画像

正規化された画像は、正規化に対応した表示方法(OpenCVのimshowメソッドなど)だと元画像と同じ結果が表示されますが、非対応のアプリ(WindowsのペイントやPhotoShopなど)だと真っ黒に表示されます。

画像の標準化

画像のピクセル値を平均0、標準偏差1になるようにスケーリングします。

標準化のサンプル画像

標準化された画像は、Windowsのペイントだと真っ黒に映りますが、imshowメソッドだと画像として表示できます。ただし、見た目の色合いが随分変わります。

ノイズ除去(非局所的平均平滑化)

画像に含まれるノイズを除去します。画像全体の情報を使用してノイズを推定し、それに基づいてノイズ除去を行うため、局所的な情報だけを使用する従来の平滑化手法よりも高品質なノイズ除去が可能です。

ノイズ除去のサンプル画像

ノイズ除去(加重平均による平滑化手法=ガウシアンぼかし)

各ピクセルの値を周囲のピクセルの加重平均で置き換えることでノイズを除去します。計算速度は高速ですが、非局所的平均平滑化に比べて性能は低くなる場合があります。ちなみに、デジカメで高感度撮影した時に発生するノイズは、ガウシアンノイズとポアソンノイズの混合です。

ノイズ除去のサンプル画像
ガウシアンノイズ画像にランダムに加わる正規分布に従うノイズ
サルト・ペッパーノイズ画像の一部のピクセルが極端に明るくなる、又は暗くなるノイズ
ポアソンノイズ光子のランダム性により生じた明るさの変動で発生する点状のノイズ

ノイズ除去(中央値による平滑化手法

画像の各ピクセルに対して周囲のピクセル値をソートし、中央値を取ることでノイズを除去します。ノイズが極端に外れ値の場合でも、ノイズの影響を抑えることができます。

ノイズ除去のサンプル画像

エッジに対しても比較的良好な結果が得られる場合がありますが、ガウシアンぼかしに比べるとエッジの滑らか化効果は強くなります。

グレイスケール化

グレースケール化は、データ量の削減、計算の効率化、色情報の排除、カラーノイズの低減に効果があります。

グレイスケールのサンプル画像

カラー情報ではなく輝度情報を必要とするエッジ検出、物体検出、顔認識、テクスチャ情報や、SIFT(Scale-Invariant Feature Transform)やSURF(Speeded-Up Robust Features)などの特徴点抽出アルゴリズムなどで効力が発揮します。

ヒストグラム均等化

ヒストグラム均等化は、画像のコントラストを改善し、画像の輝度値をより広い範囲に分布させるための手法であり、視覚的な品質や特徴抽出の精度向上が期待できます。

ヒストグラム均等化のサンプル画像

ヒストグラム均等化は、カラー画像に対しても行うことができますが、通常はRGBカラースペースではなく、グレースケール画像に対して適用します。

カラー画像の場合、RGBチャンネルごとにヒストグラム均等化を行うと色のバランスが崩れる可能性があるため、別のカラースペース(例:YUV、HSV)でチャンネルごとにヒストグラム均等化を行うことが一般的です。

画像処理

画像の拡大と縮小

元画像に対して、指定した倍率で拡大、縮小を行います。

画像拡大・縮小のサンプル画像

エッジ検出

画像のエッジ(輪郭)を検出します。物体検出やセグメンテーションの前処理として利用できます。

エッジ検出のサンプル画像

RGBの色情報の分離

RGB(赤、緑、青)画像から色情報を分離します。

RGB分離のサンプル画像

R、G、B、に分解はされますが、色情報が欠落するため、そのままでは全チャンネルともグレースケールとして表示されます。

カラー画像のまま、表示したいチャンネル以外は値を0にしてしまうことで、そのチャンネルだけを持たせることが出来ます。

特定のチャンネルのデータを取り出す方法は、次の通りです。

特定のチャンネルを0にしてしまうには、 np.zeros_like() が利用できます。これは、引数に渡されたデータと同じサイズで、中身が0のデータを生成するものです。
最後に、cv2.merge() メソッドで3つのチャンネルを結合すれば、分離された色だけが残ったカラー画像が生成できます。

以上の内容を元に、指定した画像からR,G,Bのカラー画像を分離する関数を作ってみました。

RGB分離のサンプル画像

2値化(閾値を使う場合)

指定した閾値で2値化を行います。。threshold() の戻り値は2つあり、1つ目は指定した閾値が返され、2つ目に2値化の画像か返されます。

2値化のサンプル画像

通常、1つ目の戻り値は使わないので、 _ で破棄しています。

2値化(閾値を自動で求める)

閾値は輝度の分布から自動で決定(オーバーサムプリング)することも出来ます。

2値化のサンプル画像

2値化(適応的閾値処理)

画像の局所領域ごとに異なる閾値を適用して2値化する手法です。通常の固定閾値処理では、画像全体に同じ閾値を適用しますが、適応的閾値処理では、画像の明るさやコントラストの違いに対応して、各ピクセルの周囲の領域に基づいて動的に閾値を設定します。

2値化のサンプル画像

これにより、異なる部分の適切な閾値が得られ、光の変動が大きい画像や影のある画像などに対しても効果的に2値化が行えます。

回転

画像を回転します。

回転のサンプル画像

画像平行移動

画像を平行移動します。

平行移動のサンプル画像

反転

画像のピクセル値を反転させます。カラー画像でも反転は出来ますが、通常はグレイスケールもしくは2値化したものを反転して使うことが多いです。

反転のサンプル画像

明度と鮮明度

コントラストや画像の鮮明度を調整します。

明度と鮮明度のサンプル画像

色空間変換

画像の色空間を変換します。

色空間変換のサンプル画像
変換元の色空間 変換先の色空間変換コード
BGR (青緑赤)RGB (赤緑青)cv2.COLOR_BGR2RGB
BGR (青緑赤)LAB (色相、緑赤成分、青黄成分)cv2.COLOR_BGR2LAB
BGR (青緑赤)YUV (輝度、色差)cv2.COLOR_BGR2YUV
BGR (青緑赤)HLS (色相、彩度、明度)cv2.COLOR_BGR2HLS
BGR (青緑赤)XYZ (CIE 1931 XYZ)cv2.COLOR_BGR2XYZ
BGR (青緑赤)YCrCb (輝度、赤色差、青色差)cv2.COLOR_BGR2YCrCb
グレースケールBGR (青緑赤)cv2.COLOR_GRAY2BGR
HSV (色相、彩度、明度)BGR (青緑赤)cv2.COLOR_HSV2BGR
LAB (色相、緑赤成分、青黄成分)BGR (青緑赤)cv2.COLOR_LAB2BGR
YUV (輝度、色差)BGR (青緑赤)cv2.COLOR_YUV2BGR
HLS (色相、彩度、明度)BGR (青緑赤)cv2.COLOR_HLS2BGR
XYZ (CIE 1931 XYZ)BGR (青緑赤)cv2.COLOR_XYZ2BGR
YCrCb (輝度、赤色差、青色差)BGR (青緑赤)cv2.COLOR_YCrCb2BGR

フーリエ変換(グレイスケール)

フーリエ変換は、画像を空間領域から周波数領域に変換する方法です。画像の空間領域では、ピクセルの輝度値が座標によって表現されていますが、フーリエ変換を適用することで、画像内の周波数成分を表現することができます。周波数領域では、画像の高周波成分がエッジや細部などの細かい特徴を表し、低周波成分が画像全体の大まかな構造や背景などを表します。

フーリエ変換のサンプル画像

フーリエ変換は、画像処理の前処理として以下のような効果があります:

  1. ノイズ除去: 周波数領域でのフィルタリングを行うことで、ノイズを除去することができます。
  2. エッジ検出: 高周波成分を強調することで、エッジを検出することができます。
  3. テクスチャ解析: テクスチャ情報を抽出し、画像の細部やパターンを解析することができます。
  4. 画像の分析と特徴抽出: 周波数情報を分析することで、画像の特徴を理解し、特定のパターンや構造を抽出します。
  5. 画像の圧縮: 周波数成分を利用して画像の情報を圧縮することができます。

フーリエ変換(カラー画像)

カラー画像の場合、チャンネルごとにパワースペクトルを求める必要があります。チャンネルを渡すとパワースペクトルを計算する部分を関数化したサンプルを作ったので、紹介しておきます。

フーリエ変換のサンプル画像

コーナー検出

コーナー検出(Corner Detection)は、画像内のコーナー(角の部分)を自動的に検出するための画像処理手法です。コーナーは、周囲との色や輝度の変化が大きいポイントであり、画像内の重要な特徴点の一つとして扱われます。コーナー検出は、コンピュータビジョンや画像処理のさまざまなタスクに応用されます。

コーナー検出のサンプル画像

少し分かり難いですが、処理後の画像には判定箇所に赤い点がプロットされています。

特徴抽出

HOG特徴抽出

コンピュータビジョンや画像処理において、物体検出や特徴抽出に利用される手法の一つです。HOG特徴抽出は、画像内の局所領域における勾配方向と強度をヒストグラムとして表現し、これを特徴ベクトルとして用いることで、物体の形状や輪郭を抽出する効果的な手法です。

HOG特徴抽出の実行結果の画面キャプチャ

HOG特徴抽出の手順は以下の通りです:

  1. グレースケール画像に変換する: HOG特徴抽出は、グレースケール画像を入力として処理します。カラー画像の場合は、事前にグレースケールに変換する必要があります。
  2. 画像を小領域(セル)に分割する: 画像を小領域に分割し、それぞれの領域で勾配方向と強度を計算します。
  3. 勾配方向と強度のヒストグラムを作成する: 各セル内のピクセルに対して、勾配方向と強度を計算し、これらの値を複数の方向のビンに分割してヒストグラムを作成します。
  4. ブロック正規化: 作成したヒストグラムをブロックとして結合し、ブロック内の特徴ベクトルを正規化します。

HOG特徴抽出は主に物体検出や人物検出などのタスクに利用されます。SVM(Support Vector Machine)などの機械学習アルゴリズムと組み合わせることで、高い精度で物体を検出することが可能です。

SIFT特徴抽出

SIFT(Scale-Invariant Feature Transform)は、コンピュータビジョンや画像処理において、スケール不変性を持つ特徴点を抽出するための手法です。SIFT特徴抽出は、画像内の局所領域における特徴点を検出し、それらの特徴点の位置、スケール、方向などを記述します。

SIFT特徴抽出のサンプル画像

SIFT特徴抽出の主な手順は以下の通りです:

  1. スケール空間極大値検出: 画像の異なるスケールにおける特徴点を検出するため、スケール空間において特徴点の極大値を見つけます。
  2. キーポイントの位置とスケールの精緻化: 特徴点の位置とスケールをさらに精緻化し、重複する特徴点を削除します。
  3. 特徴点の向きの決定: 各特徴点における特徴の向きを計算します。これにより、特徴点の回転不変性を得ることができます。
  4. 特徴記述子の計算: 各特徴点周辺の局所領域における勾配方向をヒストグラムとして表現し、これを特徴ベクトルとして記述します。

SIFT特徴抽出は、特にスケール変化や回転、一部の視点変化に対してロバスト(環境の変化を受けにくい)であるため、物体認識や画像マッチングなどのタスクに非常に有用です。

データ拡張のサンプル

学習データを増やす手法をデータ拡張(Data Augmentation)と呼んでいます。

データ拡張は、入力データに画像処理を施すことで学習データのバリエーションを増やし、過学習の防止や汎化性能の向上を図りたい場合に行われます。

以下は、PythonとOpenCVを使用して、データ拡張を行う簡単なサンプルコードです。

画像の明るさ、ノイズの混入、画像の回転、上下左右の水平移動をランダムに実行し、データ拡張を行っています。

まとめ

今回は OpenCVのインストール方法、画像の読み込みと保存、ディープラーニングの前処理で使えそうな機能とサンプルプログラムを一通り紹介しました。

画像認識ではディープラーニングが主流になっていますが、OpenCVで前処理を行うことで、飛躍的に精度を高めることが可能です。

今回紹介した機能以外にも、まだまだ沢山の機能があります。本記事でOpenCVに興味を持たれた方、本記事に掲載されていない機能を使いたい方は、是非公式サイトのチュートリアルをご参照ください。

きっと色々な発見があると思います。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次