如何在OpenCV中将16位图像转换为32位图像?

4

我是OpenCV的新手。我的程序读取16位无符号整数的图像数据。我需要将图像数据乘以某个16位无符号整数的增益。因此,生成的数据应该保存在32位图像文件中。但我尝试了以下方法,但只得到一个全白色的8位图像。请帮忙解决。

    Mat inputData = Mat(Size(width, height), CV_16U, inputdata); 
    inputData.convertTo(input1Data, CV_32F);
    input1Data = input1Data * gain;//gain is ushort

你如何显示图像?imshow假定浮点/双精度值在0(黑色)和1(白色)之间,因此可能只需将您的值带入该范围,例如cv :: imshow(“test”,input1Data / 65000.0f)或除以适合您值的另一个值 ;) - Micka
@Micka,谢谢你的回答。你能否请检查我添加的附加信息。我非常感激你的帮助。 - Main
1个回答

4

如Micka在评论中所指出的,首先我们需要通过传递缩放因子将inputData的值缩放到0.0f和1.0f之间:

inputData.convertTo(input1Data, CV_32F, 1.0/65535.0f); // since in inputData 
                                                       // we have values between 0 and 
                                                       // 65535 so all resulted values 
                                                       // will be between 0.0f and 1.0f

现在,同样的方式进行乘法计算:

input1Data = input1Data * gain * (1.0f / 65535.0f); // gain, of course, will be
                                                    // automatically cast to float
                                                    // therefore the resulted factor 
                                                    // will have value from 0 to 1, 
                                                    // so input1Data too!

我认为这个也应该编译通过:

input1Data *= gain * (1.0f / 65535.0f);

优化第一版,避免创建临时数据。

感谢您的回答。我对原始代码进行了更改。如果将CV_32F替换为CV_32S,input1Data仍然可以容纳结果为32位数据吗?因为我不需要浮点图像。我需要32位无符号图像(因为增益和输入数据是ushort,16位无符号),但根据我的研究,似乎无法获得32位无符号图像。这让我很困扰。在增益乘法之后,我仍然需要将32位图像转换回16位无符号图像(ushort)。请帮忙。再次感谢您的帮助。 - Main
1
如果速度不是问题的话,您可以使用32位浮点格式计算所有内容,并在保存/显示之前将其转换回16位整数。 - Micka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接