Matlab 为什么此轮廓检测代码没有';你不能正常工作吗?
我写了一个基于第一部分的代码(关于轮廓检测)。但是,我的代码生成的图像与本文中显示的图像不同。我是图像处理新手,因此我认为可能有一些东西我不完全理解。Matlab 为什么此轮廓检测代码没有';你不能正常工作吗?,matlab,image-processing,edge-detection,Matlab,Image Processing,Edge Detection,我写了一个基于第一部分的代码(关于轮廓检测)。但是,我的代码生成的图像与本文中显示的图像不同。我是图像处理新手,因此我认为可能有一些东西我不完全理解。 我将写下论文所说的内容以及我是如何实施的,这样你们就可以看到是否有任何误解。 该报说: 我们建议使用局部方法检查所选窗口n*n内的照明变化。我们通常使用3*3窗口,我们将图像分割成许多相同大小的重叠区域。 对于每个区域,我们计算了8像素邻域中像素强度值的平均值和标准偏差 对于这一部分,我写道: e=imread('1.jpg'); p=rgb2g
我将写下论文所说的内容以及我是如何实施的,这样你们就可以看到是否有任何误解。
该报说: 我们建议使用局部方法检查所选窗口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)=i高i低
我们将其与某个阈值进行比较。我们建议在计算轮廓检测中使用的阈值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);
根据报纸上说的,我有什么遗漏吗?或者有什么误解吗?
这是本文所示的示例:
这就是我得到的:
原始图像:
我认为你的结果看起来没那么糟糕。关于差异:
- 你有更多的噪声,但这可能是因为你有更高的分辨率,可以在图像上显示更多的细节。你可以在找到轮廓之前尝试在图像上运行高斯滤波器
- 图像中的灰度值可能比纸张图像中的灰度值多得多,因此使用此算法可以找到更多的细节,如轮廓
- 可能只是因为
的值不同k
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
与
我们能在帖子中看到你想要什么和你得到了什么吗?还有你正在使用的图像。即使我尝试了,我也无法在头脑中编译代码,对不起。我想要一张像报纸上显示的耳朵图片的轮廓。我试图添加我得到的图片,但网站不允许,因为我只有6个声誉(你必须至少有10个)你的平均计算有点不准确:
h=h/8;
并且没有被9除!你在h
中只设置了8个像素。你也可以发布你用来得到这个结果的输入图像吗?这是我对那篇文章的看法,它说的是“8像素邻域”,我不确定,我不知道我是否应该让这个h=f特别(“平均”,3)窗口还是我在上面代码中编写的窗口?
g=zeros(Size);
g(s>=t)=1;