如何从图像Javascript中删除线条

时间:2018-02-03 03:39:31

标签: javascript html image image-processing getimagedata

所以给定一个数据表的图像,我想删除所有的行。我将一条线分类为连续像素,无论是垂直还是水平。 enter image description here

因此,结果将删除所有网格线,基本上留下文本和数字。

有没有办法使用Javascript的图像数据删除所有行? 就像我想到的那样,循环一个包含2D图像像素的2D数组,找到所有线条并将其颜色改变为周围的颜色,使其“消失”。  所以这会修改图像的图像数据。

2 个答案:

答案 0 :(得分:1)

最简单的方法是遍历所有像素行,检查所有像素是否为"黑色"如果是的话,把它们变成白色。然后对所有像素列执行相同操作。

for(var i=0; i<imageData.width; i++){
    for(var j=0; j<imageData.height; j++){
        var pixel = imageData[i * imageData.width + j];
        vas isBlack = checkIfBlack(pixel);

        if (isBlack === false) {
            break;
        }
    }

    for(var j=0; j<imageData.height; j++){
        for(var k=0; k<4; k++){
            imageData[i * imageData.width + j + k] = 255;
        }
    }
}

for(var i=0; i<imageData.height; i++){
    for(var j=0; j<imageData.width; j++){
        var pixel = imageData[i + j * imageData.width];
        vas isBlack = checkIfBlack(pixel);

        if (isBlack === false) {
            break;
        }
    }

    for(var j=0; j<imageData.height; j++){
        for(var k=0; k<4; k++){
            imageData[i + j * imageData.width + k] = 255;
        }
    }
}

变量imageData的构建方式如图here

我故意遗漏了函数checkIfBlack()。最简单的实现是检查RGB通道是否全部为0(或至少低于阈值)。

function checkIfBlack(pixel, threshold) {
    threshold = threshold || 0;

    for(var i=0; i<3; i++) {
        if(pixel[i] > threshold) {
            return false;
        }
    }

    return true;
}

答案 1 :(得分:0)

opencv中的大多数常规功能现已移植到Javascript(opencv.js)中。 这是霍夫变换的链接。 https://docs.opencv.org/3.3.1/d3/de6/tutorial_js_houghlines.html

您可以使用hough变换识别水平和垂直线并将其移除。

否则,如果您想在Javscript中实现自己的代码,可以按照此处的说明找到所有连接的组件 - https://en.wikipedia.org/wiki/Connected-component_labeling

连接后组件标签,您可以根据其几何尺寸和像素密度移除大型连接组件。

希望有所帮助:)