OpenCVSharp4でテンプレートマッチング
テンプレートマッチングとは
入力した画像から、テンプレートと似ている場所を抽出する方法。
方法
を使う。TemplateMatchModes
には以下の種類がある
TemplateMatchModes | 和訳 | 説明 |
---|---|---|
CCoeff | 共分散 | 値が大きいほど類似 |
CCoeffNormed | 相関係数 | 結果は-1 以上1以下。1で全く同じ画像 |
CCorr | 相互相関(スライディング内積) | 値が大きいほど類似 |
CCorrNormed | 正規化相互相関 | 結果は-1 以上1以下。1で全く同じ画像 |
SqDiff | 誤差2乗和 | 値は0以上。0で全く同じ画像 |
SqDiffNormed | 正規化誤差2乗和 | 値は0以上1以下。0で全く同じ画像 |
マッチング後にCv2.Normalize()
で正規化するのもアリ
プログラム
結果
入力画像
テンプレート
矩形描画
参考
https://docs.opencv.org/4.0.0/de/da9/tutorial_template_matching.html
https://docs.opencv.org/4.0.0/df/dfb/group__imgproc__object.html#ga3a7850640f1fe1f58fe91a2d7583695d
https://en.wikipedia.org/wiki/Cross-correlation
OpenCVSharp4で凹凸係数法による影の除去
はじめに
凹凸係数 とは、各画素 をその周辺の平均輝度 で除することで得られる係数である。
カーネルをとしたとき、凹凸係数 は次式で求まる。
は平均値ぼかしである。
(※論文で触れられてないが のゼロ除算はどう定義しよう?)
方法
- 画像をグレースケールで読み込む
- 平均輝度を求める
- 凹凸係数を求める
- 凹凸係数に二値化処理を行う
プログラム
結果
参考
https://www.jstage.jst.go.jp/article/iteac/2004/0/2004__2-5-1_/_article/-char/ja
https://www.jstage.jst.go.jp/article/iieej/36/3/36_3_204/_pdf/-char/ja
https://qiita.com/fallaf/items/1c5387a79027b2ec64b0
OpenCVSharp4でハフ変換による直線検出
ハフ変換(Hough Transform)について
直線を表す式としてよく知られるのが である。
このときが決まれば直線の式も求まるので、直線を
と考えることもできる。
しかし の定義域は
であるので扱いづらい。
そこで、ハフ変換では次のようなを考える。
ここで の位置関係は次の通りである。
画像引用元
の定義域は図より、画像のサイズを とすれば、
である。
ここで、
平面上の直線は、平面上の点に対応する。
さらに平面上の点を通りうる直線の集合は、平面上のサインカーブに対応する。
ここで、平面上の点が一直線上に並んでいた場合、平面上のサインカーブは共通な1点で交わる。
このような平面上で集中する場所を探すことで直線検出ができる。
方法
- 画像をグレースケールとして読み込む
- 読み込んだ画像の輪郭抽出を行う
- Hough変換
プログラム
NugetでOpenCVSharp4とOpenCVSharp4.runtime.winをインストールし、次のプログラムを実行
結果
Hough変換のパラメータthresh
によって得られる直線の数が変わるのでうまく調節してやる必要がある。
直線の長さで閾値を設けたい場合、確率的ハフ変換HoughLinesP()
を使うと良い
参考
https://docs.opencv.org/4.0.0/d9/db0/tutorial_hough_lines.html
https://qiita.com/YSRKEN/items/ee94c7c22599c2374722
OpenCVSharp4で構造要素(structure elements)を使った処理
はじめに
OpenCVの公式サイトを見てstructure elments(≒カーネル)を使った水平線・鉛直線の抽出を勉強した。
方法
structure elementsと一致する箇所だけを残し、楽譜から、線と音符を切り分ける。
- 画像を読み込む
- 読み込んだ画像を二値化し反転する
- 鉛直(水平)線状のstructure elementsを作成
- structure elementsを用いてオープン処理し、鉛直(水平)でない領域を除去する。さらに、反転で白黒を元に戻す。
- (鉛直成分のみ)輪郭を滑らかにする。
プログラム
結果
参考
https://docs.opencv.org/4.0.0/dd/dd7/tutorial_morph_lines_detection.html
OpenCVSharp4で射影変換
射影変換とは
画像平面を任意の3D視点から見直すこと
方法
- 画像の読み込み
- 入力画像の4点を指定
- 出力画像の4点を指定
- 指定した点を対応させる射影変換のパラメータを求める
- 射影変換を行う
射影変換の数式は以下の通り。全部で9個のパラメータがあるが、8自由度である。(分母と分子をで割ればよい)
対応させる4点が長方形の頂点である場合、長方形のアスペクト比(縦横比)を把握していないと正しく変換することができない。
また、今回対応させる4点の座標は、ペイントで求めた。
プログラム
結果
入力画像
出力画像
有名なグリコの看板の四隅を正面向きにした。看板と同一平面上にない物は歪んでしまう。
参考
https://docs.opencv.org/4.0.0/d2/de8/group__core__array.html#gad327659ac03e5fd6894b90025e6900a7
https://fermiumbay13.hatenablog.com/entry/2018/08/14/032643
OpenCVSharp4の画像の読込、表示および保存
基本的な機能も備忘録代わりに書いておく
画像の読み込み
①Mat()で読み込む方法と②Cv2.imread()で読み込む方法がある。
ちなみに両方とも第2引数に Imreadmodes.Grayscale
を追加することで、
グレースケールで読み込める。
バックスラッシュを使えないときは「\\」を代わりに使うか””の前に「@」を書く
画像の表示
①Cv2.Imshow()を使う方法と②ShowImage()を使う方法
ちなみに②の方がメモリ効率がいいらしい。
画像の保存
ImWriteを使う