一、像素点聚类

#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/ml.hpp"using namespace cv;
using namespace cv::ml;int main(int /*argc*/, char** /*argv*/)
{const int N = 4;//4类const int N1 = (int)sqrt((double)N);const Scalar colors[] ={Scalar(0,0,255), Scalar(0,255,0),Scalar(0,255,255),Scalar(255,255,0)};//4种颜色int i, j;int nsamples = 100;Mat samples(nsamples, 2, CV_32FC1);//样本像素点坐标Mat labels;//标签Mat img = Mat::zeros(Size(500, 500), CV_8UC3);//背景Mat sample(1, 2, CV_32FC1);//一个样本samples = samples.reshape(2, 0);// 单个样本两行for (i = 0; i < N; i++){// 形成训练样本form the training samplesMat samples_part = samples.rowRange(i * nsamples / N, (i + 1) * nsamples / N);//取第i个样本的  x,y 地址 Scalar mean(((i % N1) + 1) * img.rows / (N1 + 1),((i / N1) + 1) * img.rows / (N1 + 1));//x均值和y均值Scalar sigma(30, 30);//x方差和y方差randn(samples_part, mean, sigma);//用正态分布的随机数填充数组}samples = samples.reshape(1, 0);//单个样本1行//对数据进行聚类 cluster the dataPtr<EM> em_model = EM::create();//该类实现期望最大化算法。em_model->setClustersNumber(N);//设置聚类数em_model->setCovarianceMatrixType(EM::COV_MAT_SPHERICAL);//设置协方差矩阵类型em_model->setTermCriteria(TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 300, 0.1));//trainEM函数的功能和kmeans差不多,都是实现自动聚类,输出每个样本对应的标注值。但它比kmeans还多出一个功能,//就是它还能起到训练分类器的作用,用于后续新样本的预测em_model->trainEM(samples, noArray(), labels, noArray());//// 对每个图像像素进行分类classify every image pixelfor (i = 0; i < img.rows; i++){for (j = 0; j < img.cols; j++){sample.at<float>(0) = (float)j;sample.at<float>(1) = (float)i;int response = cvRound(em_model->predict2(sample, noArray())[1]);Scalar c = colors[response];//第response类的颜色circle(img, Point(j, i), 1, c * 0.75, FILLED);//颜色填充分成的N个区域}}//绘制聚类样本 draw the clustered samplesfor (i = 0; i < nsamples; i++){Point pt(cvRound(samples.at<float>(i, 0)), cvRound(samples.at<float>(i, 1)));circle(img, pt, 1, colors[labels.at<int>(i)], FILLED);}imshow("EM-clustering result", img);waitKey(0);return 0;
}

机器学习算法之:EM算法

不同于其它的机器学习模型,EM算法是一种非监督的学习算法,它的输入数据事先不需要进行标注。相反,该算法从给定的样本集中,能计算出高斯混和参数的最大似然估计。也能得到每个样本对应的标注值,类似于kmeans聚类(输入样本数据,输出样本数据的标注)。实际上,高斯混和模型GMM和kmeans都是EM算法的应用。

在opencv4.5中,EM算法的函数是trainEM,函数原型为:

 bool trainEM(InputArray samples, OutputArray logLikelihoods=noArray(),OutputArray labels=noArray(),OutputArray probs=noArray())

四个参数:

samples: 输入的样本,一个单通道的矩阵。从这个样本中,进行高斯混和模型估计。

logLikelihoods: 可选项,输出一个矩阵,里面包含每个样本的似然对数值。

labels: 可选项,输出每个样本对应的标注。

probs: 可选项,输出一个矩阵,里面包含每个隐性变量的后验概率

这个函数没有输入参数的初始化值,是因为它会自动执行kmeans算法,将kmeans算法得到的结果作为参数初始化。

这个trainEM函数实际把E步骤和M步骤都包含进去了,我们也可以对两个步骤分开执行,OPENCV3.0中也提供了分别执行的函数

二、图像聚类,目标检测

fruits.jpg

#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace std;
using namespace cv;
using namespace cv::ml;int main(int argc, char* argv[])
{const int MAX_CLUSTERS = 5;Vec3b colorTab[] ={Vec3b(0, 0, 255),Vec3b(0, 255, 0),Vec3b(255, 100, 100),Vec3b(255, 0, 255),Vec3b(0, 255, 255)};Mat data, labels;CommandLineParser parser(argc, argv, "{@input | fruits.jpg | input image}");//Mat src = imread(samples::findFile(parser.get<String>("@input")));// Mat pic = imread(samples::findFile("aloeR.jpg"));Mat pic = imread("C:/Users/cxy/Pictures/Camera Roll/bad0011.bmp");for (int i = 0; i < pic.rows; i++)for (int j = 0; j < pic.cols; j++){Vec3b point = pic.at<Vec3b>(i, j);Mat tmp = (Mat_<float>(1, 3) << point[0], point[1], point[2]);data.push_back(tmp);}int N = 3;  //聚成3类Ptr<EM> em_model = EM::create();em_model->setClustersNumber(N);em_model->setCovarianceMatrixType(EM::COV_MAT_SPHERICAL);em_model->setTermCriteria(TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 300, 0.1));em_model->trainEM(data, noArray(), labels, noArray());int n = 0;//显示聚类结果,不同的类别用不同的颜色显示for (int i = 0; i < pic.rows; i++)for (int j = 0; j < pic.cols; j++){int clusterIdx = labels.at<int>(n);pic.at<Vec3b>(i, j) = colorTab[clusterIdx];n++;}resize(pic,pic, Size(600,600));imshow("pic", pic);waitKey(0);return 0;
}

