我正在使用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计算机科学系,密歇根理工学院。
答案 0 :(得分:1)
本文解释了2.3节中的计算过程。您不需要从evalfis
获得的非离散或质心值。我假设你已经制定了所有必须给出16个类中的一个作为输出的规则。这意味着每个输出类都与至少一个规则相关联。根据该论文,你需要:
要实现这一点,我们不能依赖基于质心的去模糊化价值。我检查了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