-1

我正在开发 VC++ 和 OpenCV 应用程序,我正在将图像加载到 picturBox 并对其进行一些 OpenCV 操作,我将加载的图像分配给 IplImage 以对其进行处理,然后将处理后的图像再次分配到图片框中,我编写此代码以将从 openFileDialog 选择的图像加载到 IplImage 中,对图像进行二值化,然后将二值化图像重新分配回 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 为一个字节(我们使用 Y 表示亮度,并假设图像为 640 像素宽)。

您已经告诉 .net 图像类这是 Format24bppRgb,它将存储为每个像素一个红色、一个绿色和蓝色字节(3 字节 = 24bpp)。因此,该类获取您的图像数据并假设 Y0、Y1、Y2 是第一个像素的红色、绿色、蓝色值,Y3、Y4、Y5 是下一个像素的值,依此类推。
这使用了图像所具有的 3 倍字节,因此在行的 1/3 之后它开始读取下一行,依此类推 - 这为您提供了三张重复的图片。

附言。您已将其转换为二进制图像这一事实仅意味着 Y 值为 0 或 255 - 它不会改变数据大小或形状。

于 2012-05-16T16:17:00.757 回答