【问题标题】:Why my binary image dilation function doesn't work properly?为什么我的二值图像膨胀功能无法正常工作?
【发布时间】:2012-02-25 13:12:34
【问题描述】:

我遇到了一些麻烦,因为我是新概念图像分析和工具 Matlab。 我脑子里想的不是代码行。

我正在尝试对二值图像进行膨胀函数。它必须扩大给定的二值图像。

这是我的主页:

I = imread('logo_XXXX.png');
binaryImage = im2bw(I, 0.4);
s = ones(3,3,'int8');
i = dilate(binaryImage,s);
figure, imshow(i);

这是 dilate.m 函数:

function [i] = dilate(I,s)
[Irows,Icols] = size(I);
i=I;
Itemp = I;
for row=1:Irows
    for col=1:Icols
        x = intersectAt(Itemp,s,row,col);
        if x == 1
            i(row,col)=1;
        else
            i(row,col)=0;
        end
    end
end

这是 istersectAt.m 函数:

function [i] = intersectAt(I,s,row,col)
[Srows,Scols] = size(s);
[Irows,Icols] = size(I);
i=0;
rowx = row - int8(Srows/2);
colx = col - int8(Scols/2);

for r=1:Srows
    for c=1:Scols
        if rowx+r <= 0 || rowx+r > Irows || colx+c <= 0 || colx+c > Icols
            continue;
        elseif I(rowx+r,colx+c) == 1 && s(r,c)==1
            i = 1;
        end
    end
end

这些代码必须加宽此图像:

然而,在某些时候它不能正常工作:

如果你帮我修复我的代码,我会很高兴的。如果你想了解扩张,可以关注这个网址:http://www.mathworks.com/help/toolbox/images/f18-12508.html

Matlab 的库中有这个函数,但我需要实现自己的函数。

【问题讨论】:

    标签: matlab image-processing matrix computer-vision


    【解决方案1】:

    在matlab中应该尽量避免循环。

    如果您需要编写自己的函数,请执行以下操作:

    s=ones(3);
    i=(conv2(double(binaryImage),s,'same')>0)
    

    从你的例子:

    我可以获得:

    【讨论】:

    • 这个语句实际上是做什么的?你能提供一个简短的信息吗?我会很高兴的。
    • 它与您的过滤器 s 进行卷积。然后取所有大于零的值。
    • 好的,感谢您的帮助。我真的很喜欢你的回答,它很完美。但是,我的导师不会接受我的作业的这个答案。我需要编写尽可能低级别的代码。
    • 在这种情况下,我的政策是不回答作业的问题。如果你想学习,你应该自己做。显然,您的代码适用于图像的左半部分。所以你应该只是有一个索引问题。
    • 我正在寻找一个索引问题三个小时,但我找不到任何问题。然后,我认为可能有与Matlab相关的错误,因为我今天才开始研究Matlab :)
    【解决方案2】:

    那我给个提示。问问自己int8() 对大于 127 的数字究竟做了什么。顺便提一下,在您的算法开始表现怪异之后的列索引号。

    编辑澄清

    如果你从另一个中减去一个int8 类型号,在这种情况下是一个double,Matlab 将自动转换为int8。例如:

    test = double(140) - int8(3)
    

    给出 127。

    【讨论】:

      【解决方案3】:

      我假设 imdilate 是用 conv2 实现的,但如果你使用这个,你的代码会更具可读性:

      b = imdilate(bwImage,ones(3));
      

      【讨论】:

      • 是的,我之前发布过完全相同的答案,但我已将其删除,因为他在问题的末尾说:Matlab has this function in its library but i need to implement my own function.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-29
      • 2022-01-18
      相关资源
      最近更新 更多