OpenCV中的3D图像渐变

时间:2015-08-13 08:52:34

标签: c++ opencv image-processing 3d

我有从3D OCT扫描获得的3D图像数据。数据可以表示为I(x,y,z),这意味着每个体素都有一个强度值。

我正在编写一种算法,它涉及在C ++中找到x,y和z方向上的图像渐变。 我已经使用OpenCV为2D编写了一个C ++代码,并希望将其扩展为3D,只需对现有的2D代码进行最小的更改。

我熟悉使用Sobel or Scharr运算符的2D渐变。我的搜索带我到this post,答案推荐ITKPoint Cloud Library。但是,这些库具有许多可能不需要的功能。由于我对C ++不是很熟悉,这些库需要一些阅读,这个时间不允许我。而且,这些库不使用cv :: Mat对象。如果我使用cv :: Mat以外的任何东西,我的整个代码可能都要改变。

有人可以帮我这个吗?

更新1:使用内核可分性的可能解决方案

根据@ Photon的回答,我正在更新问题。

根据@Photon的说法,我了解了如何在3D中构建Sobel内核。但是,即使我构建一个3x3x3多维数据集,如何在OpenCV中实现它?使用filter2d在OpenCV中的卷积操作仅适用于2D。

可以有一种方法。由于Sobel内核是可分离的,这意味着我们可以将3D卷积分解为较低维度的卷积。 this link的评论20和21也说明了同样的事情。现在,我们可以分离3D内核,但即使这样,filter2D也无法使用,因为图像仍处于3D状态。有没有办法打破图像?有一个interesting post暗示了这样的事情。对此有何进一步的想法?

1 个答案:

答案 0 :(得分:1)

由于Sobel算子是可分离的,因此很容易想象如何添加第三维。

例如,当您在发布的链接中查看Gx的过滤器定义时,您会看到周围像素乘以具有取决于相对X位置的符号的系数,以及相对于Y中偏移的幅度

当你扩展到3D时,Gx渐变应该以相同的方式计算,但你需要在3x3x3立方体上工作,系数符号保持相同的定义,现在的大小取决于Y或Z的变化或两者兼而有之。

其他渐变(Gy,Gz)是相同的,但围绕它们的轴。