【问题标题】:K-means and EM algorithmsK-means 和 EM 算法
【发布时间】:2015-08-16 21:05:29
【问题描述】:

如何在不调用 openCV 函数进行图像分割的情况下实现 k-means 和 EM 算法?

我从这段代码开始:

#include opencv2/highgui/highgui.hpp
#include iostream

using namespace cv;
using namespace std;

int main()
{
    Mat img = imread("testImage.png", 0);
    Mat label_img;
    label_img.create(img.cols, img.rows, CV_8UC1);
}

我该如何继续?

【问题讨论】:

  • 好的开始,继续……
  • 谢谢,但是如何在不调用 openCV 函数进行图像分割的情况下实现 k-means 和 EM 算法?
  • 通过编码下一步。试一试,如果遇到问题,请回来看看我们。
  • 好的,我如何在没有实现的情况下开始编码! ..我应该首先知道我该如何实现它

标签: c++ opencv cluster-analysis k-means image-segmentation


【解决方案1】:

K-means 的工作非常简单,只需迭代两个步骤直到收敛,即 E-step 和 M-step。

初始化:

将每个像素随机分配给k 集群之一。也就是说,为label_img 中的每个条目随机选择一个数字[0..k-1]

期望(E-step)

给定将像素分配给集群 (label_img),您可以计算每个集群的中心(只是分配给该集群的像素值的平均值)。
在此阶段结束时,您将拥有指向 k 集群中心的 k 向量。

最大化(M-step)

一旦有了k 簇,您就可以计算每个像素到k 中心的距离,并将其分配(通过更改label_img 中的相应条目)到最接近像素的中心。
在此阶段结束时,您将为每个像素分配一个新的簇(label_img 的新值)

您需要重复这两个步骤,直到label_img 不再更改或者您超过了预定义的迭代次数。

【讨论】:

  • 嗨@Shai,感谢您的帮助..请查看我的代码中缺少什么我已在答案部分添加了代码
  • @faho0odywbas 首先,请不要发布代码作为答案,编辑您的问题以反映您的进度。其次,k-means 是 EM 算法的一个例子。三、尝试为每一步实现一个函数:init、e-step和m-step
  • 嗨 @Shai 先生,对不起,我不知道如何将代码添加为注释,因为当我在这里添加时,它看起来并不清晰......现在你的意思是让 k 意味着作为初始步骤? ,, 如果是这样,我该怎么做?
  • @faho0odywbas 我的意思不是评论。只需编辑问题本身以反映您的进度。
【解决方案2】:
include <opencv2/highgui/highgui.hpp>
include <iostream>

using namespace cv;
using namespace std;

void kmeans(const Mat frame, Mat label) {
}

void em(const Mat frame, const Mat label, Mat new_label) {
}

void main()
{
Mat frame;
Mat label_img;
Mat em_label;

frame = imread("testImage.png", 0);

kmeans(frame, label_img);

em(frame, label_img, em_label);
label_img.create(frame.cols, frame.rows, CV_8UC1);

label_img.ptr<float>(25)[30] = 0;
label_img.ptr<float>(25)[31] = 255;

}

【讨论】:

    猜你喜欢
    • 2017-04-26
    • 2013-07-03
    • 2010-12-05
    • 2017-04-20
    • 2013-04-22
    • 2011-09-15
    • 2017-04-27
    相关资源
    最近更新 更多