Кажется, я не могу найти структуру данных в 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 созданы с поддержкой exr:
cerr << cv::getBuildInformation() << endl;
если это так, вы можете сохранить / прочитать его как * .hdr или * .exr
Других решений пока нет …