图像分割算法之连接门限法

itk::ConnectedThresholdImageFilter过滤器采用的是注水迭代器,主要负责访问相邻的像素。itk::ConnectedThresholdImageFilter使用的标准是基于用户提供的一个亮度值间距,需要提供上下限的值,亮度区间再指定阈值中的像素会被指定的像素值替代。代码如下:

#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingContextOpenGL2)
VTK_MODULE_INIT(vtkRenderingFreeType)

#include "itkConnectedThresholdImageFilter.h"
#include "itkImage.h"
#include "itkCastImageFilter.h"
#include "itkCurvatureFlowImageFilter.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkImageToVTKImageFilter.h"
#include "vtkImageViewer.h"
#include "vtkRenderWindowInteractor.h"
#include "itkPNGImageIOFactory.h"

int main()
{
    //创建对象类型
    typedef float InternalPixelType;
    const unsigned int Dimension = 2;
    typedef itk::Image<InternalPixelType, Dimension> InternalImageType;
    typedef unsigned char                             OutputPixelType;
    typedef itk::Image<OutputPixelType, Dimension>   OutputImageType;
    typedef itk::CastImageFilter<InternalImageType, OutputImageType> CastingFilterType;

    //采用边缘平滑滤波器降低图像的噪声
    typedef itk::CurvatureFlowImageFilter<InternalImageType, InternalImageType> CurvatureFlowImageFilterType;
    typedef itk::ConnectedThresholdImageFilter<InternalImageType, InternalImageType> ConnectedFilterType;

    typedef itk::ImageFileReader<InternalImageType> ReaderType;
    typedef itk::ImageFileWriter<OutputImageType> WriterType;

    ReaderType::Pointer reader = ReaderType::New();
    reader->SetFileName("E:\\ITK\\InsightToolkit-4.13.2\\Examples\\Data\\BrainProtonDensitySlice.png");

    //下面两行必须添加
    itk::PNGImageIOFactory::RegisterOneFactory();
    reader->Update();
    //创建边缘平滑滤波器,用于降低图像中的噪声
    CurvatureFlowImageFilterType::Pointer smoothing = CurvatureFlowImageFilterType::New();
    smoothing->SetInput(reader->GetOutput());
    smoothing->SetNumberOfIterations(5);
    smoothing->SetTimeStep(0.125);
 
    //创建连接门限过滤器,对去噪后的图像进行区域生长
    ConnectedFilterType::Pointer connectedThreshold = ConnectedFilterType::New();
    connectedThreshold->SetInput(smoothing->GetOutput());
    const InternalPixelType lowerThreshold = 180;
    const InternalPixelType upperThreshold = 210;

    connectedThreshold->SetLower(lowerThreshold);
    connectedThreshold->SetUpper(upperThreshold);


    //设置区域中的亮度值
    connectedThreshold->SetReplaceValue(255);
    //设置种子范围
    InternalImageType::IndexType index;
    index[0] = 107;
    index[1] = 69;
    connectedThreshold->SetSeed(index);
    
    //*******************通过VTK显示原图像**************************//
    vtkRenderWindowInteractor* interactor = vtkRenderWindowInteractor::New();
    itk::ImageToVTKImageFilter<InternalImageType>::Pointer connector = itk::ImageToVTKImageFilter<InternalImageType>::New();
    connector->SetInput(reader->GetOutput());
    connector->Update();
    vtkImageViewer *viewer = vtkImageViewer::New();
    viewer->SetupInteractor(interactor);
    viewer->SetInputData(connector->GetOutput());
    viewer->SetPosition(150, 150);
    viewer->Render();
    viewer->SetColorWindow(255);
    viewer->SetColorLevel(128);
    
    //*****************************************************************

    /*                    
                通过ITK处理后的图像
    */

    vtkRenderWindowInteractor* interactor0 = vtkRenderWindowInteractor::New();
    itk::ImageToVTKImageFilter<InternalImageType>::Pointer
        connector0 = itk::ImageToVTKImageFilter<InternalImageType>::New();
    connector0->SetInput(connectedThreshold->GetOutput());
    connector0->Update();

    vtkImageViewer* viewer0 = vtkImageViewer::New();
    viewer0->SetupInteractor(interactor0);
    viewer0->SetInputData(connector0->GetOutput());
    viewer0->SetPosition(350, 150);//在窗口中显示的位置
    viewer0->Render();
    viewer0->SetColorWindow(255);
    viewer0->SetColorLevel(128);

    interactor0->Start();
    interactor->Start();
    


    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值