Преобразование 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;

}

0

Решение

это всегда будет 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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]