我正在开发一个用于读取P6型,255深度.ppm图像的图像数据的uni项目 . 我遇到的问题是,当我尝试打印图像的每种颜色(R,G,B)的平均值时,我得到的输出是错误的(proffessor给了我们一个输出文件,说明了期望的浮点值)对于每个给定的图像) .
现在,我在这里不知所措 . 通过许多检查,我得出结论,该函数从图像中读取整个数据,而不会遗漏像素或其他任何东西,将它们正确地从0-255转换为0.f - 1.f值(通过除以255.0),添加每个红色,每个绿色和每个蓝色值到三个单独的计数器,然后将它们除以给定图像的宽度*高度,以获得每种颜色的所需平均亮度 . 我将提供执行此过程的部分功能,用于计算960 * 642图像的平均红色(对于硬编码的内容感到遗憾,它仅用于调试目的) .
我得到的输出是0.58 ......当它应该是0.539068 . seekg()以14作为参数调用,因为位置14是 Headers 之后和数据之前的最后一个空格 . 你能否提供一些有关为什么这不能按预期工作的见解?我通过检查找到的一件事是在添加所有红色浮点值后得到的总和,不是浮点数而是int值 . 可能丢失数据?我在这里 grab 稻草 .
这是代码:
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
FYI,P6的PPM图像文件的图像数据从左到右存储,第一行是第0行,图像的最后一行是最后一行 . 它们的结构类似于R G B R G B R G B,其中第一个RGB对应于第一个像素,依此类推 .
提前致谢!
1 回答
您只需要像素进行平均计算 . 但是在源代码中,正在使用额外的14个垃圾值 .