我正在尝试将图割方法应用于我的分割任务。我在以下位置找到了一些示例代码 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/