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,以查看它是否在 1 以内。
这可能是超级低效的。 对于每个像素,您正在迭代一个潜在的庞大数组,直到获得匹配项,或者最坏的情况是,您找不到匹配项。
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');
}
}
这是另一种使用记忆的方法。 它应该快得多,但代价是存储单独的查找结构。
编辑 - 我删除了这种方法,因为它可能会失败。 这可能是可能的,但非常棘手。
检查所有不同的像素值,放置+-
与一系列值不匹配。 .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 的话题。