opencv-kmeans-图片颜色量化

牙叔教程 简单易懂

效果展示

录制_2022_02_28_17_40_39_155.gif
1.png
2.png
3.png

KMeans 数据分类

  • KMeans算法的作者是MacQueen, KMeans的算法是对数据进行分类的算法,采用的硬分类方式,是属于非监督学习的算法;
  • 对于给定的样本集,按照样本之间的距离大小,将样本划分为K个簇,让簇内的点尽量紧密的连接在一起,而让簇间的距离尽量的大。

参数控制

  • 聚类的颜色数量, 第一张图片是3个颜色, 其他是10个颜色

技能点

  • 全屏
  • 在autojs中使用kmeans
  • 选择文件
  • 绘制色卡
  • list的使用
  • 浏览和保存mat
  • 颜色rgb三通道分离
  • toolbar修改左上角图标及其颜色

环境

手机: Mi 11 Pro

Android版本: 12

Autojs版本: 9.1.6

代码讲解

1. 色卡是一个View

颜色聚类, 获取到数据以后, 绘制色卡用下面的方法

function drawColor(view, dataList) {
  var drawable = new android.graphics.drawable.Drawable({
    draw: function (canvas) {
      var len = dataList.length;
      let viewWidth = view.getWidth();
      let viewHeight = view.getHeight();
      let lastX = 0;
      let paint = new android.graphics.Paint();
      for (var i = 0; i < len; i++) {
        let color = dataList[i].color;
        let percent = dataList[i].percent;
        let x = lastX;
        let y = 0;
        let width = viewWidth * percent;
        let height = viewHeight;
        lastX = x + width;
        let rect = new android.graphics.Rect(x, y, x + width, y + height);
        paint.setColor(colors.parseColor(color));
        canvas.drawRect(rect, paint);
      }
    },
  });
  view.setBackgroundDrawable(drawable);
}
2. 颜色列表

    
        
            
            
        
        
        
        
        
    

美观一点, 我们把View呈现为圆形, 再显示颜色数值, 和颜色的比例

3. 选择文件
ui.logo.click(function () {
  intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
  activity.startActivityForResult(intent, imgRequestCode);
});

选择文件之前, 要设置文件选择监听, 然后获取到文件路径

4. 监听文件选择结果
activity.getEventEmitter().on("activity_result", (requestCode, resultCode, data) => {
  if (requestCode == imgRequestCode) {
    if (resultCode == activity.RESULT_OK) {
      let uri = data.getData();
      let path = uri.getPath();
      path = decodeURIComponent(path);
    }
  }
});
5, 模块调试
if (typeof module === "object") {
  module.exports = getColorData;
} else {
  let imgPath = "./small11645897022391.png";
  getColorData(imgPath);
}

有时候要单独调试模块, 不想频繁的切换注释module.exports, 就可以通过判断module是不是object,

如果是就说明是当模块来使用, 如果不是就说明在调试模块,

这样就不用一直切换module.exports的注释了

6. 图片类型
Imgproc.cvtColor(mat, mat2, Imgproc.COLOR_BGRA2RGBA);

保存图片之前, 需要转换图片的颜色类型, 因为opencv是bgr格式的图片, autojs是rgb格式的图片

名人名言

思路是最重要的, 其他的百度, bing, stackoverflow, github, 安卓文档, autojs文档, 最后才是群里问问
--- 牙叔教程

声明

部分内容来自网络
本教程仅用于学习, 禁止用于其他用途

你可能感兴趣的:(opencv-kmeans-图片颜色量化)