我根据这篇论文(关于轮廓检测)的第一部分编写了代码。然而,我的代码生成的图像与论文中的不同。由于我是图像处理新手,因此我认为可能有些地方我没有完全理解。
我将写下论文中的内容和我的实现方法,以便您看看是否存在误解。
论文中说:
我这里有个问题:什么是“8像素邻域”?是指(a)不应使用每个3*3局部窗口的中心像素,还是(b)只是另一个本地窗口的术语?
现在来自论文的其余算法:
然后,我们判断所检查区域的中心像素属于线条还是背景。对于像素强度的最大值Ihigh和该区域中像素强度的最小值Ilow,我们计算差异S(i,j),例如:
S(i,j)=Ihigh-Ilow
然后将其与某个阈值进行比较。我们建议在轮廓检测中使用像素强度的平均值和标准偏差来计算阈值T(i,j)。T=u-k*sd(sd=标准偏差),其中k是某个值。然后,轮廓检测的规则为:
如果S(i,j)>=T(i,j),则g(i,j)=1,如果S(i,j)我为此部分编写了以下代码:
根据文章所述,“我是否遗漏了什么?或者有什么误解?”
这是论文中给出的示例:
我将写下论文中的内容和我的实现方法,以便您看看是否存在误解。
论文中说:
我们提出使用局部方法,检查所选窗口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=标准偏差),其中k是某个值。然后,轮廓检测的规则为:
如果S(i,j)>=T(i,j),则g(i,j)=1,如果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);
根据文章所述,“我是否遗漏了什么?或者有什么误解?”
这是论文中给出的示例:
原始图像:
h=h/8;
而不是除以9!你只设置了8个像素在h
中。你能否也发布一下你用来得到这个结果的输入图像? - Shai