2016/04/07(木) [n年前の日記]
#2 [gimp] GIMPのMathMap用スクリプトを少し修正
昨日書いた GIMP + MathMap用のスクリプトは、横:縦=1:1の心射円筒図法の画像を、MathMap で正距円筒図法の画像にしてから、GIMPで2:1になるように縦方向を縮小、ということをやってたのだけど。MathMapのフィルタ処理+GIMPの縮小処理で、2回の変換が入るせいか、画像が荒れてしまうことに気づいたわけで。
そこで、MathMapで縮小までやってしまうようにスクリプトを少しだけ修正。これなら変換が1回で済むから多少はマシなはず。
_cylindrical2equirectangular_scale.mm
画像の縦方向を半分に縮小するなら、in(xy:[x, y * 2]) と書けばいいわけだけど。そのノリで、tan( y * (pi / 2) ) * 2 と書いてしまうと、心射円筒図法から正距円筒図法に変換するあたりがおかしくなる。この場合、tan() に渡す値を x 2 してやらないといけない。ということで、tan( y * (pi / 2) * 2) = tan( y * pi ) になる。
ただ、tan() に渡す値を x 2 にしただけでは、画像が縦方向に何回も描画される結果になってしまう。何故かというと、tan() に渡してる値が、-90度 〜 +90度を超えてしまうため。 _tan()は90度を超えるとまた同じ値の変化が表れてしまう ので、同じ画像が何回も描画されてしまうわけで。
なので、clamp(値, 最小値, 最大値) を使って、値が -90度から+90度の範囲に収まるようにしてる。
そこで、MathMapで縮小までやってしまうようにスクリプトを少しだけ修正。これなら変換が1回で済むから多少はマシなはず。
_cylindrical2equirectangular_scale.mm
# cylindrical to equirectangular and scale filter cylindrical2equirectangular_scale(image in) in( xy: [x, (1/pi) * tan( clamp(y*pi, -pi/2, pi/2) ) ] ) end修正内容は…。tan( y * (pi / 2) ) としていたところを、tan( clamp(y*pi, -pi/2, pi/2) ) にしただけ。
画像の縦方向を半分に縮小するなら、in(xy:[x, y * 2]) と書けばいいわけだけど。そのノリで、tan( y * (pi / 2) ) * 2 と書いてしまうと、心射円筒図法から正距円筒図法に変換するあたりがおかしくなる。この場合、tan() に渡す値を x 2 してやらないといけない。ということで、tan( y * (pi / 2) * 2) = tan( y * pi ) になる。
ただ、tan() に渡す値を x 2 にしただけでは、画像が縦方向に何回も描画される結果になってしまう。何故かというと、tan() に渡してる値が、-90度 〜 +90度を超えてしまうため。 _tan()は90度を超えるとまた同じ値の変化が表れてしまう ので、同じ画像が何回も描画されてしまうわけで。
なので、clamp(値, 最小値, 最大値) を使って、値が -90度から+90度の範囲に収まるようにしてる。
◎ 使う時の注意点・作業手順。 :
前述のスクリプトを使う際、対象画像は、横:縦 = 1:1 の画像にしておくこと。
例えば、Vue で 46:21、1024 x 467ドットの360度パノラマ画像をレンダリングしたとして。GIMP で開いてから、以下のような手順になる。
変換後、上下の透明部分が邪魔なので、トリミングしないといけない。
「均等にガイド」は、GIMPの追加スクリプト。 _均等にガイド(Grid of guides) から入手できるはず。
例えば、Vue で 46:21、1024 x 467ドットの360度パノラマ画像をレンダリングしたとして。GIMP で開いてから、以下のような手順になる。
- 画像 → キャンバスサイズの変更。縦幅を横幅と同じ 1024ドットに、かつ、画像を中央に配置する。オフセットの「中央」ボタンを押せば、中央に配置できる。あくまで、キャンバスサイズの変更をするだけ。画像の拡大縮小はしない。拡大縮小してしまうと、心射円筒図法から正距円筒図法への変換がおかしくなる。
- そのままだと、対象レイヤーが以前のサイズを引き継いだままになってる。レイヤーサイズも変更しないといけない。レイヤーを右クリック → アルファチャンネルの追加。かつ、レイヤーを右クリック → レイヤーをキャンバスに合わせる。これで、レイヤーも、キャンバスと同じ、1:1のサイズになる。
- 前述のMathMapスクリプトを実行。フィルタ → 汎用 → MathMap。これで、正距円筒図法の画像になってるはず。
変換後、上下の透明部分が邪魔なので、トリミングしないといけない。
- 画像 → 画像の自動切り抜き。これで上下の透明部分を省いたサイズでトリミングされる。その後、画像 → キャンバスサイズの変更。横:縦 = 2:1 のキャンバスサイズに変更する。
- あるいは、ガイドと切り抜きツールを使ってトリミングしてもいい。表示 → ガイドにスナップ、が有効な状態で、画像 → ガイド → 均等にガイド。横の分割数を1、縦の分割数を4にしてガイドを作成。これで、切り抜きツールを使って 2:1 のサイズでトリミングしやすくなる。
「均等にガイド」は、GIMPの追加スクリプト。 _均等にガイド(Grid of guides) から入手できるはず。
◎ MathMapの設定について。 :
色々試してみたけど、MathMap の Settings の Supersampling は、有効にすればいいというものでもなさそうだなと。有効にしたら、結果画像が結構ぼやけてしまった。
デフォルトでは Antialiasing だけチェックが入ってるけど、その状態が、バランスが取れてるのかもしれず。
デフォルトでは Antialiasing だけチェックが入ってるけど、その状態が、バランスが取れてるのかもしれず。
[ ツッコむ ]
以上です。