Javaプログラミング学習サイト ゆるゆるプログラミング

2020/09/04 公開

・数学座標→画像座標変換

ここでは、数学座標(x,y)を画像座標(px,py)に変換する方法を説明します。

数学座標系から画像座標系への変換

数学座標(x,y)から画像座標に変換(px,py)に変換する計算式は以下のとおりです。

 px = ax + b  … 式①

 py = cy + d  … 式②

abcdは任意の値で、この値でどのように変換するかを決めます。ちなみに、これらの式では回転はできません。

次に、abcdの決め方を説明します。

まず、数学座標画像座標を対応されたものを2組用意します。

 数学座標(x1,y1) → 画像座標(px1,py1)

 数学座標(x2,y2) → 画像座標(px2,py2)

次に、式①に2つの組のx座標を代入します。

 px1 = ax1 + b  … 式③

 px2 = ax2 + b  … 式④

ここから式③と式④からabを求めていきます。

式③から式④を引くと、

 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  … 式⑥

これをabを求めた方法でcdを求めると、

 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 )

数学座標のxを与えて、画像座標pxを戻すメソッドです。

040:    	// 変換後のy座標を取得
041:    	public double getY( double y )

数学座標のyを与えて、画像座標pyを戻すメソッドです。

■関連コンテンツ

画像の座標系 画像の座標系について解説
XY座標系 xとyで表す位置
画像の大きさの取得 画像の横と縦のピクセル数を取得する方法について解説
画像処理とは 画像処理とは何かを解説
四則演算(足し算/引き算/掛け算/割り算)について-画像

計算結果の表示

足し算(加法)/引き算(減法)/掛け算(乗法)/割り算(除法)の使い方を説明

画素について説明-画像

画素

画素とは、デジタル画像データを構成している色情報を持った点のことです。

■新着情報

2021.06.23 配列の初期値 配列の生成直後の値は?
2021.06.18 変数の初期値 変数に値を代入しないで計算

■広告

 

 

 

 

 

スッキリわかるJava入門第3版 [ 中山清喬 ]

価格:2,860円
(2021/6/18 14:32時点)
感想(6件)

 

 

 

Topへ