如何计算水平梯度值?

时间:2014-11-15 08:22:54

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

因此,我想测量图像的垂直边缘,以便稍后将其用作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是欧米茄(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的新手,所以我不确定我的代码是否以正确的方式表达了这个等式。

如果您认为这是正确的,可以告诉我吗?因为我不确定如何测试输出!

1 个答案:

答案 0 :(得分:1)

您无需将图像分解为4 x 4块。水平梯度可与Sobel滤波器或Prewitt滤波器一起使用,该滤波器为3 x 3,可直接放入imfilterimfilter为您执行带有指定掩码/内核的2D卷积/过滤,因此无需进行平铺。因此,您可以将imfilterfspecial定义的掩码一起使用,并定义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;

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