Я разрабатываю проект UNI для чтения данных изображений P6-типа, 255-глубинных изображений .ppm. Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь распечатать средние значения каждого цвета (r, g, b) для изображения, вывод, который я получаю, неверен (профессор дал нам выходной файл, который говорит о том, какие значения поплавок ожидают для каждого данного изображения). < /p>
Теперь я здесь не могу. Благодаря многим проверкам я пришел к выводу, что функция считывает все данные из изображения, не оставляя пикселей или что -то еще, преобразует их с 0-255 до 0.f - 1.f значения (делясь с 255,0), добавляет каждый красный, каждый зеленый и каждое синее значение к трем отдельному счетчику и затем делят их на высоту. Я предоставлю часть функции, которая выполняет этот процесс для расчета среднего красного цвета для изображения 960*642 (извините за жесткие кодируемые вещи, он просто для целей отладки). < /P>
Вывод, который я получаю для этого, составляет 0,58 ... когда это должно быть 0,539068. seekg () называется 14 как аргумент, потому что позиция 14 является последним пространством после заголовка и перед данными. Не могли бы вы дать какое -либо представление о том, почему это не работает, как и ожидалось? Одна вещь, которую я нашел через чеки, - это сумма, которую я получаю после добавления всех значений Red Float, это не поплавок, а int. Возможная потеря данных? Я держу здесь соломинку. < /P>
Вот код: < /p>
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 = ((float)buffer);
data_ptr = data_ptr / 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
, к вашему сведению, файлы изображений PPM, которые являются P6, хранятся данные изображения слева направо, причем первая строка - линия 0, а последняя строка изображения - последняя. Они структурированы, как это R G B R G B R G B, так далее, где первый RGB соответствует первому пикселю и т. Д. < /p>
>
Подробнее здесь: https://stackoverflow.com/questions/342 ... ted-output