• ベストアンサー

画素を数えるプログラム

現在、画像処理のプログラミングをやっているのですが、 2値化画像で黒の画素部分の数を求めて面積を出すプログラムを作っているのですが上手く出来ません。 誤ってる所ばかりだと思いますが、一応作ったソースを載せておきます。 int i, j; int histgram[color]; for(i=0; i<color; i++) { histgram[i]=0; } for(i=0;i<512;i++){ for(j=0;j<384;i++){ histgram[header[Isize][Jsize]]++; } } printf("%d\n",histgram[i]); 画像の読込みは自分で出来るので、255(黒)の画素がいくつあるのかを求める部分だけでも教えていただけるとありがたいです。 どうかよろしくお願いします。

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

  • ベストアンサー
  • hsyL
  • ベストアンサー率100% (3/3)
回答No.2

2値化された画像の黒の値が black 画像がW*Hの大きさのメモリ領域pic[]に入っているとして、 counterが黒の画素数として、 型は明瞭だから変数の宣言部は省きますが、 counter = 0; // 数える変数初期化 for (i=0;i<H;i++) { // 縦幅方向に動かす for (j=0;j<W;j++) { // 横幅方向に動かす index = i*W + j; // (j,i)のメモリ位置 if (pic[index] == black) { counter++; // もしも値が黒だったら1を足す } } // for j } // for i で十分だと思います。こういうのは簡単明瞭なのが一番です。 なお、ふつうは8ビットなBMPとかTIFFとか黒0で白255 ですが、逆なんですね。

その他の回答 (1)

  • tokichim
  • ベストアンサー率42% (88/205)
回答No.1

たぶんコピペして持ってきた部分で変数名を直し忘れていると思われるのが3カ所。 i++,Isize,Jsize。たぶんj++,i,jのつもり。 あと最後のprintf()は意味ない。配列の範囲外のところを出力している。 255のところを出したいならhistgram[255]でしょう。 定義されてない変数はたぶんどこかで定義されているとみて触れない。

関連するQ&A

  • プログラム

    教えていただきたいのですが、コマンドプロンプトでコンパイラして、実行結果が 2013 2013 hello 2013 hello nagoya 2013 hello nagoya kobe 2013 hello nagoya kobe osaka となるようにプログラミングしているのですが頭が悪く初心者の私にはできません。 下のプログラムだと間違いのようなのでご指摘お願いします。 #include <stdio.h> void main(void) { int i,j; for(j=1;j <= 5;j++) { for(i=1;i<=j;i++) { printf("2013\n"); printf("hello\n"); printf("nagoya\n"); printf("kobe\n"); printf("osaka\n"); } printf("\n"); } }

  • プログラム

    下のようなプログラムを作ったのですが、10進2進変換をj=n>>2&1の部分にあるようなビットシフトではなく、 for(i=1;i<8;i++){printf("bit[%d]=%d\n",i,n%2);n=n/2;}に変えて剰余計算で行うプログラムにしたいのですが、分かる方がいましたら教えて下さい。お願いします。 #include <stdio.h> int main(void) { int i,j,n; i=2; printf("数字を入力="); scanf("%d",&n); printf("Dec=%d\n",n); printf("heX=0x%x\n",n); j=n>>2&1; printf("bit[%d]=%d\n",i,j); return(0); }

  • 画素数の計算について

    現在BMPで640×480の画像の左右両端の80画素ずつ切り取り480×480の画像を作って さらに、8×8のブロックに分けて各ブロックごとの光の強度をだすプログラミングをつくっているのですが、 (各ブロックはそれぞれ[1][1]~[8][8]となづけています) [1][8]、[2][8]、[3][8]…と8がつくブロックの強度がすべて0になってしまいます。 いろいろと考えてみたのですが、どうにもうまくいかずに悩んでおります。 助けていただけませんでしょうか? よろしくおねがいします。 おそらく、ここらへんがおかしいと思う部分をのせておきます。 /* 640側の左右80ずつ切り取り、480×480の正方形の画像にする */ int bunkatsu(BMP *rp,RESULT *res){ int x,y; int a=0; for(y = 0;y < rp->Bmpi.biHeight; y++){ for(x = 80;x < rp->Bmpi.biWidth - 80; x++){ res->data[a] = rp->blue[y * rp->Bmpi.biWidth + x] + rp->green[y * rp->Bmpi.biWidth + x] + rp->red[y * rp->Bmpi.biWidth + x]; a++; } } return 0; } /* 480×480を8×8のブロックに分け(60×60が64ブロック) 、各ブロックの明るさを計算する */ int keisan(BMP *rp,RESULT *res){ int b,c; int i=0,j=0; int x,y; for(y = 0;(y+60) < rp->Bmpi.biHeight;y+=60){ for(x = 0;(x + 60) < (rp->Bmpi.biWidth - 160);x+=60){ for(b = 0;b < 60;b++){ for(c = 0; c < 60;c++){ res->akarusa[i][j]+=res->data[(y + b) * rp->Bmpi.biWidth +(x + c)]; } } j++; } j=0; i++; } max(res); return 0; } /* 一番明るいブロックの特定 */ RESULT *max(RESULT *res){ int MAX1=0; int MAX2=0; int i=0; int j=0; for(i = 0;i < 8;i++){ for(j = 0;j < 8;j++){ printf("[%d][%d]=%d ",i+1,j+1,res->akarusa[i][j]); if(MAX1 < res->akarusa[i][j]){ MAX1 = res->akarusa[i][j]; res->maxi=i; res->maxj=j; } } printf("\n"); } printf("一番明るいブロックは[%d][%d]です\n",res->maxi + 1,res->maxj + 1); return 0; } です。よろしくおねがいします。

  • プログラム作成が出来ません

    プログラム作成の課題でエラーが出て進めません (1)~(3)までだけなら作成できるのですがどうしても(4) を表示させることができません^^; (1)3~99までの奇数を7*7の2次元配列に読み込み表示 (2)(1)の配列の行と列を入れ替えたものを表示 (3)全要素の平均 (4)要素の中から9の倍数を選び出し表示 添削よろしくお願いします。 #include <stdio.h> main() { int a[7][7]; int i,j,ave,sum; int c; for(i=0; i<7; ++i) { for(j=0; j<7; ++j) { a[i][j] =3+(j*2)+(i*14); } } for(i=0; i<7; ++i) { for(j=0; j<7; ++j) { for(c=0; c<49; ++c) { if((3+(j*2)+(i*14))%9==0) { c=3+(j*2)+(i*14); } } } } sum=0; for(i=0; i<7; ++i) { for(j=0; j<7; ++j) { sum=sum+a[i][j]; } } ave=sum/7/7; for(i=0; i<7; ++i) { for(j=0; j<7; ++j) { printf( "%2d ", a[i][j] ); } printf( "\n" ); } printf("\n"); for(i=0; i<7; ++i) { for(j=0; j<7; ++j) { printf( "%2d ", a[j][i] ); } printf( "\n" ); } printf("\n"); printf("average=%d\n",ave); printf("\n"); for(c=0; c<49; ++c) { printf("%d",c); } } 長々と失礼しました・・・

  • c言語 プログラム ピラミッド

    プログラミングについて教えてください プログラムは ピラミッドの図形をユーザーが指定した数字で正三角形の ピラミッドの段数を指定できるプログラムです 例えば「5」と打てば ********* ■ ********■■■ ******■■■■■ ****■■■■■■■ **■■■■■■■■■ このような感じに表示されます *の部分は空白です #include<stdio.h> int main (void) { int num,i,j,h; printf("ピラミッドの高さを入力してください : "); scanf("%d" ,&num); for(i=1; i<=num; i++){ for(j=num; j>=i+1; j--){ printf(" ",j); } for(h=1; h<=j; h++){ printf("■"); } printf("\n"); } return 0; } ここまで出来ています、詰まっているのでご教授ください よろしくお願いします

  • シマウマの模様を変えるプログラム

    今画像処理で、シマウマの縞模様を変えるというプログラムを作成しています。 シマウマの画像を二値化して、白と黒に分けるところまではできました。 その後の黒い縞の部分を抽出して、別の画像をはめ込むところがよくわかりません。 どのようなプログラムにすればいいのでしょうか? よろしければ回答お願いしますm(__)m 一応↓に自分が考えた関数のプログラムを載せておきます。 (これを実行しても何も起きません…) どうかお願いします…・゜・(ノД`;)・゜・ /*---------しまうま関数--------*/ int Simauma(unsigned char inImage[], unsigned char outImage[], int w, int h) {  int i,j;    FILE *fp;  if((fp=fopen("out100.raw", "rb"))==NULL) /* out100:はめ込む画像 */    printf("ファイルをオープンできません。\n");  else{    for(i=0;i<h;i++){       for(j=0;j<w;j++){          if(inImage[j*w+i]==0) /* 領域が黒ならば */          inImage[j*w+i]=outImage[j*w+i]; }       }    }    fclose(fp);  return 1; }

  • 途中経過も表示するプログラム

    以下のプログラムで途中経過(例えば i=3の時 44 52 22 41 81 i=2の時 44 22 41 52 81 i=1の時 22 41 44 52 81 のように途中経過を表示するにはどうしたらいいんですか? 解る方がいらっしゃいましたら教えてください。 #include <stdio.h> int main(void) { int i,j; int n; /* データ数 */ int data[100]; /* データ用 */ int tmp; /* 交換用 */ printf("データ数="); scanf("%d",&n); for(i=0;i<n;i++){ /*データ入力*/ printf("data[%d]=",i); scanf("%d",&data[i]); } for(i=n-2;i>=0; i--){ for(j=0; j<=i; j++){ if(data[j]>data[j+1]) { tmp=data[j]; /* 隣あうデータ */ data[j]=data[j+1]; /* の交換 */ data[j+1]=tmp; } } } printf("ソート結果\n"); for(i=0;i<n;i++){ printf("data[%d]=%d\n",i,data[i]); } }

  • プログラムの添削

    以下のような数当てゲームを作りました.なるべくうまいプログラムを書けるようになりたいのですが,どのような改善点がありますか?よろしくお願いします. /*数当てゲームを作りなさい.*/ #include<stdio.h> void maegaki(void); /*このように関数を定義しまくることに意味はあるのか?main関数はすっきりするけど.*/ void in_check_out(int i); int main(void) { int i; int j; maegaki(); for(j=0;j<10;j++) { scanf("%d",&i); in_check_out(i); if(!(i-1)) return 0; printf("残り%d回です.\n",9-j); } return 0; } void maegaki(void) { printf("数当てゲームをはじめます.\nぼくの好きな整数を当ててください.\nチャンスは10回です.\nヒントはボゾン\n"); } void in_check_out(int i) { if(!(i-1)) { printf("正解!答えは1です.\n"); } else { printf("残念!\n"); if(i>1) printf("%dより小さいです.\n",i); else printf("%dより大きいです.\n",i); } }

  • 行列をべき乗させるプログラム

    2行2列を5乗させるプログラムを作って、一応できたつもりだったんですが結果が合いません・・・ 何かヒントでもいいのでわかる方いらっしゃいましたらよろしくお願いします。 <プログラム> #include <stdio.h> #define N 2 int A[N][N]; int A_NEW[N][N]; int A_5[N][N]; /* 行列Aを5乗したもの */ int main() { int i,j,k,l; /* 2行2列の係数行列Aの成分を入力 */ printf("係数行列Aを%d行%d列で入力してください\n", N, N); for( i=0; i<N; i++) { for( j=0; j<N; j++) { printf("A[%d][%d]=", i+1, j+1); scanf("%d", &A[i][j]); } } for(i=0; i<N; i++) /* A_NEW=A*Aの計算 */ { for(j=0; j<N; j++) { for(k=0; k<N; k++) { A_NEW[i][j] += A[i][k] * A[k][j]; } } } for(l=0; l<3; l++) { for(i=0; i<N; i++) /* A_5の計算 */ { for(j=0; j<N; j++) { for(k=0; k<N; k++) { A_5[i][j] += A_NEW[i][k] * A[k][j]; } } } for(i=0; i<N; i++) { for(j=0; j<N; j++) { A_NEW[i][j] = A_5[i][j]; } } } printf("A_5=\n"); /* 出力 */ for( i=0; i<N; i++) { for( j=0; j<N; j++) { printf("%d ", A_5[i][j]); } printf("\n"); } } <入力例> A= 1 3 2 1 <期待する結果> A= 241 303 202 241 <このプログラムの結果> 406 498 332 406

  • n次の奇数魔方陣をつくるプログラム

    どうしてもエラーが出てしまいます。少なくとも、「int mahojin[n+1][n+1],i,j,k;」あたりの行が間違っているらしいのですが、なぜだかわかりません。アドバイスお願いします!!(スペースが上手く入らなくて、全角スペースを使ってますが気にしないでください。) #include<stdio.h> int main(void) {  int n;  printf("n(ただし、nは奇数)=?");scanf("%d",&n);  int mahojin[n+1][n+1],i,j,k;  j=(n+2)/2;i=0;  for(k=1;k<=n*n;k++){     if((k%n)==1)      i++;     else {      i--;j++;     }     if(i==0)      i=n;     if(j>n)      j=1;     mahojin[i][j]=k;   }   printf(" %d次の魔方陣 \n",n);   for(i=1;i<=n;i++){     for(j=1;j<=n;j++)      printf("%4d",mahojin[i][j]);     printf("\n");   }   return 0; }

専門家に質問してみよう