Преобразование LDR в HDR в OpenCV

Кажется, я не могу найти структуру данных в 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;

}

1 ответ

Решение

Это всегда будет 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 библиотеки созданы с поддержкой exr:

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

если это так, вы можете сохранить / прочитать его как *.hdr или *.exr

Другие вопросы по тегам