繁体   English   中英

C ++-尝试读取.PPM图像,输出意外

[英]C++ - Trying to read a .PPM image, unexpected output

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

现在,我在这里茫然。 经过多次检查,我得出的结论是该函数从图像中读取整个数据,而不会遗漏像素或其他任何东西,将其正确地从0-255转换为0.f-1.f值(除以255.0),然后将每个将红色,绿色和蓝色分别分配给三个独立的计数器,然后将它们除以给定图像的Width * Height,以获得所需的每种颜色的平均亮度。 我将提供执行此过程的功能的一部分,以计算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行,图像的最后一行是最后一行。 它们的结构类似于RGBRGBRGB等,其中第一个RGB对应于第一个像素,依此类推。

提前致谢!

您只需要像素即可进行平均计算。 但是在您的源代码中,正在使用其他14个垃圾值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM