Измерьте сходство двух изображений в Java или ImageMagick

1

У меня есть два разных алгоритма, которые принимают изображение в качестве входных данных. Изображение имеет многоугольники разных цветов. Алгоритм "упрощает" эти многоугольники (так что они имеют меньше углов и краев) и удаляет слишком малые многоугольники.

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

Эти два изображения

Изображение 174551, Изображение 174551

должны иметь сходство 50%, но согласно этому алгоритму их сходство составляет 80%.

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

  • 0
    Для этих изображений равны 100% синего и зеленого каналов, а 50% красного канала равны. Так что 80 (точнее 83)% равных имеет смысл? Может быть, не то, что вы искали, хотя ... ;-)
  • 0
    Я знаю, но мне нужен способ измерить сходство с точки зрения того, какие пиксели были сохранены, а какие были изменены
Теги:
imagemagick
similarity
compare
png

1 ответ

5
Лучший ответ

Вы бы использовали ImageMagick, чтобы сравнить ваши два изображения:

compare -metric ae a.png b.png null:
1161

или, более длинная форма с использованием convert

convert -metric ae a.png b.png -compare -format "%[distortion]" info:
1161

-metric ae означает "скажите мне абсолютную ошибку", то есть количество пикселей, которые отличаются между двумя изображениями. В этом случае ответ составляет 1161, что составляет ровно половину пикселей, то есть 50%.

Если вы специально хотите получить 50%, вы можете сделать математику по размерам изображений с помощью ImageMagick, как если бы вы использовали bash:

n=$(compare -metric ae a.png b.png null:)
identify -format "%[fx:$n*100/(w*h)]" a.png

или более длинную форму, используя convert:

n=$(compare -metric ae a.png b.png null:)
convert -format "%[fx:$n*100/(w*h)]" a.png info:
50

Если вы имеете дело с jpg изображениями (и, следовательно, с потерями сжатия и артефактами), а не с изображениями png, вам может потребоваться добавить коэффициент fudge factor в несколько процентов, используя параметр -fuzz чтобы позволить почти одинаковым пикселям считать одна и та же:

convert -fuzz 10% -metric ae ....

Если вам так жаль, что нужно использовать Windows, способ сделать это тайно и непонятно, но выглядит так:

@echo off
for /f "tokens=1,2,3,*" %%G in ('convert -metric ae a.png b.png -compare -format "%%w %%h %%[distortion]" info:') DO set /a percent=(%%I * 100) /(%%G * %%H)
echo %percent%
  • 0
    спасибо за ответ, выглядит очень многообещающе. Я не понимаю часть n = $, хотя .. Я использую приглашение Windows
  • 1
    n=$(...) означает, что переменная n tne устанавливается равной результату (т.е. выводу) выполнения команды в скобках. Итак, в вашем примере n получает значение 1161 . Это функция Unix bash - есть эквивалент Windows - я найду его для вас.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню