• 締切済み

配列

・画像のヒストグラムを作成するとき、 for(y=0; y<height; y++){ for(x=0; x<width; x++){ hist[ InputData[y][x] ]++ } } と書かれているのですが、hist[ InputData[y][x] ]++ の部分はどうゆう意味なのですか? よろしくお願いします.

みんなの回答

  • i-kujou
  • ベストアンサー率50% (13/26)
回答No.1

> hist[ InputData[y][x] ]++ を以下のように書き直すと分かりますでしょうか? int idx = InputData[y][x]; hinst[idx] = hinst[idx] + 1; 察するにInputData[y][x]には画素の色データが入っていて、 hinst にどの色がどれだけ使われているかを調べている、と予想。

razio915
質問者

お礼

ありがとうございます

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

関連するQ&A

  • 色の指定で配列を使いたい

    ASP.NETで棒グラフを描いています。 3本の棒があったとして、今までは、 ------------------------------------------------ g.FillRectangle(New SolidBrush(Color.Blue), x, y, width, height) g.FillRectangle(New SolidBrush(Color.Green), x, y, width, height) g.FillRectangle(New SolidBrush(Color.Red), x, y, width, height) ------------------------------------------------ このように書いていたのですが、 色の部分を配列にしたいと考えています。 ------------------------------------------------ Dim BrCol As New ArrayList BrCol.Add("Blue") BrCol.Add("Green") BrCol.Add("Red") For i = 0 to 2 g.FillRectangle(New SolidBrush(BrCol(0)), x, y, width, height) Next ------------------------------------------------ これではエラーになります("指定されたキャストは有効ではありません。") どのように書けばよいでしょうか? よろしくお願いします。

  • プログラムについて。

    プログラムについて。 現在類似画像検索についてのプログラムをOpenCvを用いて作っています。RGBのヒストグラムを作り、それを比較することで類似度を表そうとしているのですが、以下のプログラムに一番外側のfor文を追加するとエラーが起こり止ってしまいます。 for( k=1 ; k < 4 ; k++ ){ ←これがエラーの原因   for (i = 0; i < sch; i++) { dst_img2[i] = cvCreateImage (cvSize    (src_img[k]->width,src_img[k]->height), src_img[k]->depth, 1); } cvSplit (src_img[k], dst_img2[0], dst_img2[1], dst_img2[2], dst_img2[3]); // ヒストグラムを計算,正規化して,距離を求める for (i = 0; i < sch; i++) { cvCalcHist (&dst_img1[i], hist1, 0, NULL); cvCalcHist (&dst_img2[i], hist2, 0, NULL); cvNormalizeHist (hist1, 10000); cvNormalizeHist (hist2, 10000); tmp = cvCompareHist (hist1, hist2, CV_COMP_BHATTACHARYYA); dist += tmp * tmp; } dist = sqrt (dist); } ちなみにdistには、2つの画像のヒストグラムがどれだけ離れているかという距離が入ります。わかりずらいプログラムで申し訳ありませんが是非分かる方がいらっしゃったら回答お願いします。

  • IplImageをPictureBoxへ表示がうまくいきません。

    VC++にてOpenCVを使い画像処理を行っている者です。 処理後の画像をMFCで作成したPictureBoxに表示したいのですが、 IplImageからBmpへの変換がうまくいきません。 //--------------------------------------------------------------- IplImage *img; img = cvLoadImage(filename, 0); // 0: グレイスケールで読み込む cvThreshold(img,img, 70, 255, CV_THRESH_BINARY_INV);//二値化 char* ColorBuf = (char*)calloc( sizeof(char), img->width * img->height * 4 ); for( int y = 0; y < img->height; y++ ) { for( int x = 0; x < img->width; x++ ) { ColorBuf[ y * img->width * 4 + x * 4 + 0 ] = img->imageData[ y * img->widthStep + x * 3 + 0 ]; ColorBuf[ y * img->width * 4 + x * 4 + 2 ] = ColorBuf[ y * img->width * 4 + x * 4 + 1 ]= ColorBuf[ y * img->width * 4 + x * 4 + 0 ]; } } mbmp.CreateBitmap( img->width, img->height, 1, 32, ColorBuf ); free( ColorBuf ); ((CStatic*)GetDlgItem( IDC_IMGSRC ))->SetBitmap ( mbmp ); cvReleaseImage( &img ); } //--------------------------------------------------------------- 今はPictureBoxに3つ縦に画像が表示されてしまってます。 何か改善点などがありましたらよろしくお願いいたします。

  • opencvを用いた二値画像のアクセスと座標の取得

    いつもお世話になっています。 opencvを用いたプログラムを作成しています。 真ん中に大きな塗りつぶされた●が1つあるカラー画像を二値画像に変換して、●の部分のすべての座標をとりたいと考えています。(●は大きいので1ピクセルではありません。●を構成しているピクセルの座標すべてをとるといった感じです。) 今、途中まで作成したのですが間違っているところがあると考えられるので、エラーは出ないのですがプログラムが正常に動きません。このプログラム内での間違いであるとは考えられるので、間違っている部分を教えてもらえないでしょうか? よろしくお願いします。 //元のカラー画像 IplImage* image = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3); IplImage* gray_image = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); //二値画像 IplImage* niti_image = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); //座標を入れるための配列 int test_width[500]; int test_height[500]; //カラー画像ここでimage画像に大きな●を書きました。これ以降は●がimageに存在するものとして考えてくださいお願いします cvDrawContours( image, hand_contour[0], CV_RGB (0, 0, 0), CV_RGB (0, 0, 0), -1, CV_FILLED, 8 ,cvPoint(0,0)); //グレースケールの作成 cvCvtColor(image,gray_image,CV_BGR2GRAY); // 画像の二値化【判別分析法(大津の二値化)】 cvThreshold (gray_image, niti_image, 90, 255, CV_THRESH_BINARY); int k = 0;      // 左上から順番に画像を見ていく for( int y = 0; y < niti_image->height; y++){ for(int x = 0; x < niti_image->width; x++){ //もし黒色の値が入っていたら配列に座標を代入する if(niti_image->imageData[y * niti_image->widthStep + x * niti_image->nChannels] == 0){ test_width[k] = x; test_height[k] = y;   k++;             }//if } }

  • MATLAB で配列みたいなものを

    乱数を発生させて、ヒストグラムに表示させたいのですが、 内部関数のrandをつかわずに 例えば、乗算型合同法 x(n+1)=15x(n) mod (10^6+1)               x(0)=1 (x(n)を15倍して10^6+1で割ったあまりをx(n+1)とする。) で発生する数列x(n)を100万でわって0~1の乱数列が発生します。 これをヒストグラムで表したいのですが、いまいち分かりません。どうかよろしくお願いします。 内部関数を使ったものは簡単で n=10000; x=rand(1,n); hist(x); で1万個の乱数の分布がわかるのですが。 ばからしい質問ですいません。

  • コードの最適化について質問です。以下の2つのコードにおいて、最適化が可能なポイントを教えていただけませんか?

    *gccコンパイラを通します。 ///code1/// void filter_optimized(int width, int height, int numcol, int rw, int gw, int bw) { int x, y, z; for (z=0; z<numcol; z++) for (x=0; x<height; x++) for (y=0; y<width; y++) if (z==0) c[x][y][z] = bw*((bw*a[x][y][0]+gw*a[x][y][1]+rw*a[x][y][2])/(rw+gw+bw)); else if(z==1) c[x][y][z] = gw*((bw*a[x][y][0]+gw*a[x][y][1]+rw*a[x][y][2])/(rw+gw+bw)); else c[x][y][z] = rw*((bw*a[x][y][0]+gw*a[x][y][1]+rw*a[x][y][2])/(rw+gw+bw)); return; } ///code2/// void edge_optimized(int width, int height, int numcol) { int x, y, z; int tmp; for (y = 0; y < width; y++) for (x = 0; x < height; x++) for (z = 0; z < numcol; z++) b[x][y][z] = (a[x][y][0]+a[x][y][1]+a[x][y][2])/3; for (y = 0; y < width; y++) for (x = 0; x < height; x++) for (z = 0; z < numcol; z++) { tmp = computeGx(width, height, x, y, z, b); if (tmp < 0) tmp = -tmp; if (tmp > 255) tmp = 255; c[x][y][z] = tmp; tmp = computeGy(width, height, x, y, z, b); if (tmp < 0) tmp = -tmp; if (tmp + c[x][y][z] > 255) c[x][y][z] = 255; else c[x][y][z] += tmp; c[x][y][z] = 255 - c[x][y][z]; if ((x==0)||(y==0)||(x==height-1)||(y==width-1)) c[x][y][z] = 255; } return; }

  • エラーを探しきれません

    ビルドをすると表示されるエラー文です。(ファイルパス省略有) C:\…\Z\4.c(4) : error C2087: '<Unknown>' : 添字が不正です。 C:\…\Z\4.c(9) : error C2059: 構文エラー : ';' C:\…\Z\4.c(11) : error C2059: 構文エラー : ';' C:\…\Z\4.c(11) : error C2143: 構文エラー : ';' が ')' の前に必要です。 C:\…\Z\4.c(12) : error C2059: 構文エラー : ';' C:\…\Z\4.c(12) : error C2143: 構文エラー : ';' が ')' の前に必要です。 C:\…\Z\4.c(15) : error C2059: 構文エラー : '}' C:\…\Z\4.c(54) : error C2059: 構文エラー : '}' cl.exe の実行エラー 以下はエラーの多い最初から20行までのコピーです。 #include "params.h" /*ヒストグラムを画像化する(ただしLEVEL/HIST_X_SIZE=1または2の場合のみ)*/ histimage(hist,image_hist) long hist[LEVEL]; /*ヒストグラムLEVELは濃度レベル数(8bitでは256)*/ unsigned char image_hist[HIST_Y_SIZE][HIST_X_SIZE]; /*出力画像配列*/ { int i,j,k,max,ratio,range; long n; float d; ratio=LEVEL/HIST_X_SIZE; range=HIST_Y_SIZE-5; for(i=0;i<HIST_Y_SIZE;i++){ for(j=0;j<HIST_X_SIZE;j++){ image_hist[i][j]=LOW; } } switch(ratio){ case 1:max=0; for(i=0;i<LEVEL;i++){ n=hist[i]; if(n<max)max=n; } 確認しても";"や"}"のミスがないと思うのです。 半角、全角ミスをなくすために一度全部打ち直してもまったく同じエラーでした。 このソースは「C言語で学ぶ実践画像処理」のサンプルを写したものです。 vc++ で作業しています。 何かお気づきの点等ありましたら指摘お願いします。

  • IplImageのBmp変換。

    いつもこちらでお世話になっております。 現在OpenCVをつかって画像処理を行なっています。言語はVC++です。 OpenCVで処理した画像をPictureBoxに表示させたいのですが、 うまく表示できません。 IplImageをBmpに変換させる部分がおかしいとは思うのですが… //-------------------------------------------------------- IplImage *img; img = cvLoadImage(filename, 0); // 0: グレイスケールで読み込む cvThreshold(img,img, 70, 255, CV_THRESH_BINARY_INV);//二値化 // ビットマップ用のカラーバッファ char* ColorBuf = (char*)calloc( sizeof(char), img->width * img->height * 4 ); for( int y = 0; y < img->height; y++ ) { for( int x = 0; x < img->width; x++ ) { // Blue ColorBuf[ y * img->width + x * 4 + 0 ] = img->imageData[ y * img->widthStep + x * 3 + 0 ]; // Green ColorBuf[ y * img->width + x * 4 + 1 ] = img->imageData[ y * img->widthStep + x * 3 + 1 ]; // Red ColorBuf[ y * img->width + x * 4 + 2 ] = img->imageData[ y * img->widthStep + x * 3 + 2 ]; } } mbmp.CreateBitmap( img->width, img->height, 1, 32, ColorBuf ); free( ColorBuf ); ((CStatic*)GetDlgItem( IDC_IMGSRC ))->SetBitmap ( mbmp ); myDC.CreateCompatibleDC(pDC); CBitmap *oldBMP = myDC.SelectObject(&mbmp); pDC->BitBlt(0,0,300,300,&myDC,0,0,SRCCOPY); myDC.SelectObject(oldBMP); cvReleaseImage( &img ); //----------------------------------------------- PictureBoxのリソースIDをIDC_IMGSRCに設定しています。 今はPictureBoxの上部に画像が4つ並んでしまっている状態です。 なにか改善すべきところがありましたらよろしくお願いいたします。

  • ヒストグラム均等化処理プログラム

    どなたか以下のヒストグラム均等化処理プログラムを解説して頂けないでしょうか。特にgetMinMax関数とgetHistEqu関数で、何がしたいのか訳がわかりません。 以下のプログラムは、ヒストグラム均等化処理部分のみですが、分かる範囲でいいので、解説お願いします。 ------------------------------------------------------- // ヒストグラム均等化による画素値の割り当てを決定する // hist :入力画像のヒストグラム // min :割り当てられる画素値の最小 // max :割り当てられる画素値の最大 // たとえば,min[5]=4 max[5]=6の場合,画素値5には4-6の範囲に割り当てられる // pixs_min :最小値が割り当てられる画素数 // pixs_max :最大値が割り当てられる画素数 // ave :各画素値に割り当てられる画素数 //★★特にmin,max,pixs_min,pixs_maxの説明の意味が分からないのです。 int getMinMax(int *hist,int *min,int *max,int *pixs_min,int *pixs_max,int ave) { int i; int rest; int now; int pixels; int a,b; rest=0; now=0; for(i=0;i<256;i++) { pixels=rest+hist[i]; min[i]=now; if(rest>0) pixs_min[i]=ave-rest; else pixs_min[i]=ave+100; a=pixels/ave; rest=pixels%ave; max[i]=now+a; if(rest>0) pixs_max[i]=rest; else pixs_max[i]=ave+100; now+=a; } for(i=0;i<255;i++) { if(min[i]>255) min[i]=255; if(max[i]>255) max[i]=255; } max[255]=255; pixs_max[255]=ave*10; } // ヒストグラム均等化による画素値の決定 // 割り当てられる画素値の最小,最大の間で順番に割り当てていく // ただし,最小,最大については割り当てる画素数に制限がある int getHistEqu(int x,int *now,int *min,int *max,int *pix_min,int *pix_max) { int res; if(now[x]==max[x]) { if(pix_max[x]<=0) now[x]=min[x]; else pix_max[x]--; } if(now[x]==min[x]) { if(pix_min[x]<=0) now[x]=min[x]+1; else pix_min[x]--; } if(now[x]>max[x]) now[x]=min[x]; res=now[x]; now[x]++; return res; } int effect(ImageData *img,ImageData *outimg) { int x,y; int rr,gg,bb; int ro,go,bo; int i; int val; int ave; int histR[256],histG[256],histB[256]; // ヒストグラム int omaxR[256],omaxG[256],omaxB[256]; // 変換後,割り当てられる画素値の最小 int ominR[256],ominG[256],ominB[256]; // 変換後,割り当てられる画素値の最大 int pix_maxR[256],pix_maxG[256],pix_maxB[256]; // 最小値が割り当てられる画素数 int pix_minR[256],pix_minG[256],pix_minB[256]; // 最大値が割り当てられる画素数 int onowR[256],onowG[256],onowB[256]; // 次に割り当てる画素値 Pixel pix; for(i=0;i<256;i++) { histR[i]=histG[i]=histB[i]=0; } ave= img->height * img->width /256; // 画像の全画素数/画素値の範囲 // ヒストグラム作成 for(y=0;y<img->height;y++) { for(x=0;x<img->width;x++) { getPixel(img,x,y,&pix); //画像上の画素情報を取得 rr=pix.r; gg=pix.g; bb=pix.b; histR[rr]++; histG[gg]++; histB[bb]++; } } // 画素値の割り当て決定 getMinMax(histR,ominR,omaxR,pix_minR,pix_maxR,ave); getMinMax(histG,ominG,omaxG,pix_minG,pix_maxG,ave); getMinMax(histB,ominB,omaxB,pix_minB,pix_maxB,ave); for(i=0;i<256;i++) { onowR[i]=ominR[i]; onowG[i]=ominG[i]; onowB[i]=ominB[i]; } // ヒストグラム均等化処理 for(y=0;y<img->height;y++) { for(x=0;x<img->width;x++) { getPixel(img,x,y,&pix); //画像上の画素情報を取得 ro=pix.r; go=pix.g; bo=pix.b; rr=getHistEqu(ro,onowR,ominR,omaxR,pix_minR,pix_maxR); gg=getHistEqu(go,onowG,ominG,omaxG,pix_minG,pix_maxG); bb=getHistEqu(bo,onowB,ominB,omaxB,pix_minB,pix_maxB); pix.r=rr; pix.g=gg; pix.b=bb; setPixel(outimg,x,y,&pix); // 画像に値をセットする } } return 0; }

  • OpenCVを用いたヒストグラムの比較について

     現在画像の類似度を求めるために、OpenCV1.0を使って色のヒストグラムの距離を求めるということを行っております。OpenCVで公開されているヒストグラム間の距離のサンプルプログラムを使って行っているのですが、結果があまり芳しくないためいろいろ調べなおしたところ、減色処理、量子化というワードにたどり着きました。  しかし調べてみてもいまいち分からず、行き詰っているのが現状です。どなたか減色処理や量子化について詳しい人がおりましたら、是非回答のほうよろしくお願いします。以下がOpenCVのコードなのですが、どこの部分をどのように変えたらそれが実現できるのかも是非回答お願いいたします。 #include <cv.h> #include <highgui.h> #include <math.h> #include <stdio.h> int main (int argc, char **argv) { char text[16]; int i, hist_size = 256, sch = 0; float range_0[] = { 0, 256 }; float *ranges[] = { range_0 }; double tmp, dist = 0; IplImage *src_img1 = 0, *src_img2 = 0, *dst_img1[4] = { 0, 0, 0, 0 }, *dst_img2[4] = { 0, 0, 0, 0}; CvHistogram *hist1, *hist2; CvFont font; CvSize text_size; // (1)二枚の画像を読み込む.チャンネル数が等しくない場合は,終了 if (argc >= 3) { src_img1 = cvLoadImage (argv[1], CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); src_img2 = cvLoadImage (argv[2], CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); } if (src_img1 == 0 || src_img2 == 0) return -1; if (src_img1->nChannels != src_img2->nChannels) return -1; // (2)入力画像のチャンネル数分の画像領域を確保 sch = src_img1->nChannels; for (i = 0; i < sch; i++) { dst_img1[i] = cvCreateImage (cvSize (src_img1->width, src_img1->height), src_img1->depth, 1); dst_img2[i] = cvCreateImage (cvSize (src_img2->width, src_img2->height), src_img2->depth, 1); } // (3)ヒストグラム構造体を確保 hist1 = cvCreateHist (1, &hist_size, CV_HIST_ARRAY, ranges, 1); hist2 = cvCreateHist (1, &hist_size, CV_HIST_ARRAY, ranges, 1); // (4)入力画像がマルチチャンネルの場合,画像をチャンネル毎に分割 if (sch == 1) { cvCopy (src_img1, dst_img1[0], NULL); cvCopy (src_img2, dst_img2[0], NULL); } else { cvSplit (src_img1, dst_img1[0], dst_img1[1], dst_img1[2], dst_img1[3]); cvSplit (src_img2, dst_img2[0], dst_img2[1], dst_img2[2], dst_img2[3]); } // (5)ヒストグラムを計算,正規化して,距離を求める for (i = 0; i < sch; i++) { cvCalcHist (&dst_img1[i], hist1, 0, NULL); cvCalcHist (&dst_img2[i], hist2, 0, NULL); cvNormalizeHis