如何设置K-means openCV c++的初始中心

2024-05-09

我正在尝试使用 OpenCv 和 Kmeans 对图像进行分割,我刚刚实现的代码如下:

#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>

using namespace std;
using namespace cv;

int main(int, char** argv)
{
    Mat src, Imagen2, Imagris, labels, centers,imgfondo;
    src = imread("C:/Users/Sebastian/Documents/Visual Studio 2015/Projects/ClusteringImage/data/leon.jpg");
    imgfondo = imread("C:/Users/Sebastian/Documents/Visual Studio 2015/Projects/ClusteringImage/data/goku640.jpg");
    if (src.empty()|| imgfondo.empty())
    {
        printf("Error al cargar imagenes");
        waitKey();
        return -1;
    }
    Mat samples(src.rows * src.cols, 3, CV_32F);
    for (int y = 0; y < src.rows; y++)
        for (int x = 0; x < src.cols; x++)
            for (int z = 0; z < 3; z++)
                samples.at<float>(y + x*src.rows, z) = src.at<Vec3b>(y, x)[z];
    //KMEANS_USE_INITIAL_LABELS
    kmeans(samples, 2, labels, TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 10, 1.0), 3, KMEANS_USE_INITIAL_LABELS, centers);
    Mat new_image(src.size(), src.type());
    int cluster;
    if (centers.at<float>(0, 1) > centers.at<float>(1, 1))  cluster = 0;
    else        cluster = 1;
    for (int y = 0; y < src.rows; y++)
        for (int x = 0; x < src.cols; x++)
        {
            int cluster_idx = labels.at<int>(y + x*src.rows, 0);
            if (cluster_idx == cluster)
            {
                new_image.at<Vec3b>(y, x)[0] = imgfondo.at<Vec3b>(y, x)[0];
                new_image.at<Vec3b>(y, x)[1] = imgfondo.at<Vec3b>(y, x)[1];
                new_image.at<Vec3b>(y, x)[2] = imgfondo.at<Vec3b>(y, x)[2];
            }
            else
            {
                new_image.at<Vec3b>(y, x)[0] = src.at<Vec3b>(y, x)[0];
                new_image.at<Vec3b>(y, x)[1] = src.at<Vec3b>(y, x)[1];
                new_image.at<Vec3b>(y, x)[2] = src.at<Vec3b>(y, x)[2];
            }
        }
    imshow("Original image", src);
    imshow("clustered image", new_image);
    waitKey();
}

它工作得很好并且可以满足我的要求,但我想设置我自己的初始中心值。我读到可以使用标志“KMEANS_USE_INITIAL_LABELS”来完成,但我不太确定如何使用它,以及应该如何以及在哪里设置初始值。 谢谢。


该功能允许您直接设置初始值labeling, not centers。幸运的是,自从k-means 在分配和更新步骤之间交替 https://en.wikipedia.org/wiki/K-means_clustering#Algorithms,就可以间接得到你想要的效果。


From the docs http://docs.opencv.org/2.4/modules/core/doc/clustering.html:

labels– 输入/输出整数数组,存储每个样本的簇索引。

KMEANS_USE_INITIAL_LABELS在第一次(也可能是唯一一次)尝试期间,使用用户提供的标签,而不是从初始中心计算它们。对于第二次和进一步的尝试,请使用随机或半随机中心。使用 KMEANS_*_CENTERS 标志之一来指定确切的方法。

所以,文档说的是你可以设置初始值labeling。如果你想这样做,请在你的代码中

kmeans(samples, 2, labels, TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 10, 1.0), 3, KMEANS_USE_INITIAL_LABELS, centers);

将第三个参数初始化为输入标签(用于第一次迭代)。


如果想得到设置初始中心的效果,可以这样做:

  1. 决定中心是什么。

  2. 像算法一样计算标签分配步骤 https://en.wikipedia.org/wiki/K-means_clustering#Algorithms.

  3. 将生成的标签传递给函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何设置K-means openCV c++的初始中心 的相关文章

随机推荐

  • `printf()` 中格式说明符“%qd”的用途是什么?

    我看到格式说明符 qd浏览时github https github com Microsoft clang blob master test Sema format strings c代码 然后我检查了 GCC 编译器 它工作正常 incl
  • recvfrom() 中的 addrlen 字段有何用途?

    我在程序中使用 recvfrom 从我在 src addr 中指定的服务器获取 DGRAM 数据 但是 我不确定为什么需要初始化并传入addrlen 我读了手册页 但不太明白它的意思 如果src addr不为NULL 并且底层协议提供了源地
  • Powershell Bash/Zsh 命令中的多个参数

    无法在 Powershell 中运行以下 Bash Zsh 命令 KeyPath Join Path Path this Plate ChildPath install tekton key kubectl create secret do
  • NSUndoManager 会撤消后台发生的更改吗?

    我有一个编辑视图控制器 我正在使用 NSUndoManager 它是我的持久性存储 核心数据项目 的一组 我的应用程序的功能之一是与外部服务器同步 我想知道的是 如果我正在视图中编辑某些内容 同时应用程序正在与服务器同步 如果我改变主意并决
  • 如何在java中访问USB端口[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试编写一个java应用程序来访问USB端口以读取和写入通过USB连接的设备 我面临的问题是我不
  • jQuery UI 滑动轻松同级推送

    我正在使用 jQuery UIslide切换 div 的切换效果 link click function targetDiv toggle slide direction up 1000 幻灯片是唯一具有我想要的动画的效果 本质上是 div
  • 我应该使用 和 吗?如果是,为什么以及如何使用?

    我一直在尝试正确使用 colgroup 和 col 标签 但我不明白 我阅读了规范和所有内容 但我不明白其目的或如何实现它 A colgroup用于table元素来帮助理解具有不规则标题的表中复杂的信息层次结构 WAI 有一个关于如何处理此
  • 在运行时更改蓝图或重新加载 Flask 应用程序

    我正在编写一个支持插件架构的 Flask 应用程序 每个插件都位于一个单独的文件夹中 并且是一个模块 该模块至少具有一个类 该类是一个子类Plugin班级 出于安全原因 我不想在 Flask 应用程序最初运行时加载所有插件 相反 用户可以从
  • Three.js 椭圆

    如何在 Three js 中创建一个椭圆 我看过这个 在 THREE js 中绘制椭圆 https stackoverflow com questions 11419896 drawing an ellipse in three js 但如
  • ndb.StructuredProperty 不调用 ndb.PolyModel 子类方法

    在将 ndb Polymodel 超类存储为 ndb StructuredProperty 时 我无法访问子类方法 相反 调用超类方法并引发 NotImplementedError 这是我想要完成的任务的删节版本 class Recipie
  • 是否可以使用Kafka传输文件?

    我每天都会生成数千个文件 我想使用 Kafka 进行流式传输 当我尝试读取该文件时 每一行都被视为一条单独的消息 我想知道如何将每个文件的内容作为 Kafka 主题中的单个消息 以及消费者如何将 Kafka 主题中的每条消息写入单独的文件中
  • QML 项目的 QtCreator 中未启用“运行”按钮

    我在Windows XP上使用基于QT 4 7 4 32位 的QTCreator 2 2 1 我从 new gt QML 项目菜单创建了一个 QML 项目 但 RUN 按钮未启用 如何运行 QML 项目 您是否创建了新的 QML 文件而不是
  • 为什么在强度降低乘法和循环进位加法之后,这段代码的执行速度会变慢?

    我正在读书阿格纳 雾 https en wikipedia org wiki Agner Fog s 优化手册 https en wikipedia org wiki Agner Fog Optimization 我遇到了这个例子 doub
  • 尝试使用资源/使用/多个资源

    我使用的 Java API 大量使用了 Autoclosable Interface 因此在 Java try with resources 中 然而在Java中你可以指定 try res1 res2 res3 我们有办法使用多种资源吗 它
  • Eclipse Package Explorer:隐藏部分长包名称?

    我一直在寻找一个让我烦恼了一段时间的 问题 但没有任何运气 我正在开发一个Android应用程序 其包名相当长com kennethbrodersen simplecaster 该项目包含许多子包 问题是所有这些包在包资源管理器中都显示有完
  • 如何获取日期格式的日期选择器值?

    我的日期选择器有问题 我使用代码来获取日期 月份和年份 如下所示 DatePicker datePicker datePicker DatePicker findViewById R id dateselect int day datePi
  • gensym 在 Lisp 中做什么?

    我听到一些同学谈论他们如何使用该功能gensym为此 我问他们它做了什么 甚至在网上查了一下 但我真的无法理解这个函数的作用是什么两者都不为什么或何时最好使用它 特别是 我对它在 Lisp 中的作用更感兴趣 谢谢你们 独特且未被拘禁的符号
  • FIND_IN_SET 具有多个值[重复]

    这个问题在这里已经有答案了 我想从数据库字段搜索多个值 以下是我的查询 SELECT FROM tablename WHERE FIND IN SET 12 13 15 15 category id 我如何搜索它对我不起作用 FIND IN
  • 将多个图像添加到 Word 文档的特定位置 OpenXML

    我正在使用 Office Open XML 并且必须在特定点添加图像 在文档上我有一个 标签 这样我就可以很好地找到它 但是 当我添加多个图像时 它会损坏文件 这是我的代码 修改自https msdn microsoft com en us
  • 如何设置K-means openCV c++的初始中心

    我正在尝试使用 OpenCv 和 Kmeans 对图像进行分割 我刚刚实现的代码如下 include opencv2 objdetect objdetect hpp include opencv2 highgui highgui hpp i