我试图找到图像的边缘地图渐变。我尝试了以下代码
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);
答案 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));