C言語関係掲示板

過去ログ

No751 画像を極座標表示画像に変換したい

[戻る] [ホームページ]
No.9340

画像処理
投稿者---かよ(2003/09/17 14:18:28)


画像を極座標表示画像に変換したいのですが、サンプルプログラムがあれば見たいのでよろしくお願いします。コメントもあると助かります。あと質問なのですが、よく極座標に変換するときはp=SQRT(x”+y”)を使わずに逆変換式x=rCOS0、y=rSIN0を使う理由はなんででしょうか?

No.9341

Re:画像処理
投稿者---たか(2003/09/17 14:24:58)


一般のコンピュータの表示装置(ディスプレイ等)はrowとcolumnで座標を
指定しなければならないからです。そりゃ極座標をそのまま表示する
ディスプレイを作れないこともないでしょうが、ほとんど使用する場面
はないでしょう。

No.9343

Re:画像処理
投稿者---かよ(2003/09/17 15:15:32)


なるほど。たかさんありがとうございます。実際どのようにCで組み立てていくのでしょうか?

No.9344

Re:画像処理
投稿者---たか(2003/09/17 15:47:19)


例えばline(x, y, x1, y1); で画面640×480に線が引けるとします。

r = (1 + cosθ)を描画するとしましょう。

コンピュータでは無限に短い直線を描くことはできませんから、1度=
2π/360 単位で描くとすると

for (theta = 0; theta <= 2 * M_PI; theta += 2 * M_PI / 360) {
  x = cos(theta) * (1 + cos(theta));
  y = sin(theta) * (1 + cos(theta));
  x1 = cos(theta + 2 * M_PI / 360) * (1 + cos(theta + 2 * M_PI)); 
  y1 = sin(theta + 2 * M_PI / 360) * (1 + cos(theta + 2 * M_PI)); 
  line(x + 320, y + 240, x1 + 320, y1 + 240);
}


のような形になると思います。但しこれでは小さすぎて図形が見えません
からx, y, x1, y1 の全てに適宜拡大するためかつ画面からはみ出さない
ような数字を掛ける必要があるでしょう。

なお、M_PI は処理系によっては定義されてない場合がありますのでその
場合は

#define M_PI 3.141592653589794

として下さい。

No.9345

Re:画像処理
投稿者---かよ(2003/09/17 16:41:29)


たかさん、またまたすみません。プログラムありがとうございます。いかにプログラムを載せます。

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define PIX 64
#define M_pi 3.141592

main{

	int x,y,x1,y1,i,j;
	int f[PIX][PIX];/*入力画像*/
	int g[PIX][PIX];/*出力画像(極座標)*/
	double theta;
    char korosuke[70];   /*ファイルオープン用*/

	FILE *fp;


	/* ファイルオープン(画像) */
	sprintf(koroske,"c:\\koro\\nit1k.dat");
    if((fp = fopen (ofile,"rt")) == NULL ){
		printf("\n Cannot open file : %s\n",koroduke);
		exit(1);
	}
			
	for( i = 0; i < PIX; i++ ){				
		for( j = 0; j < PIX; j++ ){
					
			fscanf(fp,"%d",&f[i][j]);
		
	}}
			
	fclose(fp);

	/*初期化*/
      for( i = 0; i < PIX; i++ ){		
		for( j = 0; j < PIX; j++ ){
			
			f[i][j] = g[i][j] = 0;
		

	}}




     for (theta = 0; theta <= 2 * M_PI; theta += 2 * M_PI / 360) {
           x = cos(theta) * (1 + cos(theta));
           y = sin(theta) * (1 + cos(theta));
           x1 = cos(theta + 2 * M_PI / 360) * (1 + cos(theta + 2 * M_PI)); 
           y1 = sin(theta + 2 * M_PI / 360) * (1 + cos(theta + 2 * M_PI)); 
          line(x + 32, y + 32, x1 + 32, y1 + 32);
	 }

    


ここからどのように作ればいいのかわからないのです。パソコンに64*64の画像があるので変えました。

No.9346

Re:画像処理
投稿者---かよ(2003/09/17 17:38:22)


すみません。修正版です。

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define PIX 64
#define M_PI 3.141592

main(){

	int x,y,x1,y1,i,j;
	int f[PIX][PIX];/*入力画像*/
	int g[PIX][PIX];/*出力画像(極座標)*/
	double theta,line;
    char koroske[70];   /*ファイルオープン用*/

	FILE *fp;


	/* ファイルオープン(画像) */
	sprintf(koroske,"c:\\koro\\nit1k.dat");
    if((fp = fopen (koroske,"rt")) == NULL ){
		printf("\n Cannot open file : %s\n",koroske);
		exit(1);
	}
			
	for( i = 0; i < PIX; i++ ){				
		for( j = 0; j < PIX; j++ ){
					
			fscanf(fp,"%d",&f[i][j]);
		
	}}
			
	fclose(fp);

	/*初期化*/
      for( i = 0; i < PIX; i++ ){		
		for( j = 0; j < PIX; j++ ){
			
			f[i][j] = g[i][j] = 0;
		

	}}




     for (theta = 0; theta <= 2 * M_PI; theta += 2 * M_PI / 360) {
           x = cos(theta) * (1 + cos(theta));
           y = sin(theta) * (1 + cos(theta));
           x1 = cos(theta + 2 * M_PI / 360) * (1 + cos(theta + 2 * M_PI)); 
           y1 = sin(theta + 2 * M_PI / 360) * (1 + cos(theta + 2 * M_PI)); 
          line(x + 32, y + 32, x1 + 32, y1 + 32);

       
	 }





No.9347

Re:画像処理
投稿者---たか(2003/09/17 19:17:35)


あのーちょっとお聞きしますが、これって64×64の画面に描画されたxy
座標系を読み込んで極座標系に変換するって事ですか?

これではできませんよ。元の極座標表示された関数がわからないと。

するとすればスプライン曲線などを利用した近似曲線になるでしょうね。

No.9350

Re:画像処理
投稿者---nop(2003/09/18 09:20:24)


>#define M_PI 3.141592

とりあえず、円周率は「acos(-1.0)」としておいた方がいいよ。