Skip to content

Instantly share code, notes, and snippets.

@clindsey
Created December 15, 2009 22:43
Show Gist options
  • Save clindsey/257377 to your computer and use it in GitHub Desktop.
Save clindsey/257377 to your computer and use it in GitHub Desktop.
function doEdgeDetectionAlgorithm(input, baseColor, grey) {
var output = context.createImageData(canvas.width, canvas.height);
var w = input.width, h = input.height;
var inputData = input.data;
var outputData = output.data;
var bytesPerRow = w * 4;
var pixel = bytesPerRow + 4; // Start at (1,1)
var hm1 = h - 1;
var wm1 = w - 1;
var d = new Date;
for (var y = 1; y < hm1; ++y) {
// Prepare initial cached values for current row
var centerRow = pixel - 4;
var priorRow = centerRow - bytesPerRow;
var nextRow = centerRow + bytesPerRow;
var r1 = - inputData[priorRow] - inputData[centerRow] - inputData[nextRow];
var g1 = - inputData[++priorRow] - inputData[++centerRow] - inputData[++nextRow];
var b1 = - inputData[++priorRow] - inputData[++centerRow] - inputData[++nextRow];
var rp = inputData[priorRow += 2];
var rc = inputData[centerRow += 2];
var rn = inputData[nextRow += 2];
var r2 = - rp - rc - rn;
var gp = inputData[++priorRow];
var gc = inputData[++centerRow];
var gn = inputData[++nextRow];
var g2 = - gp - gc - gn;
var bp = inputData[++priorRow];
var bc = inputData[++centerRow];
var bn = inputData[++nextRow];
var b2 = - bp - bc - bn;
// Main convolution loop
for (var x = 1; x < wm1; ++x) {
centerRow = pixel + 4;
priorRow = centerRow - bytesPerRow;
nextRow = centerRow + bytesPerRow;
var r = baseColor + r1 - rp - (rc * -8) - rn;
var g = baseColor + g1 - gp - (gc * -8) - gn;
var b = baseColor + b1 - bp - (bc * -8) - bn;
r1 = r2;
g1 = g2;
b1 = b2;
rp = inputData[priorRow];
rc = inputData[centerRow];
rn = inputData[nextRow];
r2 = - rp - rc - rn;
gp = inputData[++priorRow];
gc = inputData[++centerRow];
gn = inputData[++nextRow];
g2 = - gp - gc - gn;
bp = inputData[++priorRow];
bc = inputData[++centerRow];
bn = inputData[++nextRow];
b2 = - bp - bc - bn;
if( !grey ) {
outputData[pixel] = r + r2;
outputData[++pixel] = g + g2;
outputData[++pixel] = b + b2;
} else {
factor = .3* (r+r2) + .59*(g+g2) +.11*(b+b2);
outputData[pixel] = factor;
outputData[++pixel] = factor;
outputData[++pixel] = factor;
}
outputData[++pixel] = 255; // alpha
++pixel;
}
pixel += 8;
}
//alert((new Date - d) / 1000);
return output;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment