matlab - 使用 Matlab 进行图割

标签 matlab graph image-segmentation

我正在尝试将图割方法应用于我的分割任务。我在以下位置找到了一些示例代码 Graph_Cut_Demo

部分代码如下

img = im2double( imread([ImageDir 'cat.jpg']) ); 
[ny,nx,nc] = size(img); 
d = reshape( img, ny*nx, nc );  
k = 2; % number of clusters 
[l0 c] = kmeans( d, k ); 
l0 = reshape( l0, ny, nx ); 

% For each class, the data term Dc measures the distance of 
% each pixel value to the class prototype. For simplicity, standard 
% Euclidean distance is used. Mahalanobis distance (weighted by class 
% covariances) might improve the results in some cases.  Note that the 
% image intensity values are in the [0,1] interval, which provides 
% normalization.   

Dc = zeros( ny, nx, k ); 
for i = 1:k 
  dif = d - repmat( c(i,:), ny*nx,1 ); 
  Dc(:,:,i) = reshape( sum(dif.^2,2), ny, nx ); 
end 

看来该方法使用了k-means聚类来初始化图并得到数据项Dc。但是,我不明白他们如何计算这个数据项。他们为什么使用

dif = d - repmat( c(i,:), ny*nx,1 ); 

在评论中你说数据项Dc测量每个像素值到类原型(prototype)的距离。类原型(prototype)是什么,为什么可以通过k-means标签来确定?

在另一个实现中Graph_Cut_Demo2 ,它使用了

% calculate the data cost per cluster center
Dc = zeros([sz(1:2) k],'single');
for ci=1:k
    % use covariance matrix per cluster
    icv = inv(cov(d(l0==ci,:)));    
    dif = d- repmat(c(ci,:), [size(d,1) 1]);
    % data cost is minus log likelihood of the pixel to belong to each
    % cluster according to its RGB value
    Dc(:,:,ci) = reshape(sum((dif*icv).*dif./2,2),sz(1:2));
end

这让我很困惑。他们为什么计算协方差矩阵以及如何使用负对数似然形成数据项?有可用于这些实现的论文或描述吗?

非常感谢。

最佳答案

两个图切分割示例都密切相关。 Image Processing, Analysis, and Machine Vision: A MATLAB Companion的作者本书(第一个示例)使用了图割包装代码 Shai Bagon (自然得到了作者的许可)-第二个例子。

那么,数据术语到底是什么?
数据项表示每个像素独立如何可能属于每个标签。这就是使用对数似然项的原因。

更具体地说,在这些示例中,您尝试根据颜色将图像分割为 k 个片段。 您假设图像中只有 k 个主色(不是一个非常实用的假设,但足以用于教育目的)。 使用k - 意味着您尝试找出这两种颜色是什么。 k-means 的输出是 RGB 空间中的 k 个中心 - 即 k “代表性”颜色。 每个像素属于任何 k 中心的可能性与像素距代表性 k 中心的距离(在颜色空间中)成反比:距离越大,像素属于第 k 个中心的可能性就越小,为了将该像素分配给第 k 个中心而必须“付出”的一元能量惩罚就越高 -第一个集群。
第二个示例将这一概念向前推进了一步,并假设 k 个簇在颜色空间中可能具有不同的密度,使用每个簇的协方差矩阵对二阶行为进行建模。

在实践中,人们对每个分段使用更复杂的颜色模型,通常是高斯的混合。您可以在 GrabCut 的开创性论文中阅读相关内容。 (第 3 节)。

附注,
下次你可以直接给 Shai Bagon 发邮件询问。

关于matlab - 使用 Matlab 进行图割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25976311/

相关文章:

matlab - 运行 ode45 时模拟挂起

android - 如何将另一个 View 膨胀到 LinearLayout 中?

Java:如何表示图形?

math - 点中的图像渐变

tensorflow - Deeplab 我的自定义数据集的权重标准是什么?

arrays - 在 Matlab 中创建二进制矩阵,报告数量不断增加

matlab - 如何使用两个矩阵计算余弦相似度

java - 使用表中可更改值的数据在 achartengine 中绘制用户数据时出现问题

matlab - 如何将图像转换为字符段?

user-interface - 你能限制哪些字符可以输入到 MATLAB GUI 编辑框中吗?