伝統的なComputer Vision入門
今回は物体検出の際に利用する伝統的なComputer Vision処理を紹介していきます。特定の処理というよりは全体を見渡して網羅的に扱えるようなものを目指します。
Computer Visionの開発環境
アプリケーションに組み込むとなればやはりOpenCV一択でだと思います(自分の場合、OpenCVでモックを作って、高速化が必要な部分はOpenCLやマルチスレッド処理で書き直しを行なっていた)。OpenCVの利用環境ですが、openFrameworksが最高だったのですが、今はどうなんだろう・・・頑張ってPython+PyQtか、TouchDesignerか・・・。
色空間変換
物体を検出する場合、均等色空間がおすすめです。なにかっていうと例えば、RGB値はGを0から1に変えると注意深く見てる人は気づきますが、Bだと0から1に変えられてもほとんど気づけません。これが人間の変化を感じる量に対してRGBの変化量が線形でない、ということになります。均等色空間は(一部不具合はあるにせよ)色と色の距離が体感的に等しくなるように設計されています。OpenCVなどではL*a*b*色空間がComputer Visionでは広く利用されています。
(Wikipediaより)
フィルタ
ぼかしたりシャープしにしたりします。デザインのコンポジット系と同じようなラインナップですが、意外と無いのがメディアンフィルタ。スパイクノイズとかつぶつぶのノイズを消す処理ですね。
(鳥取大学のHPより)
二値化
抽出したパラメータで2値化を行います。単純二値以外にも適応二値などの照明の影響も低減できる2値化もあったりします。
(鳥取大学のHPより)
エッジ抽出
エッジを抽出します。Cannyが有名ですがSobelのLaplacian微分なども結構使ってた記憶があります。
膨張収縮
エッジを検出したが、線が微妙に繋がってない!とかノイズ邪魔!と言ったとき、あるいは特定の太さの線だけ拾いたい!というときに使うのが膨張収縮処理。単純に『線を太らせる処理』と『線を細らせる処理』の組み合わせなのですが色々使えます。例えば糸くずみたいな埃を除去したりとか、ボールについてるロゴを削除したりとか。
・膨張
・収縮
・膨張させてから収縮→クロージング
・収縮させてから膨張→オープニング
・元絵とクロージングの差分→ブラックハット
・元絵とオープニングの差分→トップハット
などなど。
(画像処理ソリューションのHPより)
画像処理ソリューション、前職時にめっちゃ読んでました・・・。
検出
ハフ変換などもありますが、ベタだとテンプレートマッチングが多い気がします。
(鳥取大学のHPより)
ヒストグラム
処理の前の解析フェーズでヒストグラムもよくチェックします。通常のRGBのヒストグラムも等z戦チェックしますが、RGBを3次元空間にプロットしてより球の大きさで個数を表す3Dヒストグラムはよく使ってました。多い色を検出するときなどによく使います。
当時はImageJというソフトとR、Gnuplot、あとProcessingでやってましたね・・・。
(ImageJ のHPより)
周波数解析
周波数解析も音楽ほどではないですが、よく使います。画像の場合は2次元なので2次元のFFTです。FFT後の画像をレタッチすることでモアレが発生するような細かい特定の周波数のみぼかすような処理ができます。このFFT画像、逆変換すると元の画像に戻るのが今だに不思議・・・。
(鳥取大学のHPより)
ちなみに
長々と書きましたが実は検出以外の処理は大体フォトショップにあります。なので前職ではサンプル画像を何枚か用意し、フォトショップを使っていい感じの二値画像になるまで処理して、それをバッチ化してサンプルを一括処理、検出処理だけいくつかプログラム上で試す、という感じでプロトタイピングしてました。
この記事が気に入ったらサポートをしてみませんか?