2020/03/23 公開
・数学座標→画像座標変換
ここでは、数学座標(x,y)を画像座標(px,py)に変換する方法を説明します。
数学座標(x,y)から画像座標に変換(px,py)に変換する計算式は以下のとおりです。
px = ax + b … 式①
py = cy + d … 式②
a、b、c、dは任意の値で、この値でどのように変換するかを決めます。ちなみに、これらの式では回転はできません。
次に、a、b、c、dの決め方を説明します。
次に、式①に2つの組のx座標を代入します。
px1 = ax1 + b … 式③
px2 = ax2 + b … 式④
ここから式③と式④からa、bを求めていきます。
式③から式④を引くと、
px1 - px2 = ax1 - ax2 … 式⑤
となります。
式⑤の右辺をaでまとめると
px2 - px2 = a( x1 - x2 ) … 式⑥
となります。
式⑥の両辺を( x1 - x2 )で割るとaが求まります。
a = ( px1 - px2 ) / ( x1 - x2 )
次に、bを求めていきます。
式①の両辺にx2を掛けた式⑦と、式②の両辺にx1を掛けた式⑧を作ります。
px1・x2 = ax1・x2 + bx2 … 式⑦
px2・x1 = ax2・x1 + bx1 … 式⑧
式⑦から式⑧を引くと、
px1・x2 - px2・x1 = bx2 - bx1 … 式⑨
となります。
式⑨の右辺をbでまとめると
px1・x2 - px2・x1 = b( x2 - x1 ) … 式⑩
となります。
式⑲の両辺を( x2 - x1 )で割るとbが求まります。
b = ( px1・x2 - px2・x1 ) / ( x2 - x1 )
同様に、式②に2つの組のy座標を代入します。
py1 = cy1 + d … 式⑤
py2 = cy2 + d … 式⑥
これをaとbを求めた方法でcとdを求めると、
c = ( py1 - py2 ) / ( y1 - y2 )
d = ( py1・y2 - py2・y1 ) / ( y2 - y1 )
となります。
まとめると、
a = ( px1 - px2 ) / ( x1 - x2 )
b = ( px1・x2 - px2・x1 ) / ( x2 - x1 )
c = ( py1 - py2 ) / ( y1 - y2 )
d = ( py1・y2 - py2・y1 ) / ( y2 - y1 )
です。
下の図は、2つ数学座標の範囲(x1,y1)-(x2,y2)を画像全体の範囲に変換する例です。
変換後の画像の座標にpx1=0、py1=0、px2=Width-1、py2=Height-1を指定すると、指定した数学座標の範囲を画像全体に変換することができます。
ここまで説明した内容をJavaのソースコードにしました。参考にしてください。
Transformation2d.java ← クリックしてダウンロードページに移動001: public class Transformation2d { 002: // 変換パラメータ a,b,c,d 003: private double a = 0.0; 004: private double b = 0.0; 005: private double c = 0.0; 006: private double d = 0.0; 007: 008: // パラメータを計算 009: boolean set( double x1, double y1, double x2, double y2, 010: double px1, double py1, double px2, double py2 ) 011: { 012: // ゼロとみなす値 013: double e = 0.0000000001; 014: 015: // 初期値を代入 016: a = b = c = d = 0.0; 017: 018: // x1とx2が同じ値であればエラー 019: if ( e > Math.abs( x1 - x2 ) ) return false; 020: 021: // y1とy2が同じ値であればエラー 022: if ( e > Math.abs( y1 - y2 ) ) return false; 023: 024: // パラメータの計算 025: a = ( px1 - px2 ) / ( x1 - x2 ); 026: b = ( px1 * x2 - px2 * x1 ) / ( x2 - x1 ); 027: c = ( py1 - py2 ) / ( y1 - y2 ); 028: d = ( py1 * y2 - py2 * y1 ) / ( y2 - y1 ); 029: 030: return true; 031: } 032: 033: 034: // 変換後のx座標を取得 035: public double getX( double x ) 036: { 037: return a * x + b; 038: } 039: 040: // 変換後のy座標を取得 041: public double getY( double y ) 042: { 043: return c * y + d; 044: } 045: }
ここから、メソッドについて簡単に説明していきます。
008: // パラメータを計算 009: boolean set( double x1, double y1, double x2, double y2, 010: double px1, double py1, double px2, double py2 )
数学座標の範囲(x1,y1)-(x2,y2)と変換後の画像座標の範囲(px1,py1)-(px2,py2)を与えて変換パラメータを設定するメソッドです。x1とx2が同じ値、またはy1とy2が同じ値の場合、エラーとなります。
034: // 変換後のx座標を取得 035: public double getX( double x )
040: // 変換後のy座標を取得 041: public double getY( double y )
■関連コンテンツ
画像の座標系 | 画像の座標系について解説 |
XY座標系 | xとyで表す位置 |
画像の大きさの取得 | 画像の横と縦のピクセル数を取得する方法について解説 |
画像処理とは | 画像処理とは何かを解説 |
■新着情報
2022.07.07 | 外部プログラムの実行 | exeファイル実行 |
2022.07.06 | 完全数 | 6=1+2+3 |
■広告