Мой скрипт выше не может отображать правильную цветовую гистограмму, потому что, если вы думаете рационально, вы можете получить цвет пикселя выше 100 (не только ниже 100).Итак, главный вопрос: как решить эту проблему?
Я предполагаю, что вы имеете в виду:
В настоящий момент при запуске этой программы на связанном изображении отображается только- ноль записей гистограммы для значений пикселей ниже 100. Мне известно хотя бы одно значение пикселей на изображении выше 100, поэтому в моем коде есть ошибка.Может кто-нибудь помочь мне выяснить, почему это происходит?
Я предлагаю вам перефразировать ваш вопрос, чтобы прояснить это.
Код выглядит внешне хорошо, если вы только хотите, чтобы онработать над изображением, с которым вы связаны.Тем не менее, есть много мелких ошибок, которые могут сложиться.Вот несколько советов:
Размер гистограммы
Во-первых, вы не можете распечатать всю свою гистограмму.Рассмотрите возможность передачи размера гистограммы функции, которая печатает гистограмму.Более того, даже если размеры совпадают (оба 256), у вас все равно будет ошибка.Вы никогда не печатаете 256-е значение.
int histo[65536];
// ...
print_histogram_table(histo);
// ...
void print_histogram_table(int *histog)
{
int x;
for (x= 0; x < 255; x++) {
if ( histog[x] != 0)
printf("Color number %d count %d\n", x, histog[x]);
}
Двоичный ввод / вывод
При открытии двоичных файлов необходимо указывать «двоичный» ввод / вывод.В UNIX это традиционно не имеет значения, потому что это режим по умолчанию.Однако в Windows (я предполагаю, что вы используете Windows, так как вы используете Irfan View), вам нужно явно указать, что вы хотите двоичный ввод / вывод.
Это распространенная ошибка при работе с двоичными файламив первый раз.По сути, как только вызов fread()
перехватывает байт EOF
, он прекратит чтение файла и вы получите значения мусора для всех последующих операций чтения (возможно, копий последнего действительного байта), чтоозначает, что вы на самом деле не читаете все свое изображение.
fp = fopen(READ_IMAGE_NAME,"r");
// change to:
fp = fopen(READ_IMAGE_NAME,"rb");
Другие незначительные проблемы
Существует множество вещей, которые не обрабатываются вашим кодом:
- PNMфайлы могут иметь комментарии в начале файла
- Строки могут содержать более 100 символов.
- Размер изображения не является принудительным 1024x768
- Это не слишком полезно для жесткого кодирования именифайла в программе, даже для простого тестирования вашего кода.
- Если вы на самом деле получаете изображение в градациях серого 16 бит на пиксель, ваша гистограмма достаточно велика, но вы должны читать 2-байтовые значения.