C++ 在OpenCV中将LDR转换为HDR

C++ 在OpenCV中将LDR转换为HDR,c++,opencv,hdrimages,C++,Opencv,Hdrimages,在opencv中,我似乎找不到一个能容纳大于8位像素深度的数据结构。我的问题是,我想采取一个LDR图像和乘以一些像素,使这些像素的值将超过255边界。这就是我迄今为止所尝试的。我尝试从0-1(而不是0-255)映射像素值,然后将它们与标量相乘(以增加它们的值)。但是当我需要再次写入图像时,图像是暗的,除非我乘以255。我希望你能帮助我:) Mat ApplySunValue(Mat InputImg){ Mat OutPutImg=Mat::零(InputImg.rows,InputImg.co

在opencv中,我似乎找不到一个能容纳大于8位像素深度的数据结构。我的问题是,我想采取一个LDR图像和乘以一些像素,使这些像素的值将超过255边界。这就是我迄今为止所尝试的。我尝试从0-1(而不是0-255)映射像素值,然后将它们与标量相乘(以增加它们的值)。但是当我需要再次写入图像时,图像是暗的,除非我乘以255。我希望你能帮助我:)

Mat ApplySunValue(Mat InputImg){
Mat OutPutImg=Mat::零(InputImg.rows,InputImg.cols,CV_32FC1);
对于(int x=0;x
}这将始终为0(整数除法):

int PixelValue=InputImg.at(y,x)/255.f;
PixelValue为整数,因此您的比较为BS:

if(PixelValue < 0.9){
if(像素值<0.9){
正如@Mika已经发现的,您必须为at()使用正确的类型:

(y,x)处的输出=299.0f; //是的,现在可以大于255,因此您可以放弃中断的映射尝试
无法将浮点图像保存或读取为jpeg或png格式。请检查您的opencv库是否使用exr支持构建:

cerr << cv::getBuildInformation() << endl;

cerr您的问题可能是您试图以
uchar
的形式访问
OutputImg
,但您的图像是
cv32fc1
类型。请尝试
OutputImg.at(y,x)=PixelValue*sunMultiplyer;
。请注意,浮点图像显示仅使用0到1之间的值,因为它在内部乘以255,所以
imshow(“Hej”,OutPutImg*255);
可能会更改为不缩放那里的图像。
if(PixelValue < 0.9){
OutPutImg.at<float>(y,x) = 299.0f; 
// yes, can be larger than 255 now, so you can discard your broken mapping attempts
cerr << cv::getBuildInformation() << endl;