微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用欧几里德距离的颜色量化给出了跳跃的结果

如何解决使用欧几里德距离的颜色量化给出了跳跃的结果

我正在从事一个艺术项目,该项目根据两者颜色之间的距离(以 RGB 为单位)将实时视频源的像素转换为公司徽标。虽然此功能起作用,但它会产生不稳定的结果。似乎色彩空间中的某些点在两个“最近”点之间的某种叠加中摇摆不定。我现在正在尝试一种天真的聚类解决方案,因为我相信任何合适的解决方案对于实时视频来说都太慢了。我想知道是否有人有任何好主意来解决这个问题?我将包括我的代码和结果示例。谢谢!

(imgs 数组是徽标)

当前结果:https://gifyu.com/image/fk2y

function distance(r1,g1,b1,bright1,r2,g2,b2,bright2) {
  d =
    ((r2 - r1) * 0.3) ** 2 +
    ((g2 - g1) * 0.59) ** 2 +
    ((b2 - b1) * 0.11) ** 2 +
    ((bright2 - bright1) * 0.75) ** 2;
  return Math.round(d);
}

function draw() {

  if (x > 100 && z == true) {
    video.loadPixels();

    for (var y = 0; y < video.height; y++) {
      for (var x = 0; x < video.width; x++) {
        var index = (video.width - x - 1 + y * video.width) * 4;
        var r = video.pixels[index];
        var g = video.pixels[index + 1];
        var b = video.pixels[index + 2];
        var bright = (r + g + b) / 3;
        let least = 9999999;

        for (var i = 0; i < imgs.length; i++) {
          if (
            distance(
              imgs[i].r,imgs[i].g,imgs[i].b,imgs[i].bright,r,g,b,bright
            ) < least
          ) {
            least = distance(
              imgs[i].r,bright
            );
            place = imgs[i].img;
          }
        }

        image(place,round(x * vScale),y * vScale,vScale,vScale);
      }
    }
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。