Matlab:imgradient返回量化图像

时间:2014-03-10 23:24:55

标签: matlab image-processing gradient normalization grayscale

在Matlab中,我想显示灰度图像的渐变幅度和方向。这是我正在尝试的代码:

image = imread('gray_image.bmp');
[gmag, gdir] = imgradient(image);
figure, imshow(image);
figure, imshow(gmag);
figure, imshow(gdir);

然而,gmag和gdir似乎被量化为两个值:黑色和白色。 gmag和gdir中的每个像素都是黑色或白色。我的图像本身具有一系列渐变幅度和方向。为什么这些没有出现在gmag和gdir图像中?是的,我希望gmag对于具有零梯度的像素具有纯黑色,对于具有最大梯度的像素具有纯白色,但是我还期望在这些之间具有渐变的灰度值范围。同样,我希望gdir中的一系列灰度值代表角度范围。

例如,这是灰度图像:

Original Grayscale Image

这是gmag:

Gradient Magnitude

这是gdir:

Gradient Direction

为什么gmag和gdir只显示黑色或白色,没有中间灰度值?

1 个答案:

答案 0 :(得分:4)

两个问题

    使用IMGRADIENT计算的
  • 'gmag'和'gdir'具有双数据类型。 因此,如果您想要显示它们,MATLAB会将它们视为 强度图像,并期望它们在[0 1]的范围内。 因此,我们需要规范化'gmag'和'gdir',它显示在 代码稍后。
  • 如果您想保存这些图像,MATLAB需要UINT8数据类型和 值必须在[0 255]范围内。因此,在保存之前,您需要 将它乘以255,然后转换为UINT8。

<强>代码

image = imread('gray_image.bmp');
[gmag, gdir] = imgradient(image);

%%// Normalize gmag and gdir
gmag = (gmag-min(gmag(:)))./(max(gmag(:))-min(gmag(:)));
gdir = (gdir-min(gdir(:)))./(max(gdir(:))-min(gdir(:)));

%%// Display images
figure, imshow(image);
figure, imshow(gmag);
figure, imshow(gdir);

%%// Save gradient images
imwrite(uint8(255.*gmag),'Lena_gmag.bmp');
imwrite(uint8(255.*gdir),'Lena_gdir.bmp');

输出图片

GMAG -

enter image description here

GDIR -

enter image description here

作为测试,人们可以注意到现在在GDIR图像中Lena后面的条状结构,这在之前是不可见的。