1

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

“推理过程基于零阶 Takagi-Sugeno 模型,因此每个模糊规则的结果部分是集合 {Black, White, Red, Orange,etc} 的清晰离散值。由于该模型有 10 Hue 模糊集,Saturation 5 个,Value 4 个模糊集,此模型所需的规则总数为 10*5*4=200"。(1)

问题是当我在我的程序中使用这一行来获取输出值时

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

输出不是我的任何常量类,因为它使用质心进行去模糊化,正如你在下面看到的,我不能依赖它作为输出!

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

参考: (1): Human Perception-based Color Segmentation Using Fuzzy Logic, Lior Shamir Department of Computer Science, Michigan Tech。

4

2 回答 2

1

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

  1. 制作 16 个组,其中包含与每个输出类关联的规则。一组黄色,一组白色,一组黑色,依此类推...
  2. 计算每条规则的强度。
  3. 对于每个组,找到该组中包含的所有规则的强度值的总和。
  4. 然后找到其包含的规则的累积强度和最大的组。

为了实现这一点,我们不能依赖基于质心的去模糊值。我检查了上面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)
于 2012-12-23T23:28:13.563 回答
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

于 2012-12-24T14:55:56.350 回答