C ++ - Попытка прочитать изображение .ppm, неожиданный выводC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 C ++ - Попытка прочитать изображение .ppm, неожиданный вывод

Сообщение Anonymous »

Я разрабатываю проект 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»