3

我使用 OpenCV 读取图像。然后我使用 Matlab 加载相同的图像。然后我显示图像。对于 OpenCV 加载的图像,图像内部没有图片,只有灰色平面。对于 Matlab 加载的图像,它具有我想要的图像。图像像素值是非常小的浮点数据,例如 0.0021。我用来加载图像的代码如下所示。

`Mat image(IMAGE_ROW, IMAGE_COL, CV_64FC3);
Mat  gray(IMAGE_ROW, IMAGE_COL, CV_64FC1);
image = imread(filespath, CV_LOAD_IMAGE_COLOR );// Read the file
cv::imshow("Image", image);
cvtColor( image, gray, CV_BGR2GRAY, 1);
cv::imshow("gray", gray);`

为什么我不能拥有与 Matlab 加载的图像相同的图像?

4

4 回答 4

8

如前所述,您不能使用 imwrite()/imread() 来做到这一点。

但您可以使用 FileStorage 保存/加载浮点 Mats,如下所示:

Mat fm = Mat::ones(3,3,CV_32FC3); // dummy data

FileStorage fs("my.yml", FileStorage::WRITE );
fs << "mat1" << fm;  //choose any key here, just be consistant with the one below

并回读:

Mat fm;
FileStorage fs("my.yml", FileStorage::READ );
fs["mat1"] >> fm;
于 2013-03-08T09:26:39.667 回答
2

cv::Mat调用前不需要显式初始化图像cv::imread,它会根据读取的图像大小和格式正确初始化图像。所以你用 . 初始化你的图像并不重要(IMAGE_ROW, IMAGE_COL, CV_64FC3)

OpenCV 没有写入/读取浮点图像的能力。来自cv::imwrite手册:

使用此功能只能保存 8 位(或在 PNG、JPEG 2000 和 TIFF 的情况下为 16 位)单通道或 3 通道(具有“BGR”通道顺序)图像。

于 2013-03-08T08:16:01.427 回答
1

您可以使用 opencv 加载浮动图像Mat img= imread(filename, CV_LOAD_IMAGE_ANYDEPTH);

于 2016-01-25T09:12:19.010 回答
0

尝试了@berak 解决方案,但出现“Missing , between elements”异常。如错误报告所述,您必须在写入操作后释放 FileStorage 对象,否则将无法正确完成文件写入并因此引发该异常。那么,codelet 的更正版本应该是:

Mat fm = Mat::ones(3,3,CV_32FC3); // dummy data
FileStorage fs("my.yml", FileStorage::WRITE );
fs << "mat1" << fm;  //choose any key here, just be consistant with the one below
fs.release(); //Release the file and finish the writing.
于 2015-07-01T14:15:27.637 回答