diff --git a/examples/emd.js b/examples/emd.js new file mode 100644 index 0000000..5e711b8 --- /dev/null +++ b/examples/emd.js @@ -0,0 +1,72 @@ +var cv = require('../lib/opencv'); + +// (B)lue, (G)reen, (R)ed +var histSize = 256; + +cv.readImage('./files/car1.jpg', function(err, im1) { + if (err) throw err; + if (im.width() < 1 || im.height() < 1) throw new Error('Image has no size'); + cv.readImage('./files/car2.jpg', function(err, im2) { + + var bgrPlanes = im.split(); + + var size = [4, 4, 4], + channels = [0, 1, 2], + range = [[0, 256], [0, 256], [0, 256]], + uniform = true, + accumulate = true, + histFile = 'files/chart2.png'; + + + /// Compute 64 (=4^3) histograms: + + var firstImageHist64 = cv.histogram.calcHist(im1, channels, size, range, uniform, accumulate); + var secondImageHist64 = cv.histogram.calcHist(im2, channels, size, range, uniform, accumulate); + + var sig1 = flatten(firstImageHist64); + var sig2 = flatten(secondImageHist64); + + var step = 256/4; + var halfStep = Math.round(step/2) + + var middles = flatten(firstImageHist64.map(function(bHist, bIndex){ + return blueValue.map(function(bgHist, gIndex){ + return greenValue.map(function(bgrHist, rIndex){ + return [ + bIndex*step + halfStep, + gIndex*step + halfStep, + rIndex*step + halfStep + ];/*{ + b : bIndex*step + halfStep, + g : gIndex*step + halfStep, + r : rIndex*step + halfStep + }*/ + }) + }) + })); + + var mat = new opencv.Matrix(64,1,cv.Constants.CV_8UC3); + var buf = Buffer(64*1*3); + buf.fill(0); + for(var i=0;i<64*1*3;i++){ + buf[i] = middles[i]; + } + mat.put(buf); + mat.cvtColor("CV_BGR2Luv"); + + var luvValues = mat.toArray()[0]; + + var distance = function(luv1, luv2){ + return Math.sqrt((luv1[0]-luv2[0])*(luv1[0]-luv2[0]) + (luv1[1]-luv2[1])*(luv1[1]-luv2[1]) + (luv1[2]-luv2[2])*(luv1[2]-luv2[2])); + }; + + var costs = luvValues.map(function(luvMiddle1){ + return middles.map(function(luvMiddle2){ + return distance(luvMiddle1, luvMiddle2); + }) + }) + + emd(sig1, sig2, cv.Constants.CV_DIST_USER, cost); + + }); +});