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;
}