Percentage difference between images: Difference between revisions

Line 1,168:
Total bytes: 786432
Difference: 1.619%
</pre>
 
=={{header|zkl}}==
Uses the PPM class from http://rosettacode.org/wiki/Bitmap/Bresenham%27s_line_algorithm#zkl
<lang zkl>fcn imageDiff(img1,img2){
if(img1.w!=img2.w or img1.h!=img2.h)
throw(Exception.ValueError("width/height of the images must match!"));
Utils.Helpers.zipW(img1.data.howza(0),img2.data.howza(0)) // bytes, not strings
.reduce(fcn(totalDiff,[(a,b)]){ totalDiff += (a - b).abs() },0)
.toFloat()/img1.w/img1.h/3/255;
}</lang>
Take the bytes in each image, zip them together [lazily], sums the differences between each byte and normalizes.
<lang zkl>fcn readJPG2PPM(fileName){
p:=System.popen("convert \"%s\" ppm:-".fmt(fileName),"r");
img:=PPM.readPPM(p);
p.close();
img
}</lang>
Use the convert utility from ImageMagick to convert a JPEG image to PPM.
<lang zkl>imageDiff(readJPG2PPM("lenna50.jpg"),readJPG2PPM("lenna100.jpg")) :
"Image difference = %f%%".fmt(_*100).println();</lang>
Compute the diff between the two Lennas, format and print it. More conventionally, this would be written as
<lang zkl>println("Image difference = %f%%".fmt(
imageDiff(readJPG2PPM("lenna50.jpg"),readJPG2PPM("lenna100.jpg")) * 100)
);</lang>
{{out}}
<pre>
512 512 # verbiage from convert
512 512
Image difference = 1.624730%
</pre>
 
Anonymous user