matlab – 为什么这个轮廓检测代码不能正常工作?

我根据
this paper的第一部分编写了一个代码(关于轮廓检测).但是,我的代码生成的图像与文中所示的图像不同.我是图像处理的新手,因此我想也许有些东西我不完全理解.

我打算写一些论文和我如何实现它,这样你就可以看出是否有任何误解.

该报说:

We propose to use the local method which examines illumination changes within the chosen window n * n . We usually use 3 * 3 window and we divided the image into many overlapping regions of that size.
For each of those regions we calculated mean and standard deviation of the pixel intensity values in 8-pixel neighborhood.

对于这部分,我写道:

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)只是本地窗口的另一个术语?

现在剩下的算法,来自论文:

Then we perform decision if the centre pixel of the examined region belongs to the line or to the background. For the maximum value of the pixel intensity Ihigh, and the minimum value of the pixel intensity in the region Ilow , we calculate the difference S(i,j) such as:
S(i,j)=Ihigh-Ilow
and we compare it to certain threshold value. We propose the usage of mean and standard deviation of pixel intensities in calculation of the threshold value T(i,j) used in contour detection. T=u-k*sd (sd=standard deviation) where k is a certain value.Then the rule for the contour detection is:
g(i,j)=1 if S(i,j)>=T(i,j) and 0 if S(i,j) < T(i,j) In result we obtain the binary image g(i,j) with the detected contours. Moreover, the constant k allows to adjust and change the sensitivity of the edge detection algorithm,”

我为这部分写了这段代码:

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的价值不同.

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

2d中的8像素邻域意味着您不使用中间的像素,而是围绕它.与使用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;
点赞