opencv - 在 openCv 中写入像素值大于 1 的浮点图像

标签 opencv image-processing file-io floating-point hdrimages

我目前正在开发一个程序,该程序应该拍摄 LDR 图像并乘以图像中的某些像素,以便它们的像素值超过正常的 0-255 (0-1) 像素值边界。我编写的程序可以这样做,但我无法写入图像文件,因为 OpenCV 中的 imwrite() 会将值重新控制在 0-255 (0-1) 的范围内 如果它们大于 255。

有没有人知道如何写一个像素值大于255的浮点图像(1)

我的代码是这样的

Mat ApplySunValue(Mat InputImg)
{
 Mat Image1 = imread("/****/.jpg",CV_LOAD_IMAGE_COLOR);

Mat outPutImage;

Image1.convertTo(Image1, CV_32FC3);

for(int x = 0; x < InputImg.cols; x++){
    for(int y = 0; y < InputImg.rows; y++){

        float blue  = Image1.at<Vec3f>(y,x)[0] /255.0f;
        float green = Image1.at<Vec3f>(y,x)[1] /255.0f;
        float red = Image1.at<Vec3f>(y,x)[2] /255.0f ;

        Image1.at<Vec3f>(y,x)[0] = blue;
        Image1.at<Vec3f>(y,x)[1] = green;
        Image1.at<Vec3f>(y,x)[2] = red;

        int pixelValue = InputImg.at<uchar>(y,x);

        if(pixelValue > 254){


            Image1.at<Vec3f>(y,x)[0] = blue * SunMultiplyer;
            Image1.at<Vec3f>(y,x)[1] = green * SunMultiplyer;
            Image1.at<Vec3f>(y,x)[2] = red * SunMultiplyer;    
        }

    }

}

imwrite("/****/Nice.TIFF", Image1 * 255);

namedWindow("Hej",CV_WINDOW_AUTOSIZE);
imshow("hej", Image1);



return InputImg;
}

最佳答案

出于存储目的,以下内容比 XML/YAML 替代方案(由于使用二进制格式)的内存效率更高:

// Save the image data in binary format
std::ofstream os(<filepath>,std::ios::out|std::ios::trunc|std::ios::binary);
os << (int)image.rows << " " << (int)image.cols << " " << (int)image.type() << " ";
os.write((char*)image.data,image.step.p[0]*image.rows);
os.close();

然后您可以按如下方式加载图像:

// Load the image data from binary format
std::ifstream is(<filepath>,std::ios::in|std::ios::binary);
if(!is.is_open())
    return false;
int rows,cols,type;
is >> rows; is.ignore(1);
is >> cols; is.ignore(1);
is >> type; is.ignore(1);
cv::Mat image;
image.create(rows,cols,type);
is.read((char*)image.data,image.step.p[0]*image.rows);
is.close();

例如,在不压缩的情况下,一张 1920x1200 浮点三 channel 图像以二进制格式存储时需要 26 MB,而以 YML 格式存储时需要 129 MB。这种大小差异也会对运行时间产生影响,因为对硬盘驱动器的访问次数非常不同。

现在,如果您想要可视化 HDR 图像,您别无选择,只能将其转换为 LDR。这称为“色调映射”(Wikipedia entry)。

关于opencv - 在 openCv 中写入像素值大于 1 的浮点图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22688117/

相关文章:

matlab - 中心裁剪或填充帧内的图像

Python:从列表创建字典并自动生成/增加键(列表是实际键值)?

java - 改进解析文本文件的代码

c++ - 如何创建带有更改编号的文件名

objective-c - 使用 OpenCV 在 iOS 中进行透视变换 + 裁剪

qt - 视频无法连续播放

image-processing - 如何在 OpenCV 中锐化图像?

r - 将位向量写入R中最小大小的文件中

python - 如何检测身份证上的全息图覆盖层?

python - 我对 openCV 卡尔曼滤波器的使用很接近,但没有用