IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 【openv450-samples】像素点聚类EM & 图像聚类目标检测 -> 正文阅读

[人工智能]【openv450-samples】像素点聚类EM & 图像聚类目标检测

一、像素点聚类

#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 samples
        Mat 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 data
    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));
    //trainEM函数的功能和kmeans差不多,都是实现自动聚类,输出每个样本对应的标注值。但它比kmeans还多出一个功能,
    //就是它还能起到训练分类器的作用,用于后续新样本的预测
    em_model->trainEM(samples, noArray(), labels, noArray());//

    // 对每个图像像素进行分类classify every image pixel
    for (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 samples
    for (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

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-05-25 11:36:15  更:2022-05-25 11:36:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:47:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码