js 前端抠图 性能优化

原文链接: js 前端抠图 性能优化

上一篇: js 生成器 协程

下一篇: wasm 和cpp std 的使用

性能对比

下图是 字符串键 + 欧式距离 + 四方

up-ea9b915a84f4e41ce32db58fae90f744dfd.pngup-2e65d006fe91e25b5bff70bf14e0f341f4b.png

字符串键 + 欧氏距离 + 八方

up-5781f3d3a125656a63071299292dab462a9.pngup-fe527f24ba43aee30769aeb60aa3cec4e9c.png

数字键 + 一阶矩  + 四方

基本上速度提高了一倍

up-ee75b79c1f2e0cf251d23934bba58bbc7e1.pngup-1322cf61103783b167faa2bf3a313a38f94.png

效果

通过点击, 将点击位置作为起始点, 进行泛洪填充, 下图是700*700的回字填充效果, 红色边界为验证算法是否正确

首先泛洪填充必须使用栈实现, 递归会很容易超过最大深度, 对于效果来说无非是颜色插值计算和四个方向还是八个方向的问题

颜色比对这里简单使用的向量余弦值进行比较, 生产环境建议使用HSV颜色空间

由输出可以看到, 算法的主要执行步骤 count是执行次数, time为执行时间, 多次执行, 数据基本上出入不大

up-7caf1f071b262dd71bb0f046050dab0c6ce.pngup-c9b235dc1111e3136387ab713bb892f4f8a.pngup-12395ebc0b37a40eec4385375c1ec6576c2.png

性能优化

将对象缓存的字符串键改为数字键

之前在进行某个点是否已经访问过的时候使用 `x,y` 的方式转为字符串然后通过对象的键值实现

现在使用数字实现, 为了保证数处理时长, 需要对图片的长宽进行限制, 一般限制为1<<16 已经绝对足够了, 可以将数字作为两部分, 而不是拼接字符串

仅仅这一个优化, 性能已经有了不小的提高..... 快了近30% ....

up-686de559250d27b78802f40a63cd9e7d34e.pngup-a208cc3f130be8fdc692d6868736a843c72.pngup-a1ffd011c448f9405317c382c701fce255e.png

用大图片测下

采用四方向

up-5e57226b3ebfdb3666debffccfd632a39c8.pngup-49bb4440bdadf253ec4cf270640323e44c4.png

采用八方向, 可以看到四方向的试错次数比八方向的小了很多, 在效果差不多的情况下, 四方向可以显著减少试错次数

up-e9ca248703329412da6c3dccc212c9c039a.pngup-f4d37897a0195f161555b5c8024e8a6c1c2.png

使用 一阶矩 代替欧式矩, 减少乘法和除法运算, 又有了30%的提高....

  const d = abs(r1 - r2) + abs(b1 - b2) + abs(g1 - g2);
  return 1 - d / 255 / 3 > 0.9;

up-09d9b8c3b6ae7c60feb1aaaf331befc6631.pngup-e8e15ad1376b3cfb2f839d67e1134312f2b.png

直接使用数字对比, 这个效果就一般了, 主要是平方和开方费时

  const d = abs(r1 - r2) + abs(b1 - b2) + abs(g1 - g2);
  // return 1 - d / 255 / 3 > 0.9;
  return d < 255;

up-b8d61b0ac6072effe028c027c8ec3d51dfb.pngup-dd54f6292ddc693890fba166f8b0932fee3.pngup-ab963e5a74aca72572fc6ca14e3427228b9.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值