【问题标题】:How to compute horizontal gradient value?如何计算水平梯度值?
【发布时间】:2015-01-12 16:07:59
【问题描述】:

所以我想测量图像的垂直边缘,以便稍后将其用作 2D 到 3D 转换的深度提示。

为此,我必须计算每个块的水平梯度值以测量垂直边缘,如下所示:

̅ g(x,y) = 1/N  ∑_((x',y')∈ Ω(x,y))〖g(x', y')〗

地点:

g(x',y') 是像素位置 (x',y') 处的水平梯度,

omega(x,y) 是像素位置(x',y')的邻域

和 N 是 omega(x,y) 中的像素数。

这是我在 matlab 上所做的

I = im2double(imread('landscape.jpg'));

% convert RGB to gray
gI = rgb2gray(I);
[nrow, ncol] = size(gI);

% divide the image into 4-by-4 blocks
gI = mat2tiles((gI),[4,4]);

N = 4*4; % block size

% For each block, compute the horizontal gradient  
gI = reshape([gI{:}],4*4, []);
mask = fspecial('sobel');
g = imfilter(gI, mask);
g_bar = g./N;


g_bar = reshape(g_bar,nrow, ncol);

我是 Matlab 新手,所以我不确定我的代码是否以正确的方式表达方程式。

如果您认为它是正确的,请告诉我?因为我不确定如何测试输出!

【问题讨论】:

标签: image matlab image-processing coding-style gradient


【解决方案1】:

您无需将图像分解为 4 x 4 块。水平梯度可以用Sobel滤波器或Prewitt滤波器,为3 x 3,可直接放入imfilterimfilter 使用指定的掩码/内核为您执行 2D 卷积/过滤,因此不需要平铺。因此,您可以将imfilter 与通过fspecial 定义的掩码一起使用,并定义N = 9。因此:

I = im2double(imread('landscape.jpg'));

% convert RGB to gray
gI = rgb2gray(I);

N = 9;

mask = fspecial('sobel');
g = imfilter(gI, mask);
g_bar = g./N;

根据经验,增加渐变蒙版的大小不会给您带来更好的效果。您要确保掩码尽可能小,以捕获尽可能多的本地更改。

【讨论】:

  • 感谢您,这对您有很大帮助!
  • 这就是计算局部梯度的方法吧?
  • @user2833205 - 是的。为什么要全局渐变?那没有实用性。局部梯度的重点是确定图像中的局部变化。在全球范围内这样做会失去所有这些。
  • @user2833205 - 据我所知,没有这样的东西。
  • 是的,我在想全局梯度可以帮助我找到图像的全局深度图,然后我会根据局部特征更新全局深度图。
猜你喜欢
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 2021-05-03
  • 2019-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多