Polar
  

極座標変換

2 次元ユークリッド空間 R2 に於ける座標系です。1 個の動径 r と 1 個の偏角 θ によって表わされ、最も単純な極座標系は、rθ 平面、極座標平面です。 位置を動径の長さrと、基準位置からの角度φで表した座標(r, φ) 直角座標を長さrと角度φで表わすと、 直角座標(x,y)との関係は、x=r cos(φ), y=r sin(φ)となります。

極座標変換式は

円周上に書かれた文字などをパターンマッチングで処理する時などに用いられます。

変換前

変換後

ソースコード

/////////////////////////////////////////////////////////
// HighPass.cpp : ハイパスフィルタのサンプルプログラム
//
// このプログラムは画像ファイルを入力し、
// 極座標変換を実行するサンプルプログラムです。
//  画像出力のメモリ確保はあらかじめしない、
//  PoleConvertにアドレスを渡す
// 
/////////////////////////////////////////////////////////
#include "stdafx.h"

#include <windows.h>
#include <stdio.h>
#include <math.h>
#include <conio.h>


#include "MvcFlt2.h"
#include "MvcDib.h"
#include "MvcUtil.h"
#include "MicroViewer.h"
#include  // for std::swap
char *img_name = "Image/Filter/Polar0.bmp";	// 画像ファイル名
char text1[256];							// 結果表示用テキストバッファ
DWORD dwTime;

int main(int argc, char* argv[])
{
	 
	RECT rcP = {-1, -1, -1, -1};
	int Width ,Height;
	double r_in  = 10;			//内周半径
    double r_out = 192;		//外周半径
	double center_x = 314;		//中心X座標
	double center_y = 243;		//中心Y座標


	if(MvcFlt2_Init() != 0)
	{
		printf("MvcFlt2 初期化処理エラー\n");
		exit(1);
	}
	if(MvcUtil_Init() != 0)
	{
		printf("MvcUtil 初期化処理エラー\n");
		exit(1);
	}
	printf("極座標変換のサンプルプログラム\n");


	 HANDLE Input = mvLoadFromFile(img_name);		// 画像を読み込む
	 MvViewer Viewer1 = mvCreate("入力画像表示");	// ビュアーを作る
	 mvShow(Viewer1, Input);						// 入力画像を表示する
	
  // mvGetRect(Viewer1, &rcP);						// 検索範囲の設定

  // 出力用の画像を作る
	Width  = MvcDib_GetXsize(Input);
	Height = MvcDib_GetYsize(Input);

	rcP.top    = 0;
	rcP.bottom = Height -1;
	rcP.left   = 0;
	rcP.right  = Width -1;

//	HANDLE Output = MvcDib_Create(Width, Height, 1, 4);  // 画像処理エリアの確保はしない
	HANDLE Output;										 //  PoleConvertにアドレスを渡す 
						

	/*------------------極座標変換 ------------------------*/
	// 処理時間計測開始
	Vstart_timer();
	
	// 極座標変換を実行
	MvcFlt2_PoleConvert(&Output , Input , r_in , r_out , center_x , center_y);

	// 処理時間計測終了
	Vread_Utimer(&dwTime);
	// ビュアーを作る
	MvViewer Viewer2 = mvCreate("極座標変換");  
    // 濃淡画像を表示する
	mvShow(Viewer2, Output);
	
	// グラフィクス表示の消去
    MvcUtil_DrawClear();
	printf("\n【極座標変換 処理結果】\n");
	printf("\t極座標変換 処理時間 : %.2lf msec\n",(double)dwTime / 1000);
	sprintf(text1, " 極座標変換 : %.2lf msec",(double)dwTime / 1000);
    MvcUtil_DrawText(rcP.left + 20, rcP.top + 20,text1, GREEN);
	MvcUtil_Paint(mvGetDC(Viewer2));


/*------------キー 待ち --------------------------------------------*/

	printf("\n キー入力すると終了します\n");

	mvWait();
/*------------キー 待ち --------------------------------------------*/

	MvcFlt2_Fini();
	MvcUtil_Fini();	
 // ビュアーを破棄
	mvDestroy(Viewer1);
	mvDestroy(Viewer2);

// 画像メモリの開放
	MvcDib_Destroy(Input);
	MvcDib_Destroy(Output);

  return 0;
}