【问题标题】:C++ - Trying to read a .PPM image, unexpected outputC++ - 尝试读取 .PPM 图像,意外输出
【发布时间】:2015-12-13 00:37:15
【问题描述】:

我正在开发一个用于读取 P6 类型、255 深度 .ppm 图像的图像数据的 uni 项目。我遇到的问题是,当我尝试打印图像的每种颜色(R,G,B)的平均值时,我得到的输出是错误的(教授给了我们一个输出文件,其中说明了期望的浮点值对于每个给定的图像)。

现在,我在这里不知所措。通过多次检查,我得出结论,该函数从图像中读取整个数据,没有遗漏像素或其他任何内容,将它们从 0-255 正确转换为 0.f - 1.f 值(除以 255.0),添加每个红色,每个绿色和每个蓝色值到三个单独的计数器,然后将它们除以给定图像的宽度*高度,以获得每种颜色的所需平均亮度。我将提供执行此过程的部分函数来计算 960*642 图像的平均红色(对不起,硬编码的东西,它只是用于调试目的)。

我得到的输出是 0.58... 而它应该是 0.539068。 seekg() 以 14 作为参数调用,因为位置 14 是标题之后和数据之前的最后一个空格。您能否提供任何关于为什么这不能按预期工作的见解?我通过检查发现的一件事是添加所有红色浮点值后得到的总和,不是浮点数而是整数。可能丢失数据?我在这里抓住了稻草。

代码如下:

    std::ifstream infile;
    infile.open("Image02.ppm", std::ios::in | std::ios::binary);
    const unsigned char* buffer;
    float * data_ptr;

    infile.seekg(0, std::ios::end);
    int length = infile.tellg();  //calculating length of data

    buffer = new unsigned char[length];
    ptr = new unsigned char[length];
    data_ptr = new float[length];

    infile.seekg(14, std::ios::beg);  //restoring pointer to the start of data stream
    infile.read((char*)buffer, length);  //reading the image

    for (int i = 0; i < length; i++){     //casting the char data to floats to get the 0-255 values

        data_ptr[i] = ((float)buffer[i]);
        data_ptr[i] = data_ptr[i] / 255.f;  // converting to 0.0 - 1.0
    }

    int j = 0;
    float a = 0.f;
    while (j < length){   //calculating sum of red pixel values

        a = a + data_ptr[j];

        j = j + 3;
    }

    std::cout << a / (960*642);   //calculating average

仅供参考,P6 的 PPM 图像文件的图像数据从左到右存储,第一行是第 0 行,图像的最后一行是最后一行。它们的结构类似于 R G B R G B R G B 依此类推,其中第一个 RGB 对应于第一个像素,依此类推。

提前致谢!

【问题讨论】:

    标签: c++ image fstream ifstream ppm


    【解决方案1】:

    您只需要像素来进行平均计算。 但在您的源代码中,使用了额外的 14 个垃圾值。

    【讨论】:

    • 你在说什么14个垃圾值?你介意详细说明吗?我认为通过使用 seekg(14, ios::beg) 我给了流一个偏移量,所以它不会读取标题的值。
    • 编辑:我相信你在谈论给定的“长度”值。我从那个数字中减去了 14,但输出仍然是错误的。
    • 还是不行?也许还有另一个隐藏的问题。
    猜你喜欢
    • 2010-11-22
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    相关资源
    最近更新 更多