JavaScript检查数组是否包含修改后的值,计算图像中的唯一像素

时间:2018-01-03 16:27:00

标签: javascript arrays rgb repeat pixels

var image = new SimpleImage("lena.png");
var col = [];
var uniqcol = [];

for (var px of image.values()){

    col.push([px.getRed,px.getGreen,px.getBlue]);
    
    if(uniqcol.includes([px.getRed +- 1, px.getGreen +- 1, px.getBlue +- 1]) ){
     print('not unique');
    }else{
        uniqcol.push([px.getRed,px.getGreen,px.getBlue]);
    }
}

我想计算图像中唯一像素的数量。唯一像素是RGB值与其他像素不在1之内的像素。我有上面的代码,但它不起作用。我认为我遇到的问题是检查RGB值是选定像素px值的+1或-1。如果找到唯一像素,则id喜欢添加到uniqcol数组。有没有其他方法可以计算唯一像素,或者检查RGB值是否在所选px值的1以内?

感谢。

2 个答案:

答案 0 :(得分:2)

这会测试每个组件,看它是否在1以内,减去两个,取绝对值,并检查它是否小于2.

这可能超级低效。对于每个像素,你会重复一个潜在的大规模阵列,直到你得到一个匹配,或者最坏的情况,你找不到匹配。



var image = new SimpleImage("lena.png");
var col = [];
var uniqcol = [];

for (var px of image.values()){
    var found = uniqcol.find(function (el) {
      return 
        Math.abs(el[0] - px.getRed) < 2 &&
        Math.abs(el[1] - px.getGreen) < 2 &&
        Math.abs(el[2] - px.getBlue) < 2;
    });

    if (!found) {
      uniqcol.push([px.getRed,px.getGreen,px.getBlue]);
    } else {
      print('not unique');
    }
}
&#13;
&#13;
&#13;

这是另一种使用记忆的方法。以存储单独的查找结构为代价应该快得多。

编辑 - 我删除了这种方法,因为它可能会失败。这可能是可能的,但非常棘手。

答案 1 :(得分:1)

您需要检查所有不同的像素值,+-与一系列值不匹配。 .includes()查找完全匹配。

for (var px of image.values()) {
    col.push([px.getRed,px.getGreen,px.getBlue]);
    var found = false;
    for (dRed of [-1, 0, +1]) {
        for (dGreen of [-1, 0, +1]) {
            for (dBlue of [-1, 0, +1]) {
                if (uniqcol.includes([px.getRed + dRed, px.getGreen + dGreen, px.getBlue + dBlue]) {
                    found = true;
                    print("not unique");
                    break;
                }
            }
            if (found) {
                break;
            }
        if (found) {
            break;
        }
    }
    if (!found) {
        uniqcol.push([px.getRed,px.getGreen,px.getBlue]);
    }
}

这可能不是一种非常有效的方法,因为它会为每个像素搜索整个图像9次。循环遍历所有像素可能会更好,测试所有颜色是否在当前像素的范围内:

if (px.getRed >= curPixel.getRed - 1 && px.getRed <= curPixel.getRed + 1 &&
    px.getGreen >= curPixel.getGreen - 1 && px.getGreen <= curPixel.getGreen + 1 &&
    px.getBlue >= curPixel.getBlue - 1 && px.getBlue <= curPixel.getBlue + 1)

一个非常有效的算法将涉及对所有像素进行排序(红色,蓝色和绿色值的嵌套数组将是一个很好的结构),然后搜索它。但这更像是CodeReview.stackexchange.com的主题。