よく位相限定相関(POC)をキーワードでブログにいらっしゃる方がいるのと、
自分のためにまとめておきます。
位相限定相関法についての求め方を書いてあります。
また、4ではOpenCVで実装されているものの紹介。
5では従来の手法では検出できない回転に対して検出するための前処理であるLog-Polar変換を書いております。
OpenCvSharpで実装してみたものです。。。があまり自信はありません。
回転がされている場合でも検出できるようにLog-Polar変換の時に必要であったため記載したものです。
ですが、有名な補間手法なので画像の回転・拡大・縮小に使えます。
何か進展があればまた追記していきます。
自分のためにまとめておきます。
理論
また、4ではOpenCVで実装されているものの紹介。
5では従来の手法では検出できない回転に対して検出するための前処理であるLog-Polar変換を書いております。
OpenCvSharp
画像補間について
ですが、有名な補間手法なので画像の回転・拡大・縮小に使えます。
何か進展があればまた追記していきます。
スポンサーサイト
Log-Polar変換なのですが、霊長類の網膜のモデルらしいです。
中心部は解像度が高いのですが、周辺部は低いという特性らしいです。
以下のような式で変換をします。(極座標変換でのrにlogをとったものです。)
ですが、今まで行った回転のときのように、どの変換先の座標は元画像のどの位置を参照するかと考えます。
すなわち以下の逆変換を使います。
OpenCVのやりかたを真似したため、一部のみ抜粋です。
bmpが入力画像、lpcが出力画像です。
また、Mはformから入力された値を使用しました。256x256だと40くらいがよさそうです。
BiLinearInterpolationは以前の補間のさいに使用したものです。
画像を回転させる際の画素を補間するコード | 詠み人知らずの備忘録
変換した結果、(x,y)と(rho,phi)の関係がどのような対応になるのかは、下記のサイトがイメージがつきやすいと思います。
Log polar transform - Rhea
※クリックで拡大します。
【元画像】
【変換画像】
【元画像】
【変換画像】
画像の回転が、変換後の画像の下への移動としてあらわされています。
この考え方を、位相限定相関法(POC)と供に使用すると、角度のズレを判別できるためより便利な手法となります。(RIPOCという手法らしいです。)
位相限定相関法(POC) - スズメレンダラー・クマ将棋の開発日記
中心部は解像度が高いのですが、周辺部は低いという特性らしいです。
以下のような式で変換をします。(極座標変換でのrにlogをとったものです。)
ですが、今まで行った回転のときのように、どの変換先の座標は元画像のどの位置を参照するかと考えます。
すなわち以下の逆変換を使います。
ソース
OpenCVのやりかたを真似したため、一部のみ抜粋です。
bmpが入力画像、lpcが出力画像です。
また、Mはformから入力された値を使用しました。256x256だと40くらいがよさそうです。
BiLinearInterpolationは以前の補間のさいに使用したものです。
画像を回転させる際の画素を補間するコード | 詠み人知らずの備忘録
Bitmap lpc = new Bitmap(bmp.Width, bmp.Height); int cx = lpc.Width / 2; int cy = lpc.Height / 2; double M = Convert.ToDouble(textBox1.Text); for (int i = 0; i < lpc.Width; i++) { for (int j = 0; j < lpc.Height; j++) { double r = Math.Exp((double)i / (double)M); double x = r * Math.Cos(2 * Math.PI * j / lpc.Height) + cx; double y = r * Math.Sin(2 * Math.PI * j / lpc.Height) + cy; if (0 < x && x < bmp.Width - 1 && 0 < y && y < bmp.Height - 1) { Color bmpCol = BiLinearInterpolation(x, y, bmp); lpc.SetPixel(i, j, bmpCol); } } }
結果
Log polar transform - Rhea
※クリックで拡大します。
【元画像】
【変換画像】
【元画像】
【変換画像】
画像の回転が、変換後の画像の下への移動としてあらわされています。
この考え方を、位相限定相関法(POC)と供に使用すると、角度のズレを判別できるためより便利な手法となります。(RIPOCという手法らしいです。)
位相限定相関法(POC) - スズメレンダラー・クマ将棋の開発日記
しばらく放置してしまいました。新年一つ目の内容は画像の拡大・縮小にしました。
画像を拡大・縮小させる場合は、回転させる場合と同様に考えます。
つまり、outputの画像の座標から必要なinputの画像の座標を求めて画素値を取得します。
コードは以下のように考えました。
Scaleが取得した拡大率になります。
前回同様処理の肝の部分だけ書きました。
delegateを用いてfunc内で使用する補間用のメソッドを切り替えています。 詳細なコードは、
画像を回転させる際の画素を補間するコード
で記載した補間方法を使用しています。
バイリニアは若干ぼやけているように見えます。
下二つの違いがあるのですかねぇ・・・
ギザギザが目立つようです・・・
縮小の場合は低域通過フィルターで高域をカットしないとダメなようです。
画像を拡大・縮小させる場合は、回転させる場合と同様に考えます。
つまり、outputの画像の座標から必要なinputの画像の座標を求めて画素値を取得します。
コードは以下のように考えました。
Scaleが取得した拡大率になります。
for (int i = 0; i < bitmap.Width; i++) { for (int j = 0; j < bitmap.Height; j++) { double x = i / Scale; double y = j / Scale; if (chk[flag](x, y, bmp)) { Color bmpCol = func[flag](x, y, bmp); bitmap.SetPixel(i, j, bmpCol); } } }
前回同様処理の肝の部分だけ書きました。
delegateを用いてfunc内で使用する補間用のメソッドを切り替えています。 詳細なコードは、
画像を回転させる際の画素を補間するコード
で記載した補間方法を使用しています。
拡大(1.3倍)
【ニアレストネイバー】
【バイリニア】
【バイキュービック】
【Lanczos2】
バイリニアは若干ぼやけているように見えます。
下二つの違いがあるのですかねぇ・・・
縮小(0.75倍)
【ニアレストネイバー】
【バイリニア】
【バイキュービック】
【Lanczos2】
ギザギザが目立つようです・・・
縮小の場合は低域通過フィルターで高域をカットしないとダメなようです。
前回、前々回とバイリニア、バイキュービック補間を行っていましたが、
今回はLanczos(読めない)で行います。
参考にさせていただいたサイトは以下になります。理論的なところはこちらの方が詳しいです。
画像の拡大「Lanczos法」
どうやらうまくいっているようです。
今回はLanczos(読めない)で行います。
参考にさせていただいたサイトは以下になります。理論的なところはこちらの方が詳しいです。
画像の拡大「Lanczos法」
結果
Lancoz2
Lancoz3
バイキュービック
どうやらうまくいっているようです。
前回のバイリニアに続き、バイキュービックを適用した結果です。
参考にさせていただいたサイトは以下です。m(_ _)mアリガタヤ
画素の補間(Nearest neighbor,Bilinear,Bicubic)
すごく簡単に言ってしまうと、
バイリニアは周囲4点から画素の値を推測していたのを、
バイキュービックは周囲16点から画素の値を推測しています。
バイリニアでは、若干ぼけていた画像がバイキュービックでははっきり見えるようになっています。
しかし、計算する周囲の画素の数が増加したため、やはり処理が重くなっています。
どうやって高速化するかは自分のプログラム上の課題ですね(汗
参考にさせていただいたサイトは以下です。m(_ _)mアリガタヤ
画素の補間(Nearest neighbor,Bilinear,Bicubic)
すごく簡単に言ってしまうと、
バイリニアは周囲4点から画素の値を推測していたのを、
バイキュービックは周囲16点から画素の値を推測しています。
結果
ニアレストネイバー
バイリニア
バイキュービック
バイリニアでは、若干ぼけていた画像がバイキュービックでははっきり見えるようになっています。
しかし、計算する周囲の画素の数が増加したため、やはり処理が重くなっています。
どうやって高速化するかは自分のプログラム上の課題ですね(汗