1時間ごとに更新!Amazon.co.jpで今売れている本トップ100   掲示板ランキング



掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.5789

画像表示・変換のプログラム
投稿者---ゆうき(2006/06/06 09:47:05)


ファイルから画像を読み込み画面に表示させ、さらにそれをいろいろ変換させるプログラムです。いくら参考書を読んでもわかりません(> <;)どうかよろしくお願いします!!

プログラムの条件↓
(a)読み込むファイルはコマンド引数で指定する
(b)どの変換をするかは実行後に選択できるようにする
(c)必要なパラメータはキーボードから入力する
(d)結果は、画面に表示するかファイルに保存するかは選択できるようにする

変換↓
(1)画像の拡大・縮小(scaling)
(2)画像の回転(rotation)
(3)画像のせん断(shear)・・・水平方向・鉛直方向
(4)線形変換(linear transformation)
(5)アファイン変換(affine transformation)
(6)ヘルマート変換(Helmert's transformation)

キーワード↓
同次座標系
内挿処理
最近隣内挿入法
共1次内挿法
共3次内挿法
3次たたみ込み内挿法
ハッシュ関数

白黒画像表示プログラムはとりあえずつくりました。。↓今回はカラーも表示させなきゃないんですが・・・
#include<X11/Xlib.h>
#include<X11/Xutil.h>
#include<pgm.h>
#include<stdio.h>


int main(int argc,char *argv[]){
  Display *disp;
  Window root,win;
  unsigned long black,white;
  unsigned long table[256];
  GC gc;
  typedef unsigned int gray;
  XSetWindowAttributes att;
  gray **mem;
  FILE *cup,*pot;
  int yoko,tate,mixval;
  XImage *im;
  int i,j;
  XColor xc;
  Colormap cmap;

  /*画像ファイルをメモリへ転送*/
  if((cup=fopen(argv[1],"r"))==NULL){
    printf("file open error:cup.pgm\n");
    exit(0);
  }
  mem=pgm_readpgm(cup,&yoko,&tate,&mixval);

  printf("yoko=%d tate=%d\n",yoko,tate);
  /*ディスプレイの作成*/
  disp=XOpenDisplay(NULL);
  black=BlackPixel(disp,0);
  white=WhitePixel(disp,0);
  root=DefaultRootWindow(disp);

  win=XCreateSimpleWindow(disp,root,200,200,yoko,tate,1,black,white);
  /*ウィンドウマネージャーの介入を防ぐ*/
  att.override_redirect=True;
  XChangeWindowAttributes(disp,win,CWOverrideRedirect,&att);
  XMapWindow(disp,win);
  gc=XCreateGC(disp,win,0,0);

  /*ピクセル値のテーブルへの格納*/
 cmap=DefaultColormap(disp,0);
  for(i=0;i<256;i++){
    xc.red=i<<8;xc.green=i<<8;xc.blue=i<<8;
    XAllocColor(disp,cmap,&xc);
    table[i]=xc.pixel;
  }
  /*テーブルを使ったフォーマットの変換*/
  unsigned long color_mem[tate][yoko];
  for(i=0;i<tate;i++){
    for(j=0;j<yoko;j++){
      color_mem[i][j]=table[mem[i][j]];
    }
  }

  /*画像ファイルのディスプレイへの転送*/
  im=XCreateImage(disp,DefaultVisual(disp,0),DefaultDepth(disp,0),
          ZPixmap,0,0,0,0,32,0);
  im->byte_order=LSBFirst;
  im->bits_per_pixel=32;
  im->bytes_per_line=yoko * 4;
  im->width=yoko;
  im->height=tate;
  im->data=(char *)color_mem;
  XPutImage(disp,win,gc,im,0,0,0,0,yoko,tate);
  XFlush(disp);
  getchar();

  fclose(cup);
  XCloseDisplay(disp);
  return 0;
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:画像表示・変換のプログラム 5790 nop 2006/06/06 09:49:51
<子記事> 画像表示・変換のプログラム 5876 ゆうき 2006/06/20 18:31:05


No.5790

Re:画像表示・変換のプログラム
投稿者---nop(2006/06/06 09:49:51)


まずは、【掲示板利用宣言】をよく読み理解し、
そして書かれている内容を守ってください。


この投稿にコメントする

削除パスワード

No.5814

画像表示・変換のプログラム
投稿者---ゆうき(2006/06/15 13:19:37)


すみません。環境等記述していませんでした。
UNIXのC言語で作成し、%gcc [ファイル名] -lX11とします。


この投稿にコメントする

削除パスワード

No.5815

Re:画像表示・変換のプログラム
投稿者---ゆうき(2006/06/15 13:49:27)


コンパイル法間違えました。正しくは
%gcc [ファイル名] -lX11 -lnetpbm -lm
です。


この投稿にコメントする

削除パスワード

No.5816

Re:画像表示・変換のプログラム
投稿者---ぽへぇ(2006/06/15 20:13:31)


で、「何が」いくら参考書を読んでもわからないのですか?

(a)読み込むファイルはコマンド引数で指定する…方法がわからない
(b)どの変換をするかは実行後に選択できるようにする…方法がわからない
(c)必要なパラメータはキーボードから入力する…方法がわからない
(d)結果は、画面に表示するかファイルに保存するかは選択できるようにする…方法がわからない

変換↓
(1)画像の拡大・縮小(scaling)…の方法がわからない
(中略)

キーワード↓
同次座標系…とは何かわからない
(以下略)

「全部」ってのは無しです。


この投稿にコメントする

削除パスワード

No.5817

Re:画像表示・変換のプログラム
投稿者---ゆうき(2006/06/16 13:27:43)


>(1)画像の拡大・縮小(scaling)…の方法がわからない

↑です。行列の考え方を用いるというのは分かったんですが、結局どんなプログラムになるのかが見当もつきません(><;)


この投稿にコメントする

削除パスワード

No.5824

Re:画像表示・変換のプログラム
投稿者---ぽへぇ(2006/06/16 18:25:07)


>>(1)画像の拡大・縮小(scaling)…の方法がわからない
>↑です。行列の考え方を用いるというのは分かったんですが、
>結局どんなプログラムになるのかが見当もつきません(><;)

ではその行列を用いた考え方を文章にして表わしてください。
それができれば(効率の問題はあるかもしれませんが)
プログラムにできるのではないでしょうか。

というか、No.5789のプログラムを見る限り、
2次元が相手のように見えます。行列なんか使わ
なくても拡大・縮小できると思うのですが、
(私が)軽く考えすぎ?

例:
 3dot x 2dot の以下のような画像があって

    abc
    def

縦横それぞれ2倍に拡大したら

    aabbcc
    aabbcc
    ddeeff
    ddeeff

ですよね?
非整数倍の場合は色の補間をする必要があるかも知れないし、
ないかもしれない。あるとすればどのようにするのか、
それを知っているのは(現時点では)ゆうきさんだけです。




この投稿にコメントする

削除パスワード

No.5876

画像表示・変換のプログラム
投稿者---ゆうき(2006/06/20 18:31:05)


この前張り付けた白黒画像表示プログラムに、なんとか自力で拡大’縮小のプログラムをつけようとここまでできました。。が、コンパイルはできるのに、実行してみると、Segmentation faultになってしまって表示されません(T_T)
デバックもしましたが、途中からどうしても分からなくなってしまいました。
何がいけないのか分かる方いましたらどうか教えてください!!
あと、もし回転について分かる方がいたら、ぜひお願いします。
環境等は前といっしょです。

#include<X11/Xlib.h>
#include<X11/Xutil.h>
#include<pgm.h>
#include<stdio.h>



int main(int argc,char *argv[]){
  Display *disp;
  Window root,win;
  unsigned long black,white;
  unsigned long table[256];
  GC gc;
  typedef unsigned int gray;
  XSetWindowAttributes att;
  gray **mem,**ato;
  FILE *cup,*pot;
  int yoko,tate,mixval;
  XImage *im;
  int i,j,a,b,k,l,u,v;
  XColor xc;
  Colormap cmap;

  /*画像ファイルをメモリへ転送*/
  if((cup=fopen(argv[1],"r"))==NULL){
    printf("file open error:cup.pgm\n");
    exit(1);
  }
  mem=pgm_readpgm(cup,&yoko,&tate,&mixval);
  printf("縦何倍?\n");
  scanf("%d",&a);
  printf("横何倍?\n");
  scanf("%d",&b);
  printf("yoko=%d tate=%d\n",yoko*b,tate*a);
  /*ディスプレイの作成*/
  disp=XOpenDisplay(NULL);
  black=BlackPixel(disp,0);
  white=WhitePixel(disp,0);
  root=DefaultRootWindow(disp);

  win=XCreateSimpleWindow(disp,root,200,200,yoko*b,tate*a,1,black,white);
  /*ウィンドウマネージャーの介入を防ぐ*/
  att.override_redirect=True;
  XChangeWindowAttributes(disp,win,CWOverrideRedirect,&att);
  XMapWindow(disp,win);
  gc=XCreateGC(disp,win,0,0);

  /*ピクセル値のテーブルへの格納*/
 cmap=DefaultColormap(disp,0);
  for(i=0;i<256;i++){
    xc.red=i<<8;xc.green=i<<8;xc.blue=i<<8;
    XAllocColor(disp,cmap,&xc);
    table[i]=xc.pixel;
  }
 

  /*テーブルを使ったフォーマットの変換*/
  unsigned long color_mem[tate][yoko];
  for(i=0;i<tate;i++){
    for(j=0;j<yoko;j++){
      color_mem[i][j]=table[mem[i][j]];
    }
  }

  /*scaling*/
  v=tate*b;
  ato=(gray**)malloc(v*sizeof(gray*));
  for(i=0;i<v;i++){
    ato[i]=(gray*)malloc(u*sizeof(gray));
  }
  k=tate*a;
  l=yoko*b;
  for(v=0;v<k; v++){
    for(u=0;u<l;u++){
      yoko=u/a;
      tate=v/b;
      yoko=floor(yoko+0.5);
      tate=floor(tate+0.5);
      /*ここまでデバッグ完了*/
      ato[v][u]=color_mem[tate][yoko];
    }
  } 

  /*画像ファイルのディスプレイへの転送*/
  im=XCreateImage(disp,DefaultVisual(disp,0),DefaultDepth(disp,0),
          ZPixmap,0,0,0,0,32,0);
  im->byte_order=LSBFirst;
  im->bits_per_pixel=32;
  im->bytes_per_line=yoko * 4;
  im->width=u;
  im->height=v;
  im->data=(char *)color_mem;
  XPutImage(disp,win,gc,im,0,0,0,0,u,v);
  XFlush(disp);
  getchar();

  fclose(cup);
  XCloseDisplay(disp);
  return 0;
}




この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