【发布时间】:2014-10-17 14:49:03
【问题描述】:
我正在尝试进入计算机视觉领域,首先我在 MATLAB 中实现了一个 Sobel 滤波器,我在这里读到了它:http://en.wikipedia.org/wiki/Sobel_operator
代码如下:
image = double(image);
kernelx = [ -1, 0, 1;
-2, 0, 2;
-1, 0, 1];
kernely = [ 1, 2, 1;
0, 0, 0;
-1, 0, 1];
height = size(image,1);
width = size(image,2);
channel = size(image,3);
for i = 2:height - 1
for j = 2:width - 1
for k = 1:channel
magx = 0;
magy = 0;
for a = 1:3
for b = 1:3
magx = magx + (kernelx(a, b) * image(i + a - 2, j + b - 2, k));
magy = magy + (kernely(a, b) * image(i + a - 2, j + b - 2, k));
end;
end;
edges(i,j,k) = sqrt(magx^2 + magy^2);
end;
end;
end;
这是我测试过的图片:
这是结果:
我不知道从哪里开始,我已经尝试过细化线或阈值,我应该采取哪些步骤来使这个运行更好?
【问题讨论】:
-
一方面,
edges是一个double数组。当您尝试在 MATLAB 中显示图像时,它假定double图像中的动态范围在[0,1]之间。任何低于0或超过1的值分别饱和到0和1。这可能解释了为什么您的图像看起来如此褪色。因此,尝试执行edges = im2double(mat2gray(edges));以便在[0,1]之间对值进行标准化,然后看看会发生什么。或者,您可以使用imshow(edges,[]);来显示标准化的图像。请记住,这不会修改图像 - 它只会改变图像的显示方式。
标签: matlab image-processing computer-vision sobel