Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 为什么此轮廓检测代码没有';你不能正常工作吗?_Matlab_Image Processing_Edge Detection - Fatal编程技术网

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
    的值不同
然而,我认为你应该将你耳朵的灰度图像与结果进行比较

<2> 8-像素-邻域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


我们能在帖子中看到你想要什么和你得到了什么吗?还有你正在使用的图像。即使我尝试了,我也无法在头脑中编译代码,对不起。我想要一张像报纸上显示的耳朵图片的轮廓。我试图添加我得到的图片,但网站不允许,因为我只有6个声誉(你必须至少有10个)你的平均计算有点不准确:
h=h/8;
并且没有被9除!你在
h
中只设置了8个像素。你也可以发布你用来得到这个结果的输入图像吗?这是我对那篇文章的看法,它说的是“8像素邻域”,我不确定,我不知道我是否应该让这个h=f特别(“平均”,3)窗口还是我在上面代码中编写的窗口?
g=zeros(Size);
g(s>=t)=1;