Matlab 超像素聚类

Matlab 超像素聚类,matlab,image-processing,image-segmentation,Matlab,Image Processing,Image Segmentation,我有一个关于超像素聚类的家庭作业,我在这方面有一些困难。我只允许使用VLFeat库查找超级像素 在找到超像素后,我为每个超像素定义一个特征向量,该特征向量带有值;[(超级像素中所有像素的平均“R”值)(超级像素中所有像素的平均“G”值)(超级像素中所有像素的平均“B”值)(超级像素中所有像素的平均“色调”值)(超级像素中所有像素的平均“饱和度”值)(超级像素中所有像素的平均“值”) 之后,我将特征向量和簇号发送到内置的kmeans函数中,以对超级像素进行聚类 function [] = seg

我有一个关于超像素聚类的家庭作业,我在这方面有一些困难。我只允许使用VLFeat库查找超级像素

在找到超像素后,我为每个超像素定义一个特征向量,该特征向量带有值;[(超级像素中所有像素的平均“R”值)(超级像素中所有像素的平均“G”值)(超级像素中所有像素的平均“B”值)(超级像素中所有像素的平均“色调”值)(超级像素中所有像素的平均“饱和度”值)(超级像素中所有像素的平均“值”)

之后,我将特征向量和簇号发送到内置的kmeans函数中,以对超级像素进行聚类

function [] = segmentIt (impath, clusNum)

%run vlfeat tools%    
run ('vlfeat/toolbox/vl_setup');

%read input image%
image = imread (impath);
imDouble = im2double (image);

%save image W and H%
IH = size (image, 1);
IW = size (image, 2);

%convert input image to single%
imSingle = im2single (image);

%get superpixel data%
superPixels = vl_slic (imSingle, 80, 1);

%how many superpixel do we have?%
SPNUM = size (unique (superPixels), 1);

%changing color space for feature vector%
imHSV = rgb2hsv (image);

%create feature vector with [averageR averageG averageB averageH averageS averageV]%
FEATURE = zeros (SPNUM, 6);

for i=0:SPNUM-1
    K = find (superPixels == i);
    L = zeros (size(K,1), 2);
    L(:,1) = ceil (K(:,1) ./ IW);
    L(:,2) = mod(K(:,1), IW) + 1;
    intensityTotalR = 0;
    intensityTotalG = 0;
    intensityTotalB = 0;
    vTotal = 0;
    sTotal = 0;
    hTotal = 0;

    for j = 1 : size (L, 1)
        intensityTotalR = intensityTotalR + ( imDouble (L(j,1), L(j,2), 1));
        intensityTotalG = intensityTotalG + ( imDouble (L(j,1), L(j,2), 2));
        intensityTotalB = intensityTotalB + ( imDouble (L(j,1), L(j,2), 3));
        vTotal = vTotal + imHSV (L(j,1), L(j,2), 3);
        sTotal = sTotal + imHSV (L(j,1), L(j,2), 2);
        hTotal = hTotal + imHSV (L(j,1), L(j,2), 1);
    end

    FEATURE(i+1,:) = [intensityTotalR/size(L,1) intensityTotalG/size(L,1) intensityTotalB/size(L,1) vTotal/size(L,1) sTotal/size(L,1) hTotal/size(L,1)]; 
end

RESULT = kmeans (FEATURE, clusNum);
newIMAGE = zeros(IH, IW, 3);
colorMultiplier = 1/(clusNum+5);

for i=1:clusNum
    K = find (RESULT == i);
    for j = 1: size (K,1)

        L = find (superPixels == K(j,1));
        S = zeros (size(L,1), 2);
        S(:,1) = ceil (L(:,1) ./ IW);
        S(:,2) = ceil (mod (L(:,1), IW)) + 1;

        for z = 1:size(S,1)
            newIMAGE (S(z,1), S(z,2), 1) = colorMultiplier * i;
            newIMAGE (S(z,1), S(z,2), 2) = colorMultiplier * i;
            newIMAGE (S(z,1), S(z,2), 3) = 1;
        end

    end
end

imshow (newIMAGE)

end
运行我的函数后,生成的图像似乎不是很好。知道我的代码中缺少了什么吗

结果图像:

编辑

好吧,真奇怪。我回忆起我的超级像素,这就是我得到的

编辑-2

我根据列侬310所说的内容编辑了我的代码。还有沃拉。问题是我使用find()函数的方式

这是群集数等于5时的结果

从现在起,我将尝试升级我的特征向量以获得更好的结果。
谢谢
lennon310

我觉得代码不错
colorMultiplier*i
作为小于1的值,
imshow
应该可以,但是使用
imagesc
仔细检查以观察差异,尽管可能没有视觉差异

不看一下你的形象,就不容易指出原因。您如何定义聚类结果的“好”?聚类方法对特征密度、大小和使用的度量非常敏感。我总是喜欢用它来展示不同的聚类算法是如何导致激烈的分割结果的(不幸的是,示例中没有k-means)。如果k-means的分割与您的期望相差甚远,您可能只需要尝试其他方法

编辑

如果您使用的是k-means,也许您可以在完全实现之前减少该特性。例如,您可以只使用RGB空间功能,并通过将
'Replicates'
设置为较小的数字来减少迭代,在继续下一步之前,观察分割结果

给定超级像素,你能恢复原始图像吗?如果是,您可以尝试通过
重塑
方法查看
结果
的图像。这可以测试
kmeans
在您最终在
newIMAGE

EDIT2

改变

K = find (superPixels == i);
L = zeros (size(K,1), 2);
L(:,1) = ceil (K(:,1) ./ IW);
L(:,2) = mod(K(:,1), IW) + 1;


希望这篇文章不会太晚引起你的兴趣。使用SLIC+分组,我有一些问题需要解决。但我发现一些修改可能会带来更好的结果:

  • 如果只使用RGB或HSV进行聚类,结果会比使用它们的组合更好,原因可能是它们的比例不同
  • 如果您不确定要获得多少段,可以使用均值偏移而不是k-均值
  • 对于RGB,使用中值而不是平均值,您可能会获得更好的结果
  • 下面的代码可能会稍微提高速度:

    函数[newSegs]=支持vl(输入im)


  • 谢谢你的回复。这是我的形象和结果;图片:结果:谢谢你,二汉。这是一个很好的资源。你的结果是从那只鸟分割出来的吗?为什么会有这么多的周期模式?我对这个网站很陌生,我已经编辑了三次我的评论:)我写了完全相同的东西,我得到了一些模式。是的,这是鸟类图像的结果。我认为我在一些循环中使用了错误的值。你同意吗?我在你的帖子上添加了这张图片,并更新了我对建议的回答。可能迭代次数太多,或者kmeans不是一个好的选择。正如我的回答所说,您可以先尝试减少功能。谢谢,非常感谢列侬。我会试试你说的。我不能投票赞成你的答案,因为我的声誉太低,不能这样做。对不起,太好了!不客气!
    [K1,K2] = find (superPixels == i);
    L = zeros (length(K1), 2);
    L(:,1) = K1;
    L(:,2) = K2;
    
    %SUPP compute the superpixel using vl feat function
    
    imDouble = im2double (input_im);
    
    %save image W and H%
    IH = size (imDouble, 1);
    IW = size (imDouble, 2);
    
    %convert input image to single%
    imSingle = im2single (imDouble);
    
    %get superpixel data%
    segments = vl_slic (imSingle, 80, 1);
    
    %how many superpixel do we have?%
    SPNUM = size (unique (segments), 1);
    %SPNUM=max(segments(:));
    
    %changing color space for feature vector%
    imHSV = rgb2hsv (imDouble);
    
    %create feature vector with [averageR averageG averageB averageH averageS averageV]%
    FEATURE = zeros (SPNUM, 6);
    
    for i=0:SPNUM-1
        [K1,K2] = find (segments == i);
        sz=length(K1);
    
         intRGB= imDouble([K1,K2,ones(sz,1)]);
         intHSV=(imHSV([K1,K2,ones(sz,1)]));
    
        FEATURE(i+1,:) = [ sum( intRGB(:,1))/sz sum(intRGB(:,2))/sz sum(intRGB(:,3))/sz sum(intHSV(:,1))/sz sum(intHSV(:,2))/sz sum(intHSV(:,3))/sz];
    end
    
    clusNum=SPNUM/2;
    
    RESULT = kmeans (FEATURE, ceil( clusNum));
    newIMAGE = zeros(IH, IW, 3);
    newSegs=zeros(IH,IW);
    colorMultiplier = 1/(clusNum+5);
    
    for i=1:clusNum
        K = find (RESULT == i);
        valid_segs=zeros(IH,IW);
        for j = 1: size (K,1)
    
    
            valid_segs=valid_segs+(segments== K(j));
    
    
    
        end
    
        newIMAGE (valid_segs~=0) = colorMultiplier * i;
        newSegs(valid_segs~=0)=i;
    end
    
    imshow (newIMAGE)
    
    end