我似乎无法在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)
这将始终为0(整数除法):
int PixelValue = InputImg.at<uchar>(y,x)/255.f;
PixelValue是整数,因此您的比较是BS:
if(PixelValue < 0.9){
正如@Micka已经发现的那样,你必须在():
使用正确的类型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