Незначительные различия изображений в программе обработки изображений - PullRequest
1 голос
/ 28 января 2011

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

Ответы [ 4 ]

1 голос
/ 28 января 2011

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

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

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

0 голосов
/ 28 января 2011

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

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

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

0 голосов
/ 28 января 2011

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

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

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

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

0 голосов
/ 28 января 2011

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

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

a == flipleft(flipleft(a)) 

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

НТН!

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...