0

我用 C API 写了一个分水岭分割的代码。现在我将所有这些转换为 C++。所以,cvsaveimage 变成了 imwrite。但是当我使用 imwrite 时,我得到的只是一个黑色图像。

这是代码:-

Mat img8bit;
Mat img0;
img0 = imread("source.png", 1);           
Mat wshed(img0.size(), CV_32S);
wshed.setTo(cv::Scalar::all(0));
////after performing watershed segmentation and
        // displaying the watershed image from wshed//
wshed.convertTo(img8bit, CV_32FC3, 255.0);
imwrite("Watershed.png", img8bit);

我要保存的原始图像在 wshed 中。我从网上看到建议我们需要将其转换为 16 位或更高位,以便 imwrite 正确保存它。如你所见,我试过了。但是使用 imshow 时 wshed 图像可以正确显示。img0 是灰色图像/黑白,而 wshed 图像是彩色的。有什么帮助吗?

编辑-我将第 4 行更改为

Mat wshed(img0.size(), CV_32FC3);
4

2 回答 2

0

你说:

我要保存的原始图像在 wshed 中。我从网上看到建议我们需要将其转换为 16 位或更高位,以便 imwrite 正确保存它。

如果保存图像不起作用,您应该记住,使用函数时 图像数据必须是 8 位或16 位无符号imwrite,而不是 16 位或更高。

这在文档中有所说明:

函数 imwrite 将图像保存到指定文件。图像格式是根据文件扩展名选择的(有关扩展名列表,请参见 imread())。使用此功能只能保存 8 位(或 16 位无符号 (CV_16U),对于 PNG、JPEG 2000 和 TIFF)单通道或 3 通道(具有“BGR”通道顺序)图像。如果格式、深度或通道顺序不同,请在保存前使用 Mat::convertTo() 和 cvtColor() 进行转换。或者,使用通用 FileStorage I/O 函数将图像保存为 XML 或 YAML 格式。

于 2016-01-22T07:05:50.863 回答
0

Mat::convertTo()使用标量(在您的情况下)调用时255,每个矩阵项的值都将乘以该标量值。这将导致所有大多数结果像素值都超过 255(即白色像素),除了那些保持为 0 的 0(即黑色像素)。这就是为什么你最终会得到黑白像素的原因。

要使其工作,只需将其更改为:

wshed.convertTo(img8bit, CV_32FC3);
于 2016-01-14T12:05:48.017 回答