Команда ImageMagick для Image::Magick code

Я нашел следующую команду ImageMagick на каком-то форуме и отлично подходит для сравнения изображений.

convert image1 image2 -compose Difference -composite  -format '%[fx:mean*100]' info:

В результате получается одно число с плавающей запятой, а низкие значения (например, 0,5 и т. Д.) Означают: изображения похожи.

Используя прикрепленные изображения, получается число: 0.0419167, (изображения очень похожи)

Я хочу использовать Image::Magick (perlmagick). Проблема в том, что я не знаю, как добиться того же результата с помощью Perlmagick. Следующее работает, и создает composite(черное изображение с использованием прикрепленных изображений)

#!/usr/bin/env perl
use 5.014;
use strict;
use warnings;
use Data::Dumper;
use Image::Magick;

my $i1 = Image::Magick->new;
$i1->Read('s1.jpg');
my $i2 = Image::Magick->new;
$i2->Read('s2.jpg');

$i1->Composite(image => $i2, compose=>'Difference');
$i1->Display();

Вопрос в том, как преобразовать результат в число, например, как достичь

    ... -format '%[fx:mean*100]' info:

часть вышеуказанной команды в PerlMagick для получения только указанного выше "числа"?

Кто-то хочет проверить, прикрепив два изображения:

2 ответа

Решение

Я предполагаю, что вы хотите позвонить

my $format = $iI->Fx( expression=>'mean*100' );

Это должно сделать то же самое, что и в командной строке.

смотрите здесь для более подробной документации FX в PerlMagick

(на странице есть пример строки fx)

На той же странице: поиск по @statistics.

Мне кажется, что среднее доступно через

my @stats = $i1->Statistics;
my $mean = $stats[3]; # hash would be nice, mean is 4th according to docs
print "$mean\n"; # outputs something like .0413 for me

Не уверен, что это то, что вам нужно, но именно так я нашел "среднее", то, что именно это означает "fx", я не уверен и, честно говоря, не желаю понимать весь документ по методу "fx";)

Кстати, сценарий, который у меня был до сих пор, основан на посте Рэндалла Шварца

Просто нашел ответ.

Image::Magick имеет Statistics метод, так называемый:

my @stat = $i1->Statistics();
say Dumper \@stat

печатает статистику изображения для каждого канала, например:

$VAR1 = [
      '8',
      '0',
      '0.168627450980392',
      '0.0418661437908497',    <--- mean RED
      '0.0236850206077085',
      '-0.250788990333716',
      '0.312238727773058',
      '8',
      '0',
      '0.133333333333333',
      '0.0385273202614379',     <- mean GREEN
      '0.0193189321997568',
      '-0.435325792918546',
      '0.0686645009183608',
      '8',
      '0',
      '0.23921568627451',
      '0.0453563725490196',     <- mean BLUE
      '0.0301331898766906',
      '0.309072091600589',
      '0.66336367830764'
    ];

например, усредняя 3 числа, получил желаемое число: 0.0419166122004357

use List::Util qw(sum)
my $s = sum @stat[3,10,17];
say $s/3;

Из документов: разные методы

Статистика () возвращает статистику изображения для каждого канала в изображении. Возвращаемые значения представляют собой массив значений глубины, минимумов, максимумов, среднего, стандартного отклонения, эксцесса, асимметрии и энтропии в порядке RGB, CMYK, RGBA или CMYKA (в зависимости от типа изображения).

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