首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >超像素聚类

超像素聚类
EN

Stack Overflow用户
提问于 2014-01-08 21:01:38
回答 2查看 5.8K关注 0票数 3

我有一篇关于超像素聚类的作业,我在这方面有一些困难。我被允许使用VLFeat库来查找超像素。

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

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

代码语言:javascript
复制
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

我根据lennon310的说法编辑了我的代码。还有沃拉。问题在于我使用find()函数的方式。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-08 21:37:31

密码在我看来不错。colorMultiplier * i作为一个小于1的值,imshow应该很好,但要与imagesc反复检查观察差异,虽然可能没有视觉上的差异。

不看你的形象,要指出原因是不容易的。如何定义聚类结果的“良好”?聚类方法对特征密度、大小和使用的度量非常敏感。我总是喜欢使用这幅图像来展示不同的聚类算法是如何导致激烈的分割结果的(不幸的是,在这个例子中没有k-均值)。可能你只需要尝试其他的方法,如果从k-均值分割远离你的期望。

编辑

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

给定超像素,你能恢复原始图像吗?如果是,您可以尝试通过RESULT方法查看reshape的图像。这可以在您最终在kmeans中设置值之前测试newIMAGE是否正常工作。

EDIT2

变化

代码语言:javascript
复制
K = find (superPixels == i);
L = zeros (size(K,1), 2);
L(:,1) = ceil (K(:,1) ./ IW);
L(:,2) = mod(K(:,1), IW) + 1;

代码语言:javascript
复制
[K1,K2] = find (superPixels == i);
L = zeros (length(K1), 2);
L(:,1) = K1;
L(:,2) = K2;
票数 3
EN

Stack Overflow用户

发布于 2015-08-08 13:10:46

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

  1. 如果只使用RGB或HSV进行聚类,结果将比使用它们的组合更好,原因可能是它们在规模上有所不同。
  2. 如果您不确定要得到多少段,则可以使用均值移位而不是k-表示。
  3. 对于RGB,使用中位数而不是平均值可以得到更好的结果。
  4. 下面的代码可能会提高速度安静一点: 函数newSegs = supp_vl( input_im ) %SUPP使用vl函数imDouble = im2double (Input_im)计算超像素;%保存图像W和H% IH = size (imDouble,1);IW = size (imDouble,2);将输入图像转换为单% imSingle = im2single (imDouble);%get超像素数据%段= vl_slic (imSingle,80,1);%用averageR averageG averageB averageH averageS平均生成特征向量V%averageS=0 (SPNUM,6);for i=0:SPNUM-1 K1,K2 = find (分段== i);sz=length(K1);intRGB= imDouble(K1,K2,1(sz,1));intHSV=(imHSV(K1,intHSV=,1));特征(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;intRGB= kmeans (特征,ceil( clusNum));newIMAGE = zeros(IH,IW,3);newSegs=zeros(IH,IW);newSegs=zeros(IH,IW);colorMultiplier =1/(NewIMAGE);对于i=1:clusNum K= find ( == i);valid_segs=zeros(IH,IW);对于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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21006428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档