opencv-kmeans-图片颜色量化

简介: 牙叔教程 简单易懂

牙叔教程 简单易懂


效果展示

KMeans 数据分类

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

参数控制


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


技能点


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


环境


手机: Mi 11 Pro


Android版本: 12


Autojs版本: 9.1.6


代码讲解


1. 色卡是一个View
<View id="colorCard" marginTop="10" h="40dp" visibility="gone" bg="#ff0000"></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. 颜色列表
<list id="list" marginTop="10">
  <horizontal gravity="center" w="*" marginTop="16">
    <card cardCornerRadius="15" w="30" h="30" marginRight="60" bg="#ff00ff">
      <View id="colorDisplayArea" bg="{{this.color}}">
      </View>
    </card>
    <text id="colorValue" w="110dp" marginRight="60" text="{{this.color}}" size="20sp" textColor="#000000">
    </text>
    <text id="colorRatio" w="60dp" text="{{this.percent}}" size="20sp" textColor="#000000">
    </text>
  </horizontal>
</list>


美观一点, 我们把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文档, 最后才是群里问问
--- 牙叔教程


声明


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

相关文章
|
9天前
|
计算机视觉
Opencv学习笔记(十二):图片腐蚀和膨胀操作
这篇文章介绍了图像腐蚀和膨胀的原理、作用以及使用OpenCV实现这些操作的代码示例,并深入解析了开运算和闭运算的概念及其在图像形态学处理中的应用。
37 1
Opencv学习笔记(十二):图片腐蚀和膨胀操作
|
11天前
|
计算机视觉 Python
Opencv学习笔记(二):如何将整个文件下的彩色图片全部转换为灰度图
使用OpenCV库将一个文件夹内的所有彩色图片批量转换为灰度图,并提供了相应的Python代码示例。
28 0
Opencv学习笔记(二):如何将整个文件下的彩色图片全部转换为灰度图
|
11天前
|
计算机视觉 Python
Opencv学习笔记(一):如何将得到的图片保存在指定目录以及如何将文件夹里所有图片以数组形式输出
这篇博客介绍了如何使用OpenCV库在Python中将图片保存到指定目录,以及如何将文件夹中的所有图片读取并以数组形式输出。
60 0
Opencv学习笔记(一):如何将得到的图片保存在指定目录以及如何将文件夹里所有图片以数组形式输出
|
5月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.13图片冷白皮(美白)处理
OpenCV这么简单为啥不学——1.13图片冷白皮(美白)处理
64 0
|
11天前
|
计算机视觉
Opencv错误笔记(一):通过cv2保存图片采用中文命名出现乱码
在使用OpenCV的cv2模块保存带有中文命名的图片时,直接使用cv2.imwrite()会导致乱码问题,可以通过改用cv2.imencode()方法来解决。
52 0
Opencv错误笔记(一):通过cv2保存图片采用中文命名出现乱码
|
2月前
|
计算机视觉 Windows Python
windows下使用python + opencv读取含有中文路径的图片 和 把图片数据保存到含有中文的路径下
在Windows系统中,直接使用`cv2.imread()`和`cv2.imwrite()`处理含中文路径的图像文件时会遇到问题。读取时会返回空数据,保存时则无法正确保存至目标目录。为解决这些问题,可以使用`cv2.imdecode()`结合`np.fromfile()`来读取图像,并使用`cv2.imencode()`结合`tofile()`方法来保存图像至含中文的路径。这种方法有效避免了路径编码问题,确保图像处理流程顺畅进行。
226 1
|
3月前
|
计算机视觉 Python
opencv识别颜色
opencv识别颜色
|
9天前
|
Serverless 计算机视觉
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
这篇文章介绍了如何使用OpenCV库通过mask图像绘制分割对象的外接椭圆。首先,需要加载mask图像,然后使用`cv2.findContours()`寻找轮廓,接着用`cv2.fitEllipse()`拟合外接椭圆,最后用`cv2.ellipse()`绘制椭圆。文章提供了详细的代码示例,展示了从读取图像到显示结果的完整过程。
27 0
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
|
2月前
|
计算机视觉 C++
基于VS2019和Opencv4,对hsv颜色空间的图像分割原理以及实现
这篇文章介绍了基于HSV颜色空间的图像分割原理,包括HSV模型的基本概念和如何在OpenCV中通过设置HSV的色彩范围来实现图像中特定颜色的物体分割,并通过示例代码展示了在静态图像和视频流中进行颜色分割的方法。
基于VS2019和Opencv4,对hsv颜色空间的图像分割原理以及实现
|
2月前
|
存储 编解码 API
python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片
python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片
158 1