aloeR.jpg

垫块

参考:

opencv3中的机器学习算法之:EM算法 - denny402 - 博客园 (cnblogs.com)https://www.cnblogs.com/denny402/p/5036288.html

PCL:欧式聚类分割_孙 悟 空的博客-CSDN博客_欧式聚类分割https://blog.csdn.net/weixin_46098577/article/details/116129817

【openv450-samples】像素点聚类EM 图像聚类目标检测相关推荐

  1. 双向特征融合的数据自适应SAR图像舰船目标检测模型

    双向特征融合的数据自适应SAR图像舰船目标检测模型 人工智能技术与咨询 昨天 本文来自<中国图象图形学报>,作者张筱晗等 摘要: 利用合成孔径雷达(synthetic aperture r ...

  2. matlab实现大气湍流退化模型算法,大气湍流下退化序列图像的目标检测方法

    引言 目标检测是计算机视觉的重要应用之一, 是后续目标识别.跟踪.目标分类以及行为分析的前提.远距离成像时通常会受到复杂变化的大气湍流影响, 使得成像结果中存在不规则抖动.偏移和模糊等退化现象[.因此 ...

  3. 自动驾驶采标系列三:基于图像的目标检测技术

        标注猿的第54篇原创        一个用数据视角看AI世界的标注猿    上一篇文章我们从"环境感知"数据的采集设备上进行了详细说明,已经了解了相应设备采集的数据及采集前 ...

  4. 一种改进的高光谱图像CEM目标检测算法

    一种改进的高光谱图像CEM目标检测算法 人工智能技术与咨询 来源:< 应用物理> ,作者付铜铜等 关键词: 高光谱图像:光谱重排:CEM算法:目标检测: 摘要: 约束能量最小化(Const ...

  5. 目标检测论文解读复现之十五:基于YOLOv5的光学遥感图像舰船 目标检测算法

    前言 此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读最新目标检测算法论文,帮 ...

  6. 目标检测论文解读复现之五:改进YOLOv5的SAR图像舰船目标检测

    目标检测论文解读复现 文章目录 目标检测论文解读复现 前言 一.摘要 二.网络模型及核心创新点 三.应用数据集 四.实验效果(部分展示) 五.实验结论 六.投稿期刊介绍 前言 此前出了目标改进算法专栏 ...

  7. 目标检测论文解读复现之十一:基于特征融合与注意力的遥感图像小目标检测

    前言 此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读最新目标检测算法论文,帮 ...

  8. SAR图像飞机目标检测识别进展

    目标检测与识别是高分辨合成孔径雷达(SAR)领域的热点问题.机场上飞机作为一种典型目标,其检测与识别具有一定的独特性.在检测与识别的过程中,如何将深度学习和目标电磁散射机理结合.提高网络或模型的泛化能 ...

  9. 基于超分辨率的遥感图像小目标检测

    这是一篇基于遥感图像小目标检测的文章,没有代码,只是为了学习学习思路而已,这篇文章针对遥感图像小目标检测困难问题,提出了一种模型,即将原始图像和简化后的图像同时输入检测网络,设计了简化后的图像超分辨率 ...

  10. 文献3 基于改进型YOLOv3的SAR图像舰船目标检测

    基于改进型YOLOv3的SAR图像舰船目标检测 0.概述 本文主要介绍了新提出的一种改进型YOLOv3的SAR图像船舰目标检测方法,此方法依据船舰尺寸与形状自适应采样的可变形卷积.ResNet50变体 ...

最新文章

  1. Python简介及安装
  2. pytorch relu6
  3. CountDownLatch 的使用 || enum 枚举使用的小技巧
  4. Android Configuration change引发的问题及解决方法
  5. 二叉树的先序建树后序输出
  6. ABP入门系列(17)——使用ABP集成的邮件系统发送邮件
  7. wordpress-黑格网址blackgrid导航主题模板
  8. 发现《后端架构师技术图谱》
  9. kali安装图像处理软件
  10. turbo编译码c语言,Turbo码的编译码原理及仿真.pdf
  11. 如何批量查询excel中的手机号归属地?
  12. LabVIEW编程LabVIEW开发高级数据采集技术 操作数字IO 例程与相关资料
  13. [计算机毕业设计]元学习方法的小样本图像分类算法
  14. 基于JMF录制和播放视频源码
  15. linux嵌入式开发位置,RedHat 系列 Linux 安装后,建立嵌入式开发环境
  16. Python相关库的安装
  17. unity获取麦克风音量_Unity调取移动端的麦克风进行录音并播放
  18. 使用JAVA进行ad域身份验证常用属性详解
  19. web前端-JS(DOM、BOM)
  20. Unity虚拟天文馆

热门文章

  1. java实现在线预览word(docx)功能
  2. cpu压测 windows_小白求问怎么用AIDA64进行CPU压力测试
  3. Centos7 镜像资源下载
  4. CAS单点登录原理解析
  5. mysql密码怎么解密_MySQL密码加密与解密详解
  6. IDEA 插件开发 鼠标事件
  7. python解析excel函数
  8. 教程篇(7.0) 02. FortiGate基础架构 SD-WAN本地分汇 ❀ Fortinet 网络安全专家 NSE 4
  9. 爬取飞猪IP免费代理练习
  10. QCC300x 芯片ota升级PSKey 操作方法