在OpenCV中将LDR转换为HDR



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

Mat ApplySunValue(Mat InputImg){

Mat OutPutImg = Mat::zeros(InputImg.rows, InputImg.cols, CV_32FC1);

for(int x = 0; x < OutPutImg.cols; x++){
for(int y = 0; y < OutPutImg.rows; y++){
int PixelValue = InputImg.at<uchar>(y,x)/255.f;
if(PixelValue < 0.9){
OutPutImg.at<uchar>(y,x) = 0;
}else{
OutPutImg.at<uchar>(y,x) = PixelValue * sunMultiplyer;
}
}
}
imwrite("/Users/K******/Desktop/EnviormentMap.jpg", OutPutImg * 255);
namedWindow("Hej", CV_WINDOW_AUTOSIZE);
imshow("Hej", OutPutImg * 255);

return OutPutImg;

}

这将始终为0(整数除法):

int PixelValue = InputImg.at<uchar>(y,x)/255.f;

PixelValue是整数,所以您的比较是BS:

if(PixelValue < 0.9){

正如@Micka已经发现的那样,你必须使用正确的at()类型:

OutPutImg.at<float>(y,x) = 299.0f; 
// yes, can be larger than 255 now, so you can discard your broken mapping attempts

您无法将浮点图像保存或读取为jpeg或png。检查您的opencv-lib是否使用exr支持构建:

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

如果是,您可以将其保存/读取为*.hdr或*.exr

相关内容

  • 没有找到相关文章