• ベストアンサー

より高速な画像の表示法

医療画像(DICOM)のバイナリデータを読み込んで表示させるプログラムを作っているのですが、非常に遅い(約4秒)ので改善したいのです。 おそらく、ループ中での、エンディアンの変換とPixelへの張付けが原因と思うのですが、改善方法が判りません。宜しくお願いします。 BolandC++Builder6,Pentiam4,1Gメモリ,XPの環境です。 DICOMO画像のファイルサイズは約2053kB 画像データは1024*1024の16ビットです。 __________________________________ Byte bb[2097152]; int iImage[512][512]; word c,wData; fp=fopen("filename","rb"); setvbuf(fp,NULL,_IOFBF,4096*1024*1024); while(gData!=0xE07F) //グループタグの検索// fread(& gData,2,1,fp); while(eData!=0x1000) //エレメントタグの検索// freadd(& eData,2,1,fp); fread(&wData,2,4,fp); //空読み// fread(bb,1,2097152,fp); //画像データ// fclose(fp); for(y=0;y<=512;y++){ for(x=0;x<=512;x++){ wData=256*bb[4*x+4096*y]+bb[4*x+4096*y+1]; c=wData*256/4096; iImage[x][y]=c; Image->Canvas->Pixels[x][y]=(TColor)((c<<16)|(c<<8)|c); c=0; } }

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.8

原因は幾つか推測できるだろうと思います。 が、ここでやるべきは闇雲にここが怪しいからいじってみよう という場当たり的な対処ではなく、 きちんとプロファイリングをして、どこがホットスポットなのかを 見極めることだと思います。 もっともC++ Builderだとまともに使えるプロファイラがあるのかどうか わかりません(無責任ですみません)。 少なくとも無料で使えるものはないかも知れません。

t0103
質問者

お礼

その後、ダブルバッファの様な処理をさせたところ、0.4sと約7倍速くなりました。貴重なご意見ありがとうございました。

t0103
質問者

補足

遅くなりましたがご意見を参考にしてclockで処理時間を計測しました default 3.00s 配列を[y][x] 2.47s #16#17 2.49s Canvas->Pixel[x][y]を外し、新たな配列に入れた場合 0.062s となりました。 Canvas->Pixel[x][y]の処理が遅い原因のようですが、ループ内ではBitmapの画素値の計算だけにして、ループ外でBItmapの配列を直接imageに貼付ける処理を試してようと思いますが、方法が判りません。 

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (17)

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.7

>★fread の部分が遅くなっている気がします。 >・fopen() 後のループである fread() をしない方が良いでしょう。 >freadをせずにメモリの確保しメモリ上で検索するには メモリ上で検索しても余り意味がない。 Cのライブラリルーチンは内部的にバッファを持っていて、バッファリングされてメモリ上にあるデータは、IO操作せずにメモリ操作しかしない。 freadの関数のオーバーヘッドが多少減るのみで、高速化は期待出来ない。 「スキップするヘッダのサイズが数キロバイトで、freadが数千のオーダーで呼ばれる」とかなら、最適化も充分に意味があるが、「患者氏名」とかが入ってるなら、せいぜい繰り返しても数十回であろう。

t0103
質問者

お礼

回答ありがとうございます。 freadの回数は2000回オーバーですので、期待はできるかもしれません。 ただ、やり方がよく判らないのです。

全文を見る
すると、全ての回答が全文表示されます。
noname#39970
noname#39970
回答No.6

ええともう片方はこうかな wData=256*bb[4*x+4096*y]+bb[4*x+4096*y+1]; ↓ //演算回数の削減 a= (x<<2) + (y<<12); wData= (bb[a]<<8)|bb[++a];

全文を見る
すると、全ての回答が全文表示されます。
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.5

>wData=256*bb[4*x+4096*y]+bb[4*x+4096*y+1]; >c=wData*256/4096; ここ、何か変ですね。上位、下位で2バイト持って来ておきながら Wordのデータを256倍して上位バイトを捨て、12ビット分の除算で、下位側の4ビットだけ残してる。 >Image->Canvas->Pixels[x][y]=(TColor)((c<<16)|(c<<8)|c); 最終的には、cが8ビットで、それをRGBの24ビットのR,G,B同じモノクロにしているつもりになっている。 もし「1画素16ビットの1024×1024を、間引きして、8ビット256階調の512×512にする」んで正しければ、以下のようになる。 -------------- Byte bb[2097152]; Byte *p; int iImage[512][512]; word c,wData; fp=fopen("filename","rb"); setvbuf(fp,NULL,_IOFBF,4096*1024*1024); while(gData!=0xE07F) //グループタグの検索// fread(& gData,2,1,fp); while(eData!=0x1000) //エレメントタグの検索// freadd(& eData,2,1,fp); fread(&wData,2,4,fp); //空読み// fread(bb,1,2097152,fp); //画像データ// fclose(fp); p=bb; for(y=0;y<=512;y++){ for(x=0;x<=512;x++){ c=*p++;//cは16ビットの上位バイト iImage[x][y]=c*256+*p;//iImageには16ビット分を格納 Image->Canvas->Pixels[x][y]=(TColor)(c*0x010101); p+=3; } p+=2048; } -------------- >c=wData*256/4096; の意味が良く判らないが、元ソースのまま、同じ動作にするなら -------------- Byte bb[2097152]; Byte *p; int iImage[512][512]; word c,wData; fp=fopen("filename","rb"); setvbuf(fp,NULL,_IOFBF,4096*1024*1024); while(gData!=0xE07F) //グループタグの検索// fread(& gData,2,1,fp); while(eData!=0x1000) //エレメントタグの検索// freadd(& eData,2,1,fp); fread(&wData,2,4,fp); //空読み// fread(bb,1,2097152,fp); //画像データ// fclose(fp); p=bb; for(y=0;y<=512;y++){ for(x=0;x<=512;x++){ wData=*p*256+p[1]; c=wData*256/4096; iImage[x][y]=c; Image->Canvas->Pixels[x][y]=(TColor)(c*0x010101); p+=4; } p+=2048; } -------------- になる。「c=wData*256/4096;」の意味が理解不可能なので、ここは最適化せずにそのまま残している。

t0103
質問者

お礼

回答ありがとうございます。 もし「1画素16ビットの1024×1024を、間引きして、8ビット256階調の512×512にする」んで正しければ、以下のようになる。 この解釈でよいのですがうまく動きませんでした。

全文を見る
すると、全ての回答が全文表示されます。
noname#39970
noname#39970
回答No.4

ごめん 違った c=wData*256/4096; は 単純に上の桁を8bit排除する物なのかな c=wData>>4; //排除しないならこうだと思う。(通分)

全文を見る
すると、全ての回答が全文表示されます。
  • noocyte
  • ベストアンサー率58% (171/291)
回答No.3

> setvbuf(fp,NULL,_IOFBF,4096*1024*1024); 4GB のバッファですか!? しかも,メモリが 1GB しかないのに. これは確保に失敗しているでしょう. いや,それ以前に,size_t が32ビット以下ならば, 4096 * 1024 * 1024 はオーバーフローして0になっているはずです. (コンパイル時に警告とかエラーになりませんでしたか?) いずれにしても setvbuf() はエラーを返しており, バッファは確保されていないはずです.それが遅さの原因と思われます. ちゃんとエラーチェックをする習慣をつけてください. (fread() についても.)

t0103
質問者

お礼

回答ありがとうございます。 setvbufについて。PCはネットに繋いでいないので、Macから質問しているのですがタイプするときに*1024を1回間違いました。 私のタイプミスで余計なお時間を取らせてしまいました。 (fread() についても.)はどういう意味でしょうか?

全文を見る
すると、全ての回答が全文表示されます。
noname#39970
noname#39970
回答No.2

うーん 見てぱっと考えつくのは 2の乗数による乗除算を論理演算・ビット演算に置き換えていく事かな 例えば c=wData*256/4096; //↓(これは下8bitをちょん切って更に3bitずらす作業だと思う) c=(wData&0xfff8)<<3; //型の大きさで0xfff8は適当に。 //手を抜くなら (!((!wData)|0x7))<<3 とか。ステップ数多いから遅いかも

全文を見る
すると、全ての回答が全文表示されます。
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★fread の部分が遅くなっている気がします。 ・fopen() 後のループである fread() をしない方が良いでしょう。  つまり、画像全体が収まるメモリを確保して、その画像ファイルすべてを  メモリに読み込みます。そして、メモリ上で『グループタグの検索』や  『エレメントタグの検索』を検索してみます。メモリが多いなら出来るかな。 ・あと別の方法で一度、画像データから『グループタグの検索』や『エレメントタグの検索』を  検索して画像の読み込む位置を別のファイルに保存しておきます。  そして、その位置ファイルを先に読み込み、fseek() 関数で位置を移動してから  瞬時に画像データを 2097152 バイト分読み込む方式を取ればもっと高速になります。  また、メモリも画像データを読み込む 2097152 バイト分で済みます。 ・以上。参考に。

t0103
質問者

お礼

回答ありがとうございます。 freadをせずにメモリの確保しメモリ上で検索するには具体的にどうやるのでしょうか? DICOMはタグの位置は画像毎に異なる(患者名の長さ等)ようなので後者は難しいです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 画像処理について・・・・・・・・・・・

    #include<stdio.h> #include<stdlib.h> #define X_SIZE 512 #define Y_SIZE 512 unsigned char DATA[Y_SIZE][X_SIZE]; unsigned char O_DATA[Y_SIZE][X_SIZE]; char input_file_name[256]=”Lenna.raw”; char output_file_name[256]=”Lenna_out.raw”; void heikin(){ int x,u; int temp; for(y=1;y<Y_SIZE-1;y++){ for(x=1;x<X_SIZE-1;x++){ temp=・・・・・・・・・・・・・・・・・・・・・・・・; O_DATA[x][y]=(unsigned char)temp; } } } Int main (){ FILE*fp; If((fp=fopen(input_file_name,”rb”))==NULL){ Printf(“ファイルオ-プンエラ-\n”); Return 1; } Fread(DATA,sizeof(DATA),1,fp); fclose(fp); heikin(); if((fp=fopen(output_file_name,”wb”))==NULL{ printf(“ファイルオ-プンエラ-\n”); return 1; } Fwrite(O_DATA,sizeof(O_DATA),1,fp); Fclose(fp); Return 0; } ソースコードをやっているのですが、後、・・・・・・・・・の所を入力して完成なんですが、苦戦してます。 処理の内容としましては、 1、入力画像Lenna.rawを読み込んで、 2、平均値フィルタをかけ、 3、Lenna_out.rawに書き出す(保存する)したいんですが、公式みたいなのを入れればいいのでしょうか? すみませんが、お願いします。

  • 行毎の黒のドット(ピクセル)数を教えていただけませんか?

    開発環境Microsoft Visual Studio .NET 2003 2値画像を読み込んだ時、各行毎の黒のピクセル(ドット)数を表示する プログラムを組もうとしているのですがわかりません。 画像読み込みまではできたのですがその後のプログラムがわかりません 誰か組んでいただけないでしょうか? #include <stdio.h> #include <process.h> #define Y_SIZE 3648 // 処理できる最大画像 #define X_SIZE 3648 #define HIGH 255 // 画像の最大強度値 #define LOW 0 // 画像の最小強度値 #define LEVEL 256 // 画像の強度レベル値 // BMPファイルのフォーマットに従って用意した変数 typedef unsigned short WORD; typedef unsigned long DWORD; WORD bfType; DWORD bfSize; WORD bfReserved1, bfReserved2; DWORD bfOffBits; DWORD biSize, biWidth, biHeight; WORD biPlanes, biBitCount; DWORD biCompression, biSizeImage, biXPelsPerMeter, biYPelsPerMeter, biClrUsed, biClrImportant; unsigned char image_in[Y_SIZE][X_SIZE][3]; // 入力カラー画像配列 unsigned char image_out[Y_SIZE][X_SIZE][3]; //出力カラー画像配列 unsigned char image_bw[Y_SIZE][X_SIZE]; //濃淡画像配列 unsigned char data_rgb[Y_SIZE][X_SIZE][3]; // RGB画像配列 //******************************************** // 24Bitビットマップファイル読み込み * //******************************************** void readBMP( char *filename, // BMPファイル名 unsigned char image[Y_SIZE][X_SIZE][3] // 24ビットRGB画像配列 ) { FILE *fp; int i, j, k; // ファイルオープン if ((fp = fopen(filename, "rb"))==NULL) { printf("readBmp: Open error!\n"); exit(1); } printf("input file : %s\n", filename); // ヘッダー情報読み込む fread(&bfType, sizeof(bfType), 1, fp); fread(&bfSize, sizeof(bfSize), 1, fp); fread(&bfReserved1, sizeof(bfReserved1), 1, fp); fread(&bfReserved2, sizeof(bfReserved2), 1, fp); fread(&bfOffBits, sizeof(bfOffBits), 1, fp); fread(&biSize, sizeof(biSize), 1, fp); fread(&biWidth, sizeof(biWidth), 1, fp); fread(&biHeight, sizeof(biHeight), 1, fp); fread(&biPlanes, sizeof(biPlanes), 1, fp); fread(&biBitCount, sizeof(biBitCount), 1, fp); fread(&biCompression, sizeof(biCompression), 1, fp); fread(&biSizeImage, sizeof(biSizeImage), 1, fp); fread(&biXPelsPerMeter, sizeof(biXPelsPerMeter), 1, fp); fread(&biYPelsPerMeter, sizeof(biYPelsPerMeter), 1, fp); fread(&biClrUsed, sizeof(biClrUsed), 1, fp); fread(&biClrImportant, sizeof(biClrImportant), 1, fp); // RGB画像データ読み込む for (i=0; i<(int)biHeight; i++) for (j=0; j<(int)biWidth; j++) { for (k=0; k<3; k++) { //fread(&image[i][j][2-k], 1, 1, fp); fread(&image[biHeight-i][j][2-k], 1, 1, fp); } } fclose(fp); } //********************************************** // RGBカラー画像を256諧調白黒濃淡画像へ変換 * //********************************************** void BMPto256BW( unsigned char image[Y_SIZE][X_SIZE][3], unsigned char image_bw[Y_SIZE][X_SIZE] ) { int y, x, a; for (y=0; y<(int)biHeight; y++) for (x=0; x<(int)biWidth; x++) { a = (int)(0.3*image[y][x][0] + 0.59*image[y][x][1] + 0.11*image[y][x][2]); if (a<LOW) a = LOW; if (a>HIGH) a = HIGH; image_bw[y][x] = a; } } //***************************************** //各行の黒色判定 //***************************************** //**************************************** // 白黒濃淡画像配列のコピー * //**************************************** void imageCopyBW( unsigned char image1[Y_SIZE][X_SIZE], unsigned char image2[Y_SIZE][X_SIZE] ) { int x, y; for (y=0; y<(int)biHeight; y++) for (x=0; x<(int)biWidth; x++) image2[y][x] = image1[y][x]; } void main(void) { char input[100], output[100]; int intensity; printf("入力画像ファイル名(*.bmp):"); scanf("%s", input); readBMP(input, image_in); // 画像の入力,RGB24ビットカラーBMP画像を配列に格納 //一列各行の黒色の数出力 }

  • ビットマップ画像を読み込むプログラムがうまく行きません。困ってます…。

    こんにちは。大学4年のyu-tinと申します。 現在、大学の研究で使用するためのプログラムとして、以下の機能を持ったプログラム作りに取り込んでいます。 1)ビットマップ画像(グレースケール、縦480×横640pixel)を読み込み、  その画像の1つ1つの画素の輝度値を表示させる 2)読み込んだビットマップ画像を出力させる しかし、作成したプログラムがうまく行きません。以下の3つの問題が発生しています。 a)0行0列~1行383列までの画素値がおかしい。  (0,0,0,0,1,1,1,0,2,2,2,0,3,3,3,0,…,254,0,255,255,255,0 となっている) b)出力した画像の最上部2行程度に、細くて黒い線が表示される。  (読み込んだ画像と全く同じ画像を出力させたい) c)出力した画像が、”ディスクエラー”によりPhotoshopで開けない。  (ペイントでは開ける) その問題のプログラムは、以下の通りです。 しかし、このプログラムは、他人のプログラムに改良を加えて作成したものです。なので、このプログラム自体、私自身が完璧に理解できていない状況です。 私は、プログラミングに関しては初心者に近いので、丁寧に教えて頂けると大変助かります。 研究が先に進まず、大変困っています…。みなさま、本当に、本当によろしくお願い致します。 //ビットマップ画像に関するプログラム。 //画像の表示と輝度値の表示を行う。 #include<stdio.h> #include<windows.h> #include<stdlib.h> #define X_SIZE 640  //画像の横幅(ピクセル数) #define Y_SIZE 480  //画像の縦幅(ピクセル数) #define Z_SIZE 1    //1つの画素に含まれる色の数 void *malloc(size_t size); void main(void) {  int i, j, k;   //ループ用変数 i…縦の画素用, j…横の画素用, k…色数用  int x=0;    //画像の横幅(ピクセル数)*/  int y=0;     //画像の縦幅(ピクセル数)  FILE *fp; /***********元画像データのメモリ確保*********/  BYTE ***mae;  mae=(BYTE ***)malloc(sizeof(BYTE **)*Y_SIZE);  for(i = 0; i < Y_SIZE; i++){   mae[i]=(BYTE **)malloc(sizeof(BYTE *)*X_SIZE);  }  for(i = 0; i < Y_SIZE; i++){   for(j = 0; j < X_SIZE; j++){    mae[i][j]=(BYTE *)malloc(sizeof(BYTE)*Z_SIZE);   }  } /*******画像の読み込み・輝度値の表示*******/  fp=fopen("sample1.bmp","rb");   //画像”sample1”を開く  BITMAPFILEHEADER bmfh;  BITMAPINFOHEADER bmih;  fread(&bmfh,sizeof(bmfh),1,fp);  fread(&bmih,sizeof(bmih),1,fp);  x=bmih.biWidth;  //インフォヘッダに含まれる画像の幅情報をxに代入  y=bmih.biHeight;  //インフォヘッダに含まれる画像の高さ情報をyに代入  for(i = 0; i < y ;i++){   for(j = 0; j < x; j++){    fread(&mae[i][j][0],sizeof(BYTE),1,fp);    if(i<640 && j<480)printf("%d, %d, %d\n",i, j, mae[i][j][0]);   //輝度値を表示   }  }  fclose(fp); /**************画像の表示*************/  //画像”sample1”を”sample2”という名前で出力する  fp = fopen("sample2.bmp" ,"wb");  //ヘッダの書き込み  fwrite(&bmfh,sizeof(bmfh),1,fp);  fwrite(&bmih,sizeof(bmih),1,fp);  for(i = 0; i < bmih.biHeight; i++){   for(j = 0; j < bmih.biWidth; j++){    fwrite(&mae[i][j][0],sizeof(BYTE),1,fp);   }  }  fclose(fp);  //ファイルをクローズ }

  • fread()エラー

    お世話になります。 今、バイナリファイルを操作しているのですが、 fread()でエラーになってしまいます。 char buf1[256]; FILE *fp; vector<string> f1; int num; fp = fopen("hoge.txt","r"); while( fgets( buf1, sizeof(buf1),fp ){ f1.push_back( buf1 ); num ++; } fclose(fp); FILE *cfp; unsigned char data[1024]; for(int i=0; i<num; i++ ){ cfp = fopen(f1[i].c_str(), "rb"); fread( data, sizeof(char), 1024, cfp ); } hoge.txtには、コンテンツ場所(パス)が複数記載されており、 その1つずつをfread()で読み込み解析したいのですが、 fread()でセグメンテーション違反になります。 f1の中味をprintf("%s",f1[0].c_str()); で見てみると正常にコンテンツの場所が格納されています。 また、 string pp = "/home/hoge/hoge.txt"; cfp = fopen(pp.c_str(), "rb"); fread(bb,sizeof(char),1024,cfp); とすると正常に動作します。 どうぞよろしくお願い致します。

  • c言語による画像処理について

    いつもお世話になってます。 c言語を使った画像処理を学び始めました。 入力画像の白(RGB値255,255,255)以外の画像を黒(RGB値0,0,0) に変換するプログラムを作成したいと思っているのですが、 入力画像の大きさによっては正常に命令を実行してくれないことがあるので、 改善点をご教示いただきたいと考え投稿させていただきました。ソースプログラムは #include<stdio.h> #define nx 100 //画像の幅 #define ny 100 //画像の高さ int main(void) { FILE *fp,*fp2; int i,j; unsigned char header[54]; unsigned char screen[nx][ny][3]; /* ファイルから読む */ fp=fopen("input.bmp","rb"); //ビットマップ形式 ,24ビットカラー fread(header,1,54,fp); // ヘッダ(54バイト)を飛ばす */ fread(screen,1,nx*ny*3,fp); // 残りはデータ(最下行から順に入る) //(255,255,255)以外なら黒(0,0,0)に for(j=0;j<ny;j++) for(i=0;i<nx;i++) if(screen[j][i][0]!=255||screen[j][i][1]!=255||screen[j][i][2]!=255){ screen[j][i][0]=0; screen[j][i][1]=0; screen[j][i][2]=0; } fclose(fp); /* ファイルに書く */ fp=fopen("output.bmp","wb"); fwrite(header,1,54,fp); /* ヘッダ */ fwrite(screen,1,nx*ny*3,fp); /* データ */ fclose(fp); return 0; } となっています。ここで、画像の高さ、幅を100以下にすると正常に変換できなくなります。 どなたか原因がお分かりでしたらお知らせ願えないでしょうか?

  • 平均値フィルタについて・・・・・・・・

    #include<stdio.h> #include<stdlib.h> #define X_SIZE 512 #define Y_SIZE 512 unsigned char DATA[Y_SIZE][X_SIZE]; unsigned char O_DATA[Y_SIZE][X_SIZE]; char input_file_name[256]=”Lenna.raw”; char output_file_name[256]=”Lenna_out.raw”; void heikin(){ int x,u; int temp; for(y=1;y<Y_SIZE-1;y++){ for(x=1;x<X_SIZE-1;x++){ temp=・・・・・・・・・・・・・・・・・ ; O_DATA[x][y]=(unsigned char)temp; } } } Int main (){ FILE*fp; If((fp=fopen(input_file_name,”rb”))==NULL){ Printf(“ファイルオ-プンエラ-\n”); Return 1; } Fread(DATA,sizeof(DATA),1,fp); fclose(fp); heikin(); if((fp=fopen(output_file_name,”wb”))==NULL{ printf(“ファイルオ-プンエラ-\n”); return 1; } Fwrite(O_DATA,sizeof(O_DATA),1,fp); Fclose(fp); Return 0; } 自分でプログラムを作って練習しているのですが、このソースコードで入力画像を読み込んで、平均値フィルタをかけ、Lenna_out.rawに書き出そうとしているのですが、・・・・・・の箇所には公式を当てはめていけばいいんでしょうか?? すみませんがよろしくお願いします。。。。。。

  • C言語でクロマキー合成をする方法

    input.bmpとbackground.bmpとoutput.bmpを作りで好きな絵を用意して、input.bmpというビットマップファイル(色数は24ビット)とbackground.bmpというファイルを開き,クロマキー合成をし,ビットマップファイルoutput.bmpに出力させる。 上記の物をC言語でするにはどうすればいいのでしょうか? 下記のものは自分でやったのですがやり方が分かりません。どなたか知恵を貸してください。 (ほとんど間違っていると思いますが・・・) #include<stdio.h> int main() { FILE *fp; int i; char data[2]; short s; fp1=fopen("input.bmp","rb"); fp2=fopen("background.bmp","rb"); fp3=fopen("output.bmp","wb") int k; for(k=0;k<10000;k++){ fputc(0,fp); fputc(0,fp); fputc(0,fp); } fclose(fp); fread(&data[0],1,2,fp1); fread(&data[0],1,2,fp2); fwrite(&data[0],1,2,fp3); int fs; fread(&fs,f1); fread(&fs,f2); fwrite(&fs,f3); fp=fopen("aka.bmp","wb"); fread(moji,1,2,fp); i=30054; fread(&i,4,1,fp); i=0; fread(&i,4,1,fp); i=54; fread(&i,4,1,fp); i=40; fread(&i,4,1,fp); i=100; fread(&i,4,1,fp); i=100; fread(&i,4,1,fp); s=1; fread(&s,2,1,fp); s=24; fread(&s,2,1,fp); i=0; fread(&i,4,1,fp); i=30000; fread(&i,4,1,fp); i=120; fread(&i,4,1,fp); i=120; fread(&i,4,1,fp); i=0; fread(&i,4,1,fp); i=0; fread(&i,4,1,fp); for(k=0;k<10000;k++){ fputc(0,fp); fputc(0,fp); fputc(70,fp); } fclose(fp); fp=fopen("midori.bmp","wb"); fread(moji,1,2,fp); i=30054; fread(&i,4,1,fp); i=0; fread(&i,4,1,fp); i=54; fread(&i,4,1,fp); i=40; fread(&i,4,1,fp); i=100; fread(&i,4,1,fp); i=100; fread(&i,4,1,fp); s=1; fread(&s,2,1,fp); s=24; fread(&s,2,1,fp); i=0; fread(&i,4,1,fp); i=30000; fread(&i,4,1,fp); i=120; fread(&i,4,1,fp); i=120; fread(&i,4,1,fp); i=0; fread(&i,4,1,fp); i=0; fread(&i,4,1,fp); for(k=0;k<10000;k++){ fputc(0,fp); fputc(150,fp); fputc(0,fp); } fclose(fp); fp=fopen("ao.bmp","wb"); fread(moji,1,2,fp); i=30054; fread(&i,4,1,fp); i=0; fread(&i,4,1,fp); i=54; fread(&i,4,1,fp); i=40; fread(&i,4,1,fp); i=100; fread(&i,4,1,fp); i=100; fread(&i,4,1,fp); s=1; fread(&s,2,1,fp); s=24; fread(&s,2,1,fp); i=0; fread(&i,4,1,fp); i=30000; fread(&i,4,1,fp); i=120; fread(&i,4,1,fp); i=120; fread(&i,4,1,fp); i=0; fread(&i,4,1,fp); i=0; fread(&i,4,1,fp); for(k=0;k<10000;k++){ fputc(255,fp); fputc(0,fp); fputc(0,fp); } fclose(fp); return(0); }

  • 2次元配列への代入

    入力画像ファイルの画素を取り込むところで input[x][y] = c(画素) を代入しているのですが、printfで結果を出力すると全て0になってしまい代入されません。なぜか教えてください #define X_wid 512 #define Y_wid 512 main(int argc,char *argv[]) { int x=0,y=0,X=0,Y=0,c; long input[X_wid+1][Y_wid+1],Input1[(X_wid)*(Y_wid)+1]; FILE *fp,*fp_w; if((fp = fopen(argv[1],"r")) != NULL){ while((c = getc(fp)) != EOF){ input[x][y] = c; Input1[x] = c; if(y==Y_wid){ y=0; x++; } else y++; printf("%d %d %d %d\n",x,y,input[x][y],c); } } }

  • 画像変換の高速化

    DOS/VマシンでMicrosoft C Ver6.0でCの勉強をしています。 初心者の入り口レベルなので、質問の内容が拙いかもしれませんが、よろしくお願いします。 BMPの8ビット形式の画像を任意のデータに変換するプログラムを作ったのですが、処理速度がとても遅く(1.7M位で5分30秒かかりました)何とか高速化をしたいと思います。 今やっているやり方はX方向分(ファイルサイズをYサイズで割ったもの)のバッファを取り、書込む時に実際のX方向分のみ書き込ませる。 をY方向分繰返すという処理です。 絶対もっと早くなる方法があるはずだと思うのですが、いくら考えても全く分かりません。 アドバイスをよろしくお願いします。

  • 画像を読み込んでヒストグラムを作るプログラム

    2値化画像を読み込んで、ヒストグラムを表示させるプログラムを作りたいのですが、 以下のソースを作成したのですが実行中にエラーが発生して困っています。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> #define width 640 #define height 480 int main(int argc, char* argv[]) { unsigned char image[640*480]; unsigned char header32[1078];//ビットマップ情報 int i; int *histogram; FILE *fp1; unsigned char buffer1[640*480]; for(i=0; i<640*480; i++) { image[i]=0; buffer1[i]=0; } fp1=fopen("koshimizu1.bmp","rb"); // fread(image,1,640*480,fp1); fread(header32,1,1078,fp1); fread(buffer1,width,height,fp1); fclose(fp1); for(i=0;i<256;i++){ histogram[i]=0; } for(i=0;i<640*480;i++){ histogram[image[i]]++; } for(i=0;i<256;i++){ printf("%d %d \n",i,histogram[i]); } return 0; }