Sobelフィルタの勉強

参考にしているサイト http://jstap.web.fc2.com/test/html5/filtering/filtering.html

by s_hiroshi

HTML

<canvas id="canvas1" width="100", height="100"></canvas>
<button id="sobel">Sobel Filter</button>

CSS

#canvas {
    background: #EEE;
}

JavaScript

/**
 * reference sobel script
 * http://jstap.web.fc2.com/test/html5/filtering/filtering.html
 */


(function($) {
    
    var canvas1 = $('#canvas1').get(0),
        cxt1 = canvas1.getContext('2d'),
        cxt2 = canvas1.getContext('2d'),
        canvasData1,
        canvasData2;
    
    cxt1.fillStyle = '#F8F8F8';
    cxt1.fillRect(0, 0, 100, 100);
    cxt1.fillStyle = '#666666';
    cxt1.beginPath(); 
    cxt1.moveTo(10, 10);
    cxt1.lineTo(90, 10);
    cxt1.lineTo(90, 90);
    cxt1.lineTo(10, 90);
    cxt1.closePath();
    cxt1.fill();


    /**
     * 
     */

    function setPixel() {
        if (arguments.length <= 2) {
            return;
        }

        var x = arguments[0];
        var y = arguments[1];
        // グレースケールの場合だけ
        
        canvasData2.data[(y * canvasData2.width + x) * 4] = arguments[2];
        canvasData2.data[(y * canvasData2.width + x) * 4 + 1] = arguments[2];
        canvasData2.data[(y * canvasData2.width + x) * 4 + 2] = arguments[2];
        canvasData2.data[(y * canvasData2.width + x) * 4 + 3] = 255;
    }


    /**
     * get canvasData.data
     */

    function getPixel(x, y) {
        // only grayscale
        return canvasData1.data[(y * canvasData1.width + x) * 4];
    }


    /**
     * 空間フィルタリング(グレースケール)
     */

    function sobel() {

        canvasData1 = cxt1.getImageData(0, 0, canvas1.width, canvas1.height);
        canvasData2 = cxt2.getImageData(0, 0, canvas1.width, canvas1.height);

        var filter = [-1, 0, 1, -2, 0, 2, -1, 0, 1];
        var init = 1;
        var from = -init;
        var to = init;

        var sum, absSum;
        var n, m, x, y;

        // 端は考慮しない
        for (y = 1; y < canvasData1.height - 1; y++) {
            for (x = 1; x < canvasData1.width - 1; x++) {
                sum = 0;
                // init = 1,
                // (n + init) * 3 + m + init
                // (-1, -1) => 0, (-1, 0) => 1, (-1, 1) => 2
                // ( 0, -1) => 3, ( 0, 0) => 4, ( 0, 1) => 5
...