在像素值大于1的openCv中写入浮动图像

我目前正在研究一个程序,该程序应该采用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浮点三通道图像占用26 MB,而以YML格式存储时占用129 MB。 由于对硬盘的访问次数非常不同,因此此大小差异也会对运行时间产生影响。

现在,如果你想要的是可视化你的HDR图像,你别无选择,只能将其转换为LDR。 这被称为“音调映射”(维基百科条目)。


据我所知,当opencv使用imwrite写入时,它会以图像容器支持的格式写入,默认情况下这是255.但是,如果您只想保存数据,则可以考虑将Mat对象写入xml / yaml文件。

//Writing
cv::FileStorage fs;
fs.open(filename, cv::FileStorage::WRITE);
fs<<"Nice"<<Image1;

//Reading
fs.open(filename, cv::FileStorage::READ);
fs["Nice"]>>Image1;

fs.release(); //Very Important
链接地址: http://www.djcxy.com/p/89815.html

上一篇: Writing a float image in openCv with pixel values bigger than 1

下一篇: How to read a tif image with transparent pixels in opencv