我遇到了一些麻烦,因为我是新概念图像分析和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
这些代码必须加宽此图片:
然而,在某些方面它无法正常工作s.t:
如果你帮我修改我的代码,我会很高兴。如果您想了解扩张,可以按照以下网址进行操作:http://www.mathworks.com/help/toolbox/images/f18-12508.html
Matlab在其库中具有此功能,但我需要实现自己的功能。
答案 0 :(得分:4)
你应该在matlab中尽可能地避免循环。
如果您需要编写自己的函数,请执行以下操作:
s=ones(3);
i=(conv2(double(binaryImage),s,'same')>0)
从你的例子:
我可以获得:
答案 1 :(得分:3)
我会给出一个提示。问问自己int8()
对于大于127的数字究竟做了什么。顺便提一下,你的算法开始表现奇怪的列索引号。
编辑以澄清
如果您从另一个中减去int8
类型编号,在这种情况下为double
,则Matlab将自动转换为int8
。例如:
test = double(140) - int8(3)
给出127。
答案 2 :(得分:1)
我假设imdilate是用conv2实现的,但是如果你使用它,你的代码会更具可读性:
b = imdilate(bwImage,ones(3));