c语言怎么求图像像素的梯度,在OpenCV中计算3D梯度方向

我有一个160x120 OpenCV Mat,其中我在每个位置都存储了一个Vec3F向量。 Vec3f保存用于已经通过使用强度图像和对应的深度图的3D重建计算的特定像素的信息。 所以我基本上从Mat映射到在每个像素保持3D位置信息的每个像素的灰度值到Mat。在OpenCV中计算3D梯度方向

然后我试图计算该对象中每个像素的渐变。我因此具有用C语言实现这个代码++/OpenCV的:

for(int x = 0; x < mat.rows; ++x){

for(int y = 0; y < mat.cols; ++y){

float Gx = (mat.at(x+1, y)[0] - mat.at(x-1, y)[0])/2.0;

float Gy = (depth.at(x, y+1)[1] - depth.at(x, y-1)[1])/2.0;

Vec3f d = (Gx, Gy, 1.0);

Vec3f n = normalize(d);

allGradients.push_back(n);

}

}

// mat.at(x, y)[0] -> Get the Vec3F vector at the current x-, y-

// position in the Mat and access its first element (which is the points x-value).

因此,我所计算的梯度方向和Gx与Gy有限差分近似的方法。

我不明白的是如何计算Z方向的梯度。我确实有存储在Vec3f中的每个像素的z信息以及x和y信息,但是有限差分近似的步骤将不可能,因为数据存储在2D Mat中,对吧?

所以我不能简单地访问像素的前面和后面,他当前做类似这样的:在Mat

float Gz = (mat.at(x, y, z+1)[2] - mat.at(x, y, z-1)[2])/2.0;

,因为我还没有z值,对不对?如果是这样,那我该如何计算z方向上的梯度?我需要将我的信息存储在3D array中吗?或者整个方法不正确?谢谢!

+0

不确定您的2D渐变是否有意义。我知道3D体积数据(如CT扫描或密度三维重建(如kinect融合))等密度网格中的3D渐变。但是,如果需要,可以将稀疏点表示转换为3D网格。可能回答这个问题,你应该告诉你想要用梯度信息做什么。也许足够逼近该物体/像素位置中的二维表面平面。 –

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值