模糊彩色图像分割:: Matlab

时间:2012-12-22 18:06:47

标签: image matlab colors image-segmentation fuzzy-logic

我正在使用Matlab模糊工具箱在HSV色彩空间中进行彩色图像分割。 目标是读取RGB图像 - >转换为hsv->使用H,S,V值作为模糊系统的输入,然后找到该像素属于哪个类(这里是我们的16个恒定输出颜色)。 这是模糊系统:

“推理程序基于零阶Takagi-Sugeno模型,因此每个模糊规则的后续部分是该组{黑色,白色,红色,橙色等}的清晰离散值。 由于该模型有10个模糊集用于Hue,5个用于饱和度,4个用于值,因此该模型所需的规则总数为10 * 5 * 4 = 200“。(1)

当我在程序中使用此行获取输出值时出现问题

segimg=reshape(evalfis([h s v],hsvRuleSugeno),imgh,imgw);

输出不是我的任何常规类,因为它使用质心进行去模糊化,如下所示,我不能依赖它作为输出!

http://i50.tinypic.com/dwzxhi.jpg

我搜索了很多论文和网站,但我认为这很简单,没有人解释它!我遗失了一些东西,或者我可能没有足够的知识,请你帮我理解这个问题吗?

参考: (1):使用模糊逻辑的基于人类感知的颜色分割,Lior Shamir计算机科学系,密歇根理工学院。

2 个答案:

答案 0 :(得分:1)

本文解释了2.3节中的计算过程。您不需要从evalfis获得的非离散或质心值。我假设你已经制定了所有必须给出16个类中的一个作为输出的规则。这意味着每个输出类都与至少一个规则相关联。根据该论文,你需要:

  1. 制作包含与每个输出类关联的规则的16个组。一组为黄色,一组为白色,一组为黑色......
  2. 计算每条规则的强度。
  3. 对于每个组,查找该组中包含的所有规则的强度值的总和。
  4. 然后找到包含其规则的最大累积强度总和的组。
  5. 要实现这一点,我们不能依赖基于质心的去模糊化价值。我检查了evalfis上的文档,下面是应该能够执行上述算法的脚本。想法是收集每个规则的强度,根据规则的输出类将规则分组,然后找到每个组的总和并找到最大值。

    [output, IRR, ORR, ARR] = evalfis(input, fismat)
    m = cat(2, ORR, ARR);
    m = sortrows(m, 1)
    
    r = [];
    for l = 2 : size(m, 1)
        if m(l, 1) ~= m(l - 1, 1)
            r = cat(1, r, m(l - 1, :));
        else
            m(l, 2) = m(l, 2) + m(l - 1, 2);
        end
    end
    
    if size(m, 1) >= 2
        r = cat(1, r, m(size(m, 1), :));
    end
    
    % r now contains the final class to be choosen
    disp(r)
    

答案 1 :(得分:0)

非常感谢您的回答Shivam, 实际上你的代码有错误,但我明白并开始研究它,最后发现了怎么做!这是我用的,结果还可以!现在我必须努力调整规则以获得更好的结果

for i=1:imh
    for j=1:imw
        [output, IRR, ORR, ARR] = evalfis([h(i,j);s(i,j);v(i,j)], hsvRuleSugeno);
        m = cat(2,ARR,ORR);
        [trash,idx] = unique(m(:,1),'first');
        out = m(sort(idx),:);
        out(:,[1,2])=out(:,[2,1]);
        out = sortrows(out, 1);
         res=zeros(size(out));
           for l = 2 : size(out, 1)
                if out(l, 1) == out(l - 1, 1)
                res(l-1,1) = out(l-1,1);
                res(l-1,2) = out(l-1,2)+out(l,2);
                else
                res(l,1) = out(l,1);
                res(l,2) = out(l,2);  
                end
           end
           [num idx] = max(res(:,2));
           [x y] = ind2sub(size(res),idx);
          segimg(i,j)=res(x,y)/10;    
    end
end

细分结果:http://i45.tinypic.com/2aj9mg.jpg