Matlab:imgradient 返回量化图像

标签 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只显示黑色或白色,没有中间灰度值?

最佳答案

两个问题

  • 用 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 后面的条状结构,这在以前是不可见的。

关于Matlab:imgradient 返回量化图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22313473/

相关文章:

c++ - 报错opencv error assertion failed (p [-1] <= 2) 是什么意思,如何处理?

android - 动态壁纸渐变条纹 : is it possible to use ARGB_8888 or dithering to fix?

android - 如何预分配 RadialGradient?

css - 创建一个与 css3 规范完全一样的 svg linearGradient

matlab - 要在不损失 Matlab 计算精度的情况下处理有理数?

c - Wine 可以与 Simulink Real-Time C API 一起使用吗?

image - 如何选择结构元素?

python - Imagemagick 或类似的脚本图像增强

matlab - 我怎样才能在 MATLAB 中只显示图例

image - 计算旋转2D图像的平移值和旋转角度