Я разрабатываю проект 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
C ++ - Попытка прочитать изображение .ppm, неожиданный вывод ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1754005162
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[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
, к вашему сведению, файлы изображений PPM, которые являются P6, хранятся данные изображения слева направо, причем первая строка - линия 0, а последняя строка изображения - последняя. Они структурированы, как это R G B R G B R G B, так далее, где первый RGB соответствует первому пикселю и т. Д. < /p>
>
Подробнее здесь: [url]https://stackoverflow.com/questions/34246708/c-trying-to-read-a-ppm-image-unexpected-output[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия