-1

私は VC++ および OpenCV アプリケーションで作業しています。画像を picturBox にロードし、それらに対していくつかの OpenCV 操作を行っています。ロードした画像を IplImage に割り当てて処理を行いますが、処理された画像を画像ボックスに再度割り当てます。このコードを記述して、openFileDialog から選択した画像を IplImage にロードし、画像を 2 値化してから、2 値化された画像を pictureBox コードに再割り当てします。

const char* fileName = (const char*)(void*)
   Marshal::StringToHGlobalAnsi(openFileDialog1->FileName);
             IplImage *img=cvLoadImage(fileName,CV_LOAD_IMAGE_COLOR);
             int width=img->width;
             int height=img->height;
             IplImage *grayScaledImage=cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);
             cvCvtColor(img,grayScaledImage,CV_RGB2GRAY);
cvThreshold(grayScaledImage,grayScaledImage,128,256,CV_THRESH_BINARY);
this->pictureBox1->Image=(gcnew 
System::Drawing::Bitmap(grayScaledImage->width,grayScaledImage->height,grayScaledImage->widthStep, 
System::Drawing::Imaging::PixelFormat::Format24bppRgb,(System::IntPtr)grayScaledImage->imageData));

しかし、バイナリ イメージを表示する形式が見つかりません。それに関するヘルプはありません。

元の画像: ここに画像の説明を入力

変換後の画像: ここに画像の説明を入力

4

1 に答える 1

1

RGB イメージ (System::Drawing::Imaging::PixelFormat::Format24bppRgb) を作成しているようですが、グレースケールにコピーすると、おそらく System::Drawing::Imaging 関数は変換を行わないか、変換を行いません。適切にやっています。

編集:もう少し説明。
グレースケール画像は、各ピクセル Y0、Y1、Y2、Y3... Y639 に対して 1 バイトとしてメモリに格納されます (輝度には Y を使用し、640 ピクセル幅の画像を想定しています)。

これは Format24bppRgb であり、ピクセルごとに 1 つの赤、1 つの緑、および青のバイト (3 バイト = 24bpp) として格納されることを .net 画像クラスに通知しました。したがって、クラスは画像データを取得し、Y0、Y1、Y2 が最初のピクセルの赤、緑、青の値であり、次のピクセルの Y3、Y4、Y5 などであると想定します。
これは画像の 3 倍のバイト数を使用しているため、行の 1/3 の後に次の行の読み取りを開始し、3 つの画像が繰り返されます。

ps。バイナリ イメージに変換したという事実は、Y 値が 0 または 255 であることを意味します。データ サイズや形状は変更されません。

于 2012-05-16T16:17:00.757 に答える