我在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);
答案 0 :(得分:0)
使用标量(在您的情况下为255
)调用Mat::convertTo()
时,每个矩阵项的值将乘以此标量值。这将导致所有大多数结果像素值超过255(即白色像素),除了它们保持为0的0(即黑色像素)。这就是为什么你最终会得到黑白像素。
要使其有效,只需将其更改为:
wshed.convertTo(img8bit, CV_32FC3);
答案 1 :(得分:0)
你说:
我要保存的原始图像是wshed。我看到了建议 从网络我们需要将其转换为16位或更高,以便 imwrite正确保存它。
如果保存图像不起作用,您应该记住,使用imwrite
功能时图像数据必须是8位或 16位无符号,而不是16 - 比特或更高。
imwrite函数将图像保存到指定的文件中。图片 格式是根据文件扩展名选择的(参见imread()) 扩展名单)。 只有8位(或16位无符号(CV_16U)) PNG,JPEG 2000和TIFF)单通道或3通道(带'BGR' 频道顺序)可以使用此功能保存图像。如果是格式, 深度或通道顺序不同,使用Mat :: convertTo()和 cvtColor()在保存之前转换它。或者,使用通用 FileStorage I / O函数将图像保存为XML或YAML格式。