Percentage difference between images: Difference between revisions

→‎{{header|Perl}}: added an alternative solution using the Imager library
(Added Perl example)
(→‎{{header|Perl}}: added an alternative solution using the Imager library)
Line 1,092:
<lang perl>use Image::Imlib2;
 
my $img1 = Image::Imlib2->load('Lenna50.jpg') || die;
my $img2 = Image::Imlib2->load('Lenna100.jpg') || die;
 
my $w = $img1->width;
my $h = $img1->height;
 
my $sum = 0;
for $x (0..$w-1) {
 
for $y (0..$h-1) {
for my $x (0..$w-1) {
for my $y (0..$h-1) {
my ($r1, $g1, $b1) = $img1->query_pixel($x, $y);
my ($r2, $g2, $b2) = $img2->query_pixel($x, $y);
Line 1,106 ⟶ 1,108:
}
 
printf "%% difference = %.4f\n", 100 * $sum / ($w * $h * 3 * 255);</lang>
</lang>
{{out}}
<pre>% difference = 1.7747</pre>
 
Alternative solution:
<lang perl>use Imager;
use List::AllUtils qw(sum pairwise);
 
sub img_diff {
my ($file1, $file2) = @_;
 
my $img1 = Imager->new(file => $file1);
my $img2 = Imager->new(file => $file2);
 
my ($w1, $h1) = ($img1->getwidth, $img1->getheight);
my ($w2, $h2) = ($img2->getwidth, $img2->getheight);
 
if ($w1 != $w2 or $h1 != $h2) {
die "Can't compare images of different sizes";
}
 
my $sum = 0;
foreach my $y (0 .. $h1 - 1) {
foreach my $x (0 .. $w1 - 1) {
my @rgba1 = $img1->getpixel(x => $x, y => $y)->rgba;
my @rgba2 = $img2->getpixel(x => $x, y => $y)->rgba;
$sum += sum(pairwise { abs($a - $b) } @rgba1, @rgba2);
}
}
 
$sum / ($w1 * $h1 * 255 * 3);
}
 
printf "difference = %f%%\n", 100 * img_diff('Lenna50.jpg', 'Lenna100.jpg');</lang>
{{out}}
<pre>
difference = 1.625593%
</langpre>
 
=={{header|Perl 6}}==
2,747

edits