diff --git a/hunks/adhoc/correlate.js b/hunks/adhoc/correlate.js index ecc59651dc1cf6612a3c760af07289abc6c6d9d0..6aa9be975cb3d14bae1d867edf2836ab87e298eb 100644 --- a/hunks/adhoc/correlate.js +++ b/hunks/adhoc/correlate.js @@ -14,7 +14,7 @@ import { let computedResult = null let running = false -let correlate = (a, b, x, y) => { +let correlateGrayscale = (a, b, x, y) => { // score a against b, starting b from x, y // a, b are float64 arrays, pixel-wise let sumA = 0 @@ -32,6 +32,31 @@ let correlate = (a, b, x, y) => { return sumDot / Math.sqrt((sumB * sumB)*(sumA * sumA)) } +let correlateRBGA = (a, b, x, y) => { + let ai, bi + let sumA = 0 + let sumB = 0 + let sumDot = 0 + for(let i = 0; i < a.length; i ++){ + for(let j = 0; j < a[0].length; j ++){ + ai = a[i][j] + bi = b[i + x][j + y] + // have two vals, + a[i][j] // has [0-3] rgba + b[i + x][j + y] // has [0-3] rgba + // so ? per pixel, this is like: + let pdb = ai[0] * bi[0] + ai[1] * bi[1] + ai[2] * bi[2] + let pas = ai[0] + ai[1] + ai[2] + let pbs = bi[0] + bi[1] + bi[2] + let pps = pdb / Math.sqrt(pas * pas * pbs * pbs) // per pixel score, + sumA += pas + sumB += pbs + sumDot += pdb + } + } + return sumDot / Math.sqrt(sumA * sumA * sumB * sumB) +} + let delay = (time) => { return new Promise(resolve =>{ setTimeout(() => { @@ -40,7 +65,7 @@ let delay = (time) => { }) } -let packAndGrayscaleImage = (imgD) => { +let packGrayscale = (imgD) => { // make an md array shaped like[x][y] let arr = [] for(let x = 0; x < imgD.width; x ++){ @@ -50,13 +75,33 @@ let packAndGrayscaleImage = (imgD) => { for(let y = 0; y < imgD.height; y ++){ for(let x = 0; x < imgD.width; x ++){ // grayscale all values as we load them up: - arr[x][y] = (imgD.data[p] + imgD.data[p + 1] + imgD.data[p + 2] + imgD.data[p + 3]) / 4; + arr[x][y] = (imgD.data[p] + imgD.data[p + 1] + imgD.data[p + 2]) / 3 // + imgD.data[p + 3]) / 4; p += 4; } } return arr } +let packRBGA = (imgD) => { + let arr = [] + for(let x = 0; x< imgD.width; x ++){ + arr.push([]) + for(let y = 0; y < imgD.height; y ++){ + arr[x][y] = new Float64Array(4) + } + } + let p = 0 + for(let y = 0; y < imgD.height; y ++){ + for(let x = 0; x < imgD.width; x ++){ + arr[x][y][0] = imgD.data[p ++] + arr[x][y][1] = imgD.data[p ++] + arr[x][y][2] = imgD.data[p ++] + arr[x][y][3] = imgD.data[p ++] + } + } + return arr +} + async function run(a, b){ running = true // a is img to search for, b is img to search within. both are ImageData types @@ -65,8 +110,8 @@ async function run(a, b){ let numruns = resX * resY console.log('numruns', numruns) // the move now is to make an md array of these values, - let bArr = packAndGrayscaleImage(b) - let aArr = packAndGrayscaleImage(a) + let bArr = packRBGA(b) //packGrayscale(b) + let aArr = packRBGA(a) //packGrayscale(a) // ok, results array like[x][y] let result = [] for(let x = 0; x < resX; x ++){ @@ -75,7 +120,7 @@ async function run(a, b){ // now fill, for(let x = 0; x < resX; x ++){ for(let y = 0; y < resY; y ++){ - result[x][y] = correlate(aArr, bArr, x, y) + result[x][y] = correlateRBGA(aArr, bArr, x, y) } await delay(0) // to avoid blocking, }