0

我似乎无法在 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;

}

4

1 回答 1

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

于 2014-03-05T10:15:15.350 回答