【问题标题】:why this contour detection code doesn't work properly?为什么这个轮廓检测代码不能正常工作?
【发布时间】: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


【解决方案1】:

我认为你的结果看起来还不错。关于差异:

  • 您的噪点更多,但这可能是因为您的分辨率更高,可以在图像上显示更多细节。在找到轮廓之前,您可以尝试对图像运行高斯滤波器。
  • 图像中的灰度值可能比纸张图像中的多得多。因此,使用此算法可能会发现更多细节作为轮廓。
  • 可能只是因为k 的值不同。

但是,我认为您应该将耳朵的灰度值图像与结果进行比较。

8-pixel-neighborhood 在 2d 中意味着您不使用中间的像素,而是使用它周围的像素。与使用 9 像素相比,我无法估计这对结果的影响。

关于您的代码的评论:您可以替换

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=zeros(Size);
g(s>=t)=1;

【讨论】:

    猜你喜欢
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 2021-01-18
    相关资源
    最近更新 更多