你好,这是我家庭作业的一部分。我需要使用Sobel边缘检测来计算和显示图像bals1.tif的边缘幅值图像和边缘方向图像。
不要使用matlab的边缘函数。您可以使用conv2。显示强边缘像素(高于阈值)的二进制边缘图像(1边缘像素,0无边缘)。确定消除球阴影的阈值。
这是我的主菜单。
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我的问题是:

这些是我的结果,就其规模而言:

发布于 2013-01-25 05:02:06
根据你作业的第二部分,你已经解决了它,也就是说,你消除了阴影。
对于第一个问题:方向可以以许多不同的方式使用。这是最简单的方法:用它来制作漂亮的图片。考虑它的一个更有用的原因是当你在做非最大抑制时,但由于你不是手动做的,所以它没有多少直接的用处。要可视化渐变方向的结果,只需为您考虑的每个方向建立颜色即可。为了进一步简化可视化,还假设您将方向从0开始减少到30度到180度的增量。例如,如果你有一个35度的方向,你就认为它是30度(因为它是你简化列表中最近的一个)。接下来,我们看到一幅图像及其梯度方向的可视化,考虑到Sobel和30度的离散化(黑色表示0度方向)。


自动确定好的阈值通常不是一件容易的事情。例如,您可以从Otsu方法提供的直方图开始,然后根据您试图解决的问题,基于其他一些直方图分析来减少或增加它的值。
发布于 2013-01-25 01:52:27
这是你第一个问题的答案:
在Sobel边缘检测算法中。得到的方向基本上就是梯度。
在图像处理中,梯度被定义为强度变化最大的方向。变化可以是强度的增加也可以是强度的降低。此外,这种变化是为每个像素计算的,这意味着对于每个像素,测量强度的最大变化。resX (在您的问题示例中,SobelEdgeDetection.m)表示X方向的更改,而resY定义Y方向的更改。
只需在Matlab的命令窗口中执行以下命令: imshow(resX);
另请尝试,不显示(ResY)
https://stackoverflow.com/questions/14358512
复制相似问题