我在某个论坛中找到了以下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中上述命令的一部分,仅用于获取上述"数字"?
有人想要测试,附上两张图片:
答案 0 :(得分:1)
我猜你要打电话
my $format = $iI->Fx( expression=>'mean*100' );
这应该与命令行上的内容完全相同。
有关PerlMagick中fx的详细文档,请参阅here
(页面上有一个示例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方法的整个文档;)
顺便说一句,我仍然使用的脚本基于Randall Schwartz's post答案 1 :(得分:0)
刚刚找到答案。
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'
];
e.g。平均3个数字,得到想要的数字:0.0419166122004357
use List::Util qw(sum)
my $s = sum @stat[3,10,17];
say $s/3;
来自文档:misc methods
Statistics()返回每个频道的图像统计信息 图片。返回的值是深度,最小值,最大值, 平均值,标准偏差,峰度,偏度和熵值 RGB,CMYK,RGBA或CMYKA顺序(取决于图像类型)。