【问题标题】:How to get the convex hull of a binary image using DIPlib in C++?如何在 C++ 中使用 DIPlib 获取二进制图像的凸包?
【发布时间】:2022-09-24 03:45:57
【问题描述】:
我有一堆开放多孔结构的二进制图像,我想得到一个二进制掩码,它覆盖结构的整个体积(结构本身和结构中包含的空隙)。我认为实现我的目标的一个好方法是计算图像的凸包。这在 Python 中使用 skimage.morphology.convex_hull_image 可以正常工作(见图)。
但我需要 C++ 中的这个功能,我想使用 DIPlib 库。不幸的是,由于文档让我有点困惑,因此我正在努力实现正确的实现。
- 您能否提供一个最小示例来解释如何将二进制对象的凸包导出为图像?
- DIPlib 实现是否也处理 3D 图像?
标签:
c++
image-processing
diplib
【解决方案1】:
你会想要使用函数dip::MakeRegionsConvex2D()。例如:
dip::Image img = dip.ImageRead('yIFuP.jpg');
dip::Image bin = img > 128; // assuming img is scalar
dip::MakeRegionsConvex2D(bin, bin);
此函数是为 2D 图像明确编写的,不适用于 3D 图像。
对于 3D 图像,我将获取所有设置像素的坐标列表(使用 dip::Find),并将其传递给诸如 the one in CGAL 之类的 quickhull 算法实现,然后将生成的 3D 多面体绘制到图像中。最后一步可能是最具挑战性的一步(我不知道 CGAL 是否具有将多面体渲染到图像的功能)。快速而肮脏的解决方案是遍历所有像素,并为每个像素进行输入/输出测试,设置像素是否位于多面体内部。