Незначительные различия изображений в программе обработки изображений

Я реализовал метод, который берет входное изображение и переворачивает его вокруг вертикальной линии через центр и сохраняет его в выходной файл изображения. То, что слева, становится справа, и наоборот. Изображение выглядит великолепно и выглядит так, как будто оно идеально перевернуто. Тем не менее, нам дан фактический перевернутый файл изображения, который должен выглядеть, и я использовал утилиту diff в терминале, чтобы сравнить их, и он утверждает, что действительно есть различия. Используя программу под названием Kaliedoscope, я смог выяснить разницу: есть несколько пикселей, которые по какой-то причине окрашены не так, как следовало бы. Не уверен, почему это так. Мой код даже не манипулирует значениями RGB.

4 ответа

Решение

В каком формате изображения вы сохранили? Если вы использовали сжатие с потерями, такое как JPEG, то цвета изображения всегда будут немного отличаться, так как они были повторно сжаты. Вы должны использовать формат без потерь, такой как PNG.

Вы также не должны использовать 'diff' для просмотра изображений. Я не знаю, что такое калейдоскоп, но утилита ImageMagick "сравнить" хороша для того, чтобы увидеть разницу между двумя изображениями. 'diff' почти всегда говорит вам, что между двумя изображениями есть разница, даже если они идентичны, и вы использовали формат без потерь, потому что при повторном сжатии он может использовать другую технику сжатия.

Кроме того, вы говорите, что получили файл перевернутого изображения (если это домашняя работа). В этом случае возможно, что человек, сгенерировавший этот файл, допустил ошибку (например, с использованием сжатия с потерями). Я бы не стал беспокоиться о незначительных пиксельных различиях в этом случае.

Измените свой код так, чтобы вы читали входное изображение в Image а затем записать его в выходной файл (без обращения) и сравнить входной файл с выходным файлом.

Если они не совпадают, то процесс file->Image->file портит данные (возможно, с пиксельным элементом неправильного размера, приводящим к округлению или использованию неинициализированной памяти) или компаратор (например, Kaleidoscope) неверен, и вы можете проверить, просто скопировав входной файл и сравнив.

Если они совпадают, то либо ваша процедура обращения неверна (что кажется маловероятным), либо справочный файл (который вывод "должен выглядеть как") неверен, и вы можете проверить, изменив код для чтения в справочном файле как ну, и сообщить о первом несогласии - то есть построить три Images, До (чтение из входного файла), После (который будет записан в выходной файл) и Ссылка (которая была прочитана из ссылочного файла), затем выполните итерацию по x и y, сравнивая После (x,y) с Ссылкой (х, у). Как только вы обнаружите несогласие, посмотрите, какое из них соответствует До (ширина-х-1, у); если Ссылка совпадает, тогда ваша процедура обращения неверна, а если После совпадения, то файл справки неверен (и вы можете указать на пиксель, который это подтверждает).

Кажется, что-то не так с вашим кодом.

Поскольку у вас есть эталонное изображение, вы можете указать точное положение пикселей, где есть разница. Я предлагаю вам пройтись по вашей программе с помощью отладчика (gdb, если вы пользователь Linux, или Visual Studio, если это то, что плавает в вашей лодке) и поместить точки останова во внутренний цикл вашего кода в проблемных местах. Используя эти точки останова, найдите первый пункт в программе, где проблема проявляется. Это поможет вам найти причину.

Работа с небольшими изображениями (то, что вы можете печатать в командной строке на каждой итерации, например, 8x8 пикселей) может сэкономить ваше время при отладке.

Это может быть хорошо, чтобы опубликовать изображения - ваш результат и ожидаемую ссылку.

Если ваша функция работает хорошо, она должна быть собственной обратной (как необходимое условие, хотя этого недостаточно, чтобы доказать правильность).

Проверить, если

a == flipleft(flipleft(a)) 

Что делать, если вы доверяете стороннему программному обеспечению для тестирования?

НТН!

редактировать

Также проверьте вертикальный центр изображения, чтобы быть уверенным, что когда число горизонтальных пикселей равно, вы меняете их в середине.

Другие вопросы по тегам