Image 如何计算水平梯度值?

Image 如何计算水平梯度值?,image,matlab,image-processing,coding-style,gradient,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')处的水平梯度 ω(x,y)是像素位置(x',y')的黑框 N是以ω(x,y)为单位的像素数 下面是我在matlab上所做的: 我是Matlab新手,所以我不确定我的代码是否以正确的方式表达了方程 如果你认为这是正确的,请告

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

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

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

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

ω(x,y)是像素位置(x',y')的黑框

N是以ω(x,y)为单位的像素数

下面是我在matlab上所做的:

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


如果你认为这是正确的,请告诉我好吗?因为我不知道如何测试输出

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

根据经验,增加渐变遮罩的大小不会给你带来更好的效果。你要确保面具尽可能小,以捕捉尽可能多的局部变化。

顺便说一句,我建议看一看——这可能比所有的
重塑
杂耍更好(更快)。旁注:看看我的研究。我的博士论文是关于2D到3D转换的-@rayryeng会的,谢谢。谢谢你,这很有帮助!这就是计算局部梯度的方法,对吗?@user2833205-是的。为什么要使用全局梯度?这没有实际意义。局部梯度的全部作用是确定图像中的局部变化。全局操作会丢失所有这些。@user2833205-据我所知,没有这样的事情。是的,我认为全局渐变可以帮助我找到图像的全局深度图,然后我会根据局部特征更新全局深度图。
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;