Matlab: imgradient 返回量化图像

3
在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中,我希望表示角度范围的一系列灰度值。

例如,这是灰度图像:

原始灰度图像

这是gmag:

梯度幅度

这是gdir:

梯度方向

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

1个回答

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身后的条形结构,这在之前是看不见的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接