mirror of
https://github.com/publiclab/image-sequencer.git
synced 2025-12-11 19:00:00 +01:00
84 lines
3.0 KiB
JavaScript
Executable File
84 lines
3.0 KiB
JavaScript
Executable File
module.exports = exports = function(pixels, blur) {
|
|
let kernel = kernelGenerator(blur, 1), oldpix = require('lodash').cloneDeep(pixels);
|
|
kernel = flipKernel(kernel);
|
|
|
|
for (let i = 0; i < pixels.shape[0]; i++) {
|
|
for (let j = 0; j < pixels.shape[1]; j++) {
|
|
let neighboutPos = getNeighbouringPixelPositions([i, j]);
|
|
let acc = [0.0, 0.0, 0.0, 0.0];
|
|
for (let a = 0; a < kernel.length; a++) {
|
|
for (let b = 0; b < kernel.length; b++) {
|
|
acc[0] += (oldpix.get(neighboutPos[a][b][0], neighboutPos[a][b][1], 0) * kernel[a][b]);
|
|
acc[1] += (oldpix.get(neighboutPos[a][b][0], neighboutPos[a][b][1], 1) * kernel[a][b]);
|
|
acc[2] += (oldpix.get(neighboutPos[a][b][0], neighboutPos[a][b][1], 2) * kernel[a][b]);
|
|
acc[3] += (oldpix.get(neighboutPos[a][b][0], neighboutPos[a][b][1], 3) * kernel[a][b]);
|
|
}
|
|
}
|
|
pixels.set(i, j, 0, acc[0]);
|
|
pixels.set(i, j, 1, acc[1]);
|
|
pixels.set(i, j, 2, acc[2]);
|
|
}
|
|
}
|
|
return pixels;
|
|
|
|
|
|
|
|
//Generates a 3x3 Gaussian kernel
|
|
function kernelGenerator(sigma, size) {
|
|
|
|
/*
|
|
Trying out a variable radius kernel not working as of now
|
|
*/
|
|
// const coeff = (1.0/(2.0*Math.PI*sigma*sigma))
|
|
// const expCoeff = -1 * (1.0/2.0 * sigma * sigma)
|
|
// let e = Math.E
|
|
// let result = []
|
|
// for(let i = -1 * size;i<=size;i++){
|
|
// let arr = []
|
|
// for(let j= -1 * size;j<=size;j++){
|
|
// arr.push(coeff * Math.pow(e,expCoeff * ((i * i) + (j*j))))
|
|
// }
|
|
// result.push(arr)
|
|
// }
|
|
// let sum = result.reduce((sum,val)=>{
|
|
// return val.reduce((sumInner,valInner)=>{
|
|
// return sumInner+valInner
|
|
// })
|
|
// })
|
|
// result = result.map(arr=>arr.map(val=>(val + 0.0)/(sum + 0.0)))
|
|
|
|
// return result
|
|
|
|
return [
|
|
[2.0 / 159.0, 4.0 / 159.0, 5.0 / 159.0, 4.0 / 159.0, 2.0 / 159.0],
|
|
[4.0 / 159.0, 9.0 / 159.0, 12.0 / 159.0, 9.0 / 159.0, 4.0 / 159.0],
|
|
[5.0 / 159.0, 12.0 / 159.0, 15.0 / 159.0, 12.0 / 159.0, 5.0 / 159.0],
|
|
[4.0 / 159.0, 9.0 / 159.0, 12.0 / 159.0, 9.0 / 159.0, 4.0 / 159.0],
|
|
[2.0 / 159.0, 4.0 / 159.0, 5.0 / 159.0, 4.0 / 159.0, 2.0 / 159.0]
|
|
];
|
|
}
|
|
function getNeighbouringPixelPositions(pixelPosition) {
|
|
let x = pixelPosition[0], y = pixelPosition[1], result = [];
|
|
|
|
for (let i = -2; i <= 2; i++) {
|
|
let arr = [];
|
|
for (let j = -2; j <= 2; j++)
|
|
arr.push([x + i, y + j]);
|
|
|
|
result.push(arr);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
function flipKernel(kernel) {
|
|
let result = [];
|
|
for (let i = kernel.length - 1; i >= 0; i--) {
|
|
let arr = [];
|
|
for (let j = kernel[i].length - 1; j >= 0; j--) {
|
|
arr.push(kernel[i][j]);
|
|
}
|
|
result.push(arr);
|
|
}
|
|
return result;
|
|
}
|
|
} |