VTK vtkImageData 开操作 闭操作 填洞 图像形态学操作

1.有时候我们只想使用 VTK 实现 开操作,闭操作;哪么可以用

使用前后:

 左一是使用前,右是使用后,变成了闭合的;使用了闭操作;

2.简介:

在 VTK 中,vtkImageData 是用来表示图像数据的类。对于图像的形态学操作(如开操作和闭操作),可以使用 VTK 提供的形态学滤波器,如 vtkImageDilateErode3D 来实现。这两个操作可以通过组合膨胀(Dilation)和腐蚀(Erosion)来完成:

  • 开操作(Opening):先腐蚀后膨胀,用于去除图像中的小物体。
  • 闭操作(Closing):先膨胀后腐蚀,用于填补图像中的小孔。

开操作(Opening):

  1. 腐蚀:使用 vtkImageDilateErode3D 来实现。
  2. 膨胀:再次使用 vtkImageDilateErode3D,但将参数反转。

闭操作(Closing):

  1. 膨胀:先使用 vtkImageDilateErode3D
  2. 腐蚀:再使用 vtkImageDilateErode3D

3.以下是使用 vtkImageDilateErode3D 实现开操作和闭操作的示例代码: 

#include <vtkSmartPointer.h>
#include <vtkImageDilateErode3D.h>
#include <vtkImageData.h>
#include <vtkImageCast.h>
#include <vtkImageReader2.h>
#include <vtkImageWriter.h>

void Opening(vtkSmartPointer<vtkImageData> input, int kernelSize) {
    // Step 1: 腐蚀操作
    vtkSmartPointer<vtkImageDilateErode3D> erode = vtkSmartPointer<vtkImageDilateErode3D>::New();
    erode->SetInputData(input);
    erode->SetDilateValue(0);  // 设置膨胀值
    erode->SetErodeValue(1);   // 设置腐蚀值
    erode->SetKernelSize(kernelSize, kernelSize, kernelSize);
    erode->Update();

    // Step 2: 膨胀操作
    vtkSmartPointer<vtkImageDilateErode3D> dilate = vtkSmartPointer<vtkImageDilateErode3D>::New();
    dilate->SetInputData(erode->GetOutput());
    dilate->SetDilateValue(1);  // 设置膨胀值
    dilate->SetErodeValue(0);   // 设置腐蚀值
    dilate->SetKernelSize(kernelSize, kernelSize, kernelSize);
    dilate->Update();

    input->ShallowCopy(dilate->GetOutput());  // 更新输入数据为开操作后的结果
}

void Closing(vtkSmartPointer<vtkImageData> input, int kernelSize) {
    // Step 1: 膨胀操作
    vtkSmartPointer<vtkImageDilateErode3D> dilate = vtkSmartPointer<vtkImageDilateErode3D>::New();
    dilate->SetInputData(input);
    dilate->SetDilateValue(1);  // 设置膨胀值
    dilate->SetErodeValue(0);   // 设置腐蚀值
    dilate->SetKernelSize(kernelSize, kernelSize, kernelSize);
    dilate->Update();

    // Step 2: 腐蚀操作
    vtkSmartPointer<vtkImageDilateErode3D> erode = vtkSmartPointer<vtkImageDilateErode3D>::New();
    erode->SetInputData(dilate->GetOutput());
    erode->SetDilateValue(0);  // 设置膨胀值
    erode->SetErodeValue(1);   // 设置腐蚀值
    erode->SetKernelSize(kernelSize, kernelSize, kernelSize);
    erode->Update();

    input->ShallowCopy(erode->GetOutput());  // 更新输入数据为闭操作后的结果
}

 

4.代码说明:

  1. vtkImageDilateErode3D 是 VTK 中用于膨胀和腐蚀的类。你可以通过 SetDilateValueSetErodeValue 来指定膨胀和腐蚀的值。
  2. SetKernelSize 用于指定核的大小,核大小影响腐蚀和膨胀操作的强度。通常,开操作和闭操作会使用相同大小的核。
  3. 图像的开操作和闭操作分别调用了 Opening()Closing() 函数。

通过这种方式,你可以在 VTK 中对 vtkImageData 进行开操作和闭操作,来处理三维图像数据

 5.注意问题

如果你在使用 vtkImageDilateErode3D 进行闭操作时发现无效问题,可能是由于以下原因:

  1. 输入图像值的范围vtkImageDilateErode3D 的膨胀和腐蚀操作依赖于图像的值。如果图像中的值没有正确对应膨胀和腐蚀的设定(如 0 和 1),操作可能无法正确执行。确保图像的值正确反映二值图像或特定区域的特征。

  2. 膨胀和腐蚀值设置不当:闭操作要求先膨胀再腐蚀。因此,膨胀和腐蚀的值应该分别设置为合理的值,例如:

    • 膨胀值(DilateValue)为 1,用于扩展前景(白色区域)。
    • 腐蚀值(ErodeValue)为 0,用于收缩背景(黑色区域)。
  3. 核大小:膨胀和腐蚀的核大小可能过小或过大,导致操作无效。核大小是闭操作的重要参数,影响膨胀和腐蚀的效果。

  4. 图像边界问题:当图像边界靠近形态学结构元素时,可能会影响操作的效果。确保核大小合适,并在图像边界区域进行检查。

解决方案

  1. 确保图像是二值图像: VTK 中的 vtkImageDilateErode3D 通常用于处理二值图像(值为 0 或 1)。如果输入图像不是二值图像,可能需要先将其转换为二值图像。你可以使用 vtkImageThreshold 来将图像转换为二值图像。

  2. 调整核大小: 试着调整核的大小(SetKernelSize),特别是在闭操作中,膨胀和腐蚀的效果依赖于核的大小。核大小不应该太大或太小,通常与目标结构的大小匹配。

  3. 检查膨胀和腐蚀值设置: 确保膨胀和腐蚀的值设置合理,闭操作中应首先执行膨胀操作:

// 通过阈值将图像二值化
vtkSmartPointer<vtkImageThreshold> threshold = vtkSmartPointer<vtkImageThreshold>::New();
threshold->SetInputData(inputImage);
threshold->ThresholdByUpper(100);  // 将阈值设置为 100,低于此值的设为 0,其他设为 1
threshold->SetOutValue(0);  // 背景
threshold->SetInValue(1);   // 前景
threshold->Update();

也可使用:

vtkSmartPointer<vtkImageOpenClose3D> closeFilter = vtkSmartPointer<vtkImageOpenClose3D>::New();
closeFilter->SetInputData(inputImage);
closeFilter->SetOpenValue(0);  // 设置开操作值
closeFilter->SetCloseValue(1); // 设置闭操作值
closeFilter->SetKernelSize(5, 5, 5);  // 调整核大小
closeFilter->Update();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恋恋西风

up up up

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值