如何在OpenCV中进行3D高斯滤波?

7

我有一个多维矩阵,想要进行高斯平滑处理,不仅在2D沿着xy方向,而且还想在3D中跨通道进行平滑处理。在OpenCV中如何实现?

我知道有一个名为GaussianBlur的函数可以在2D中应用高斯滤波器,但是在3D中该怎么办呢?你可以像下面这样调用它:

GaussianBlur(frame, frame2, Size(sigma, sigma), 0, 0);

我已经删除了MATLAB标签,因为在你的帖子中根本没有提到它。 - rayryeng
3
我不同意这是重复的,链接问题的答案没有描述如何在OpenCV中执行此操作,也肯定没有涉及使用通道作为第三个维度。在OpenCV中有一种好的方法可以做到这一点,如果还没有人提供答案,我稍后会提供一个答案。 - Bull
@B... - 我原以为它可以,如果实际上不行,那我道歉。另外,我很想看看你的答案,因为我也很好奇你会如何在OpenCV中完成这个任务。 - rayryeng
尽管这个问题不是重复的(链接的问题是针对MATLAB而不是OpenCV),但它没有重新打开,因为对这个问题的权威回答只是“不,OpenCV不支持任何类型的3D滤波”。 (在这种情况下,它会重复http://stackoverflow.com/questions/18020438/opencv-gaussian-blur-smoothing-of-3d-matrix-histogram,这也被关闭。)然而,如果OpenCV的情况发生变化,类似的问题应该指向OpenCV文档,以避免用过时的答案误导未来的访问者。 - rwong
1个回答

2
这在OpenCV原生环境下不受支持。然而,由于高斯滤波是可分离的,您可以单独过滤每个维度。
使用BaseRowFilterhttp://docs.opencv.org/modules/imgproc/doc/filtering.html#BaseRowFilter的组合和BaseColumnFilter: http://docs.opencv.org/modules/imgproc/doc/filtering.html#BaseColumnFilter并将高斯核指定为1D。
使用getGaussianKernelhttp://docs.opencv.org/modules/imgproc/doc/filtering.html?highlight=gauss#getgaussiankernel帮助您计算1D高斯核,无需自己进行计算。
现在,对于第三个维度,这将是棘手的。您需要在特定空间位置的每个3D切片上应用单独的行/列过滤器。例如,如果您有一个5个切片的卷积体,每个图像的尺寸为10 x 10,则最终3D中滤波后的结果是您必须提取100个大小为5的1D信号,然后分别在这些1D信号上应用内核。
查看此帖子以获取更多见解:如何在3D中进行高斯滤波。其他人过去曾经尝试过这样做。
祝你好运!

你的方法看起来很有前途,@rayryeng。但在我尝试实现之前,BaseRowFilterBaseColumnFilter是否假定src是2D数组?将其转换为3D数组作为输入是否容易?任何提示都将不胜感激。 - jadelord

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接