找到图像的边缘地图渐变时出错

时间:2015-08-17 21:33:42

标签: matlab image-processing

我试图找到图像的边缘地图渐变。我尝试了以下代码

I=imread('Sub.png');
I=rgb2gray(I);
disp(' Compute edge map ...');
f = 1 - I/255;
figure, imshow(f,[]); title('edge map');
[fx,fy] = gradient(f);
figure, quiver(fx,fy);
title('edge map gradient');

图片是 http://postimg.org/image/ba08la73v/

错误是

 Error using bsxfun
Mixed integer class inputs are not supported.

Error in gradient (line 68)
   g(2:n-1,:) = bsxfun(@rdivide,(f(3:n,:)-f(1:n-2,:)),h);

1 个答案:

答案 0 :(得分:0)

错误是由于图像的性质造成的。 gradient函数需要double类型的图片,但您提供的是uint8图片。将图片投射到double,或使用im2double将图像转换为double精度。但是,im2double会将[0,1]之间的强度标准化。

所以:

I=imread('Sub.png');
I=rgb2gray(I);

I = im2double(I); %Or: I = double(I) %// Change
disp(' Compute edge map ...');
%//f = 1 - I/255; %// Leave this if using double(I)

f = 1 - I; %// Change

figure, imshow(f,[]); title('edge map');
[fx,fy] = gradient(f);
figure, quiver(fx,fy);
title('edge map gradient');

计算f语句的原因是强度相反。白色变黑,黑色变白。这可能是因为当您可视化渐变时,形状看起来会凸出而不是凹陷...它会更容易可视化。

FWIW,我建议您使用imgradientxy来帮助您找到每个方向的渐变。它旨在对图像进行操作:

类似的东西:

I = rgb2gray(imread('Sub.png'));
[fx,fy] = imgradientxy(1 - im2double(I));