【问题标题】:Fuzzy Color Image Segmentation ::Matlab模糊彩色图像分割 ::Matlab
【发布时间】:2012-12-09 22:12:37
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案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)
    

    【讨论】:

    • 亲爱的 shivam 如果 size(m, 1) >= 2 r = cat(1, r, m(size(m, 1), :)),我的这部分代码会出错;结尾 ???错误使用 ==> cat CAT 参数尺寸不一致。
    • 感谢它现在可以工作了 :) 但我写的代码运行速度快了 3 秒(19.5 秒),对于 53*256 RGB 图像。但无论如何,这样的小图片需要很多时间!你对此有什么想法吗?也许使用 LUT 会有所帮助。
    • @Amir LUT 可以考虑,但不确定它是否真的会有所改善。可能对于较大的图像,您可以在块级别而不是像素级别上应用分割。顺便说一句,我正在尝试复制相同的分割技术,你介意给我fis 文件吗?
    • 我从来没有做过块分割,看起来很有趣 :D 你需要规则吗?因为其余的不是很复杂,但是我会给你.Fis文件,里面有200条规则我不得不提一下规则还不精确,我正在调整它们以获得最好的结果。我如何联系你?
    【解决方案2】:

    非常感谢您的回答 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

    【讨论】:

    • 太棒了。很高兴我能帮助你。顺便一提。我正在研究道路标志检测,我发现这种分割技术非常有用。您介意发送您的 FIS 文件吗?
    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 2017-04-20
    • 2017-11-16
    • 2020-01-31
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    相关资源
    最近更新 更多