【发布时间】:2014-07-03 10:23:57
【问题描述】:
我根据this paper的第一部分写了一段代码(关于轮廓检测)。但是,我的代码生成的图像与论文中显示的不同。我是图像处理的新手,因此我想也许有些东西我不完全理解。
我将写下论文所说的以及我是如何实现的,以便您查看是否有任何误解。
论文说:
我们建议使用局部方法来检查所选窗口 n * n 内的照明变化。我们通常使用 3 * 3 的窗口,我们将图像划分为许多相同大小的重叠区域。 对于这些区域中的每一个,我们计算了 8 像素邻域中像素强度值的平均值和标准偏差。
对于这部分我写了:
e=imread('1.jpg');
p=rgb2gray(e);
p=im2double(p);
h=[1 1 1;
1 1 1;
1 1 1;];
h=h/9;
u=imfilter(p,h);% average filter
Size=size(e);
n=3;
e=[1 1 1;
1 1 1;
1 1 1;];
Di=stdfilt(p,e); % standard deviation
我有一个问题:8 像素邻域 是什么意思?是(a)我不应该使用每个 3*3 本地窗口的中心像素,还是(b)只是本地窗口的另一个术语?
现在剩下的算法,来自论文:
然后我们判断检查区域的中心像素是属于线条还是背景。对于像素强度的最大值 Ihigh 和区域内像素强度的最小值 Ilow ,我们计算差值 S(i,j) 如:
S(i,j)=Ihigh-Ilow
我们将其与某个阈值进行比较。我们建议在计算轮廓检测中使用的阈值 T(i,j) 时使用像素强度的均值和标准差。 T=u-k*sd (sd=standard deviation) 其中k是某个值。那么轮廓检测的规则是:
g(i,j)=1 if S(i,j)>=T(i,j) and 0 if S(i,j)
我为此部分编写了这段代码:
k=1;
Div=k*Di;
t=u-Div;
min=ordfilt2(p,1,ones(3,3));
max=ordfilt2(p,3*3,ones(3,3));
s=max-min;
g=zeros(Size(1),Size(2));
for I=1:Size(1)
for J=1:Size(2)
if(s(I,J) >= t(I, J))
g(I, J) = 1;
else
g(I, J) = 0;
end
end
end
g=imadjust(g,[0 1],[1,0]);
imshow(g)
我不确定这两行:
min=ordfilt2(p,1,ones(3,3));
max=ordfilt2(p,3*3,ones(3,3);
根据论文所说,我有什么遗漏的吗?还是有什么误会?
这是论文中显示的示例:
这就是我所拥有的:
原图:
【问题讨论】:
-
我们可以在帖子中看到您想要什么以及您得到了什么吗?还有您正在使用的图像。即使我尝试了,我也无法在脑海中编译代码,对不起。
-
我想要一张耳朵图片的轮廓,就像纸上显示的那样。我尝试添加我拥有的图片,但网站不允许我添加,因为我只有 6 个声望(你必须至少有 10 个)
-
你的平均计算有点偏离:
h=h/8;并且没有除以 9!h中只有 8 个像素。您也可以发布您用来获得此结果的输入图像吗? -
这是我对“8像素邻域”论文的看法,我不确定,我不知道我是否应该做这个 h=fspecial('average',3)窗口还是我在上面代码中写的那个?
标签: matlab image-processing edge-detection