为什么我的二进制图像扩张功能无法正常工作?

时间:2012-02-25 13:12:34

标签: matlab image-processing matrix computer-vision

我遇到了一些麻烦,因为我是新概念图像分析和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

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

enter image description here

然而,在某些方面它无法正常工作s.t:

enter image description here

如果你帮我修改我的代码,我会很高兴。如果您想了解扩张,可以按照以下网址进行操作:http://www.mathworks.com/help/toolbox/images/f18-12508.html

Matlab在其库中具有此功能,但我需要实现自己的功能。

3 个答案:

答案 0 :(得分:4)

你应该在matlab中尽可能地避免循环。

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

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

从你的例子:

enter image description here

我可以获得:

enter image description here

答案 1 :(得分:3)

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

编辑以澄清

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

test = double(140) - int8(3)

给出127。

答案 2 :(得分:1)

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

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

Before After