Sobel边缘检测 - matlab

时间:2013-01-16 12:28:47

标签: image matlab image-processing

你好,作为我的家庭作业的一部分。我需要计算并显示边缘幅度图像和 图像ball1.tif的边缘方向图像,使用Sobel边缘检测。

不要使用matlab的边缘函数。你可以使用conv2。 显示强边缘像素(高于阈值)的二值边缘图像(1个边缘像素,0个无边缘)。 确定消除球阴影的阈值。

这是我的main.m

addpath(fullfile(pwd,'TOOLBOX'));
addpath(fullfile(pwd,'images'));

%Sobel Edge Detection 
Image = readImage('balls1.tif');
showImage(Image);
message = sprintf('Sobel Edge Detection');
sobelEdgeDetection(Image);
uiwait(msgbox(message,'Done', 'help'));
close all

这是我的SobeEdgeDetection.m

function [ output_args ] = SobelEdgeDetection( Image )

maskX = [-1 0 1 ; -2 0 2; -1 0 1];
maskY = [-1 -2 -1 ; 0 0 0 ; 1 2 1] ;

resX = conv2(Image, maskX);
resY = conv2(Image, maskY);

magnitude = sqrt(resX.^2 + resY.^2);
direction = atan(resY/resX);
thresh = magnitude < 101;
magnitude(thresh) = 0;
showImage(magnitude);

end

我的问题是:
1.我用的方向是什么?我该如何展示它?
2.有没有更好的方法来获得消除球阴影的阈值。我使用了反复试验......

enter image description here

这是我的结果,只要显示幅度:

enter image description here

2 个答案:

答案 0 :(得分:1)

以下是您第一个问题的答案:

在Sobel Edge Detection算法中。获得的方向基本上是梯度。

图像处理中的渐变定义为强度变化最大的方向。变化可以增加强度或减少强度。此外,计算每个像素的这种变化,这意味着对于每个像素,测量强度的最大变化。 resX(在您的问题示例中,SobelEdgeDetection.m)表示X方向的变化,resY定义Y方向的变化。

看看它实际上只是在Matlab的命令窗口中触发此命令: imshow(RESX);

也试试,imshow(resY)

答案 1 :(得分:1)

根据你作业的第二部分,你已经解决了它,即你消除了阴影。

对于第一个问题:方向可以以多种不同的方式使用。这是最简单的方法:用它制作漂亮的图片。考虑它的一个更有用的理由是当你进行非最大限度抑制时,但由于你没有手动执行它,因此没有立即使用它。为了可视化梯度方向的结果,只需为您考虑的每个方向建立颜色。为了进一步简化可视化,还假设您将方向增加到30度,从0开始增加到180.例如,如果您的方向为35度,则将其视为30度(因为它是最近的减少列表中的一个)。接下来,我们看到一个图像和它的梯度方向的可视化,考虑到索贝尔和离散化到30度的步骤(黑色表示0度方向)。

enter image description here enter image description here

自动确定良好的阈值通常不是一件容易的事。例如,您可以从Otsu方法提供的方法开始,根据您尝试解决的问题,根据其他一些直方图分析来减少或增加其值。