Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中保存浮点*图像+;_C++_Serialization_Floating Point_Cimg - Fatal编程技术网

C++ 在C+中保存浮点*图像+;

C++ 在C+中保存浮点*图像+;,c++,serialization,floating-point,cimg,C++,Serialization,Floating Point,Cimg,我想了解如何保存类型为float的图像: float * image; 以这种方式分配: int size = width * height; image = (float *)malloc(size * sizeof(float)); 我尝试使用CImg库,但不直接接受浮点。事实上,我只使用它来捕获浮动图像,因为我只需要浮动图像 CImg<float> image("image.jpg"); int width = image.width(); int height = im

我想了解如何保存类型为
float
的图像:

float * image;
以这种方式分配:

int size = width * height;
image = (float *)malloc(size * sizeof(float));
我尝试使用CImg库,但不直接接受浮点。事实上,我只使用它来捕获浮动图像,因为我只需要浮动图像

CImg<float> image("image.jpg");
int width = image.width(); 
int height = image.height();
int size = width*height
float * image = image.data();
cimgimage(“image.jpg”);
int width=image.width();
int height=image.height();
整数大小=宽度*高度
float*image=image.data();

如何从
.jpg
.bmp
将此图片保存到
float
。我想打开一个写缓冲区,但不保存任何内容,我无法读取文件

嗯,你需要的是首先意识到你要做什么。 您正在创建指向浮点数组的指针

image=(float *)malloc(size* sizeof(float));
然后你在做什么

float * image =image.data();
这是双重使用
image
,这将导致编译器错误,如果可以的话,这也是一件坏事

现在您应该阅读
CImg
并看到
Data()
返回指向图像第一个像素的指针

现在我们已经建立了所有这些,让我们进入解决方案: 如果要将浮点数组保存到文件,请使用此示例

#include <fstream.h>

void saveArray(float* array, int length);

int main()
{
    float image[] = { 15.25, 15.2516, 84.168, 84356};
    saveArray(floatArray, sizeof(image)/ sizeof(image[0]));

    return 0;
}

void saveArray(float* array, int length)
{
    ofstream output("output.txt");

    for(int i=0;i<length;i++)
    {
        output<<array[i]<<endl;
    }
}
#包括
void saveArray(浮点*数组,整数长度);
int main()
{
浮动图像[]={15.25,15.2516,84.168,84356};
saveArray(floatArray,sizeof(image)/sizeof(image[0]);
返回0;
}
void saveArray(浮点*数组,整数长度)
{
流输出(“output.txt”);

对于(int i=0;i,因为JPEG图像格式只支持8位颜色分量(实际上标准允许12位,但我已经看到了它的实现),您不能用JPEG实现这一点

您可以使用.bmp文件执行此操作。请参阅my,其中提供了一种使用库执行此操作的可能方法。对于其他库,使用.bmp文件可能很容易,因为OpenCV采用8位颜色通道,尽管我知道,.bmp格式并不规定这一点

你需要压缩吗?如果不只是写一个二进制文件,或者以yml格式存储文件,等等


如果你需要压缩,可以考虑选择。因为它与CIMG很好地结合在一起,可能是最好的实现方式。既然CIMG不自给自足。JPG,我怀疑你可能已经有图像Migk了。

< P>我可以从你的代码中看到你只使用32位浮标灰度(没有R,G,B I)。 以下是我的建议:

  • 辐射率RGBE(.hdr) 对R、G、B和1x8bit指数使用3x8bit mantisa,它只提供16位精度。 但是,如果同时使用R、G、B,而不是出于模拟目的,则此格式对您来说是不可更改的。(由于所有通道的指数都相同,因此精度降低了很多)

  • 任何HDR格式都不是本机格式,因此您需要安装查看器,并且必须为源代码或libs的使用编写读/写函数

  • 非HDR格式(bmp、jpg、tga、png、pcx…) 如果只使用灰度,则这是最适合您的解决方案。这些格式通常为每个通道8位,因此您可以将24-32位用于单个强度。此外,您还可以在大多数操作系统上以本机方式查看/编辑这些图像。有两种方法可以做到这一点

    • 对于32位图像,您可以简单地将float复制到color=((DWORD*)(&col))[0];其中col是您的浮点像素。这是最简单的,没有精度损失,但如果您查看图像,它将不漂亮:),因为float的存储方式与整数类型不同

    • 使用调色板。从像素颜色的最小值到最大值(保存的颜色越多,精度越高)创建色阶调色板。然后将整个图像绑定到此值。在此之后,将浮点值转换为调色板中的索引,并将其存储(用于保存)和反向从调色板中的索引获取浮点值(用于加载)通过这种方式,图片将类似于热图像……从浮点值到索引/RGB颜色的转换可以线性(精度较低)或非线性(通过exp、log函数或任何您想要的非线性)完成在最好的情况下,如果您使用24位像素,所有2^24颜色都有缩放调色板,并且您使用非线性转换,那么您仅损失25%的精度(如果您确实使用整个浮动动态范围,如果不超过,则损失更小,甚至降到零)

  • 缩放提示:

    • 看看光谱颜色,这是一个很好的开始颜色比例(有许多简单的源代码,创建一些fors只是谷歌),你也可以使用任何颜色渐变模式

    • 非线性函数应该在需要保持精度的浮动范围(大多数像素可以保持的范围)上变化较小,在精度不重要的地方变化较大(+/-NaN)。我通常使用exp、ln或tan,但必须将它们缩放到色阶调色板的范围


      • BMP文件格式非常简单:

        读取标题以确定高度、宽度、bpp和数据开始索引。然后通过将像素通道值强制转换为浮动(从标题中指定的索引开始)开始填充浮动数组,穿过宽度。当达到指定的宽度时,转到数组中的下一行


        JPG解码更为复杂。我建议不要尝试自己进行解码。

        如果要保存浮点值,需要使用支持它们的格式-不是JPEG,也不是BMP。最可能的选项是:

        • TIFF-需要一个库来编写

        • FITS-主要用于天文数据,不太难编写

        • PFM(便携式浮点格式),这是一种最小公分母格式,与所描述的相同

        好消息是CImg支持
        PFM
        开箱即用,不需要额外的库。因此,您的问题的答案非常简单:

        #include "CImg.h"
        using namespace cimg_library;
        int main() {
           CImg<float> image("image.png");
           image.normalize(0.0,1.0);
           image.save_pfm("result.pfm");
        }
        
        <> >强>关键词>:CImg、C++、C、浮点、浮点、图像、图像
        convert result.pfm image.jpg       # convert PFM to JPG
        convert result.pfm image.png       # convert PFM to PNG
        convert result.tif image.bmp       # convert TIF to BMP