バックナンバーはこちら。
https://www.simulationroom999.com/blog/compare-matlabpythonscilabjulia3-backnumber/
はじめに
アフィン変換の続き。
今回は、プログラミングに向けての話。
登場人物
博識フクロウのフクさん

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
アフィン変換のプログラミングに向けて

もう必要な情報はそろったでしょー。

うむ。
そろそろプログラミングし始めても良いレベルだろう。
しかし、事前に何をどのようにやるかの確認は必要だ。

まずは処理の流れの確認だねー。

以下の流れを想定している。
- 画像サイズの取得
- 中心を0とした座標系の生成
- X軸、Y軸ともに-1~1の範囲の座標系として扱う
- 座標
の3次元ベクトル配列の生成。- ※ 全座標に対して一括でアフィン逆変換を実施するため。
- 変換元座標の算出(アフィン逆変換)
- 画像と同一形状の2次元配列に変換元座標配列を生成。
- 変換元の座標系-1~1をピクセル位置に変換。
- 元画像と変換元座標を元に変換先へコピー。

なんか、予想よりもやること多いぞ!!

まぁ、変換前の準備と後処理がいろいろ入ってるからねー。
画像サイズの取得と中心を0とした座標系の生成

画像サイズの取得はわかるけど、
中心を0とした座標系の生成ってのはなんだ?

画像の中心を原点とした回転をしたいからね。
原点が中心じゃないと困る。
画像で示すとこんな感じだな。


とりあえず、ピクセル座標からいい感じに座標を置き換えるってことだね。
座標の3次元ベクトル配列の生成。

その次の
「座標
が何言ってるのかわからん。

まぁ、各ピクセルの座標を作った段階では2次元配列になるんだけど、
それを1次元配列的な形に変形するって話だな。
まず、座標配列である、2次元グリッドを作る。
だいたいどのツール、言語でもmashgridという関数があるから、これをしようすると簡単に作れる。


そして、このままだと2次元配列なので、1元配列な構成に変更。
reshapeや行列の数列展開を使用すると実現できる。


あー、やりたいことのイメージはわかったかな。

でも、なんでこんなことをするんだ?
変換元座標の算出(アフィン逆変換)

アフィン逆変換を一括でやるためだな。
まずアフィン逆変換の式を再掲する。

これだと一つずつのピクセルの座標変換しかできない。
これを一括で出来るように式を拡張する。

あー、なるほど。
入力ベクトル、出力ベクトルが列ベクトルなのを拡張して、
入力ベクトル群としての行列、出力ベクトル群としての行列にしているのか。

そうそう。
まぁfor文で回しても良いのだけどね。
数式の段階で解決してしまった方が楽だろう。
まとめ

まとめだよ。
- アフィン変換のプログラムの流れを確認。
- 中心を0とした座標系の生成。
- 3次元ベクトル配列の生成。
- アフィン変換を一括で行うため。
バックナンバーはこちら。
コメント