ITK学习笔记(四)基于C++和ITK获取3D医学图像的最大连通区域

  • 1、代码
  • 2、效果
  • 3、主要函数介绍

1、代码

#include "itkConnectedComponentImageFilter.h"
#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkImageRegionIterator.h"
#include "itkLabelShapeKeepNObjectsImageFilter.h"using namespace std;void print(const std::string& file, itk::Image<unsigned char, 2>* image)
{ofstream fout(file);auto size = image->GetBufferedRegion().GetSize();for (auto i = 0; i < size[0]; i++){for (auto j = 0; j < size[1]; j++){itk::Image<unsigned char, 2>::IndexType index{ {i,j} };auto c = image->GetPixel(index);fout << (int)c;}fout << std::endl;}
}int main(int argc, char *argv[])
{// 1、获取二值化的分割结果maskconst char* input_path = "D:/documents/vs2019/itk_tutorial/largestcompent/build/RelWithDebInfo/left_femur.nrrd";// 图像保存的路径using ImageType = itk::Image<unsigned char, 3>;using ReaderFilter = itk::ImageFileReader<ImageType>;auto reader = ReaderFilter::New();reader->SetFileName(input_path);reader->Update();ImageType::Pointer image = reader->GetOutput();// 2, 调用ITK的itkConnectedComponentImageFilterusing ConnectedComponentFilter = itk::ConnectedComponentImageFilter<ImageType, ImageType>;auto connnectedComponentFilter = ConnectedComponentFilter::New();connnectedComponentFilter->SetInput(image);connnectedComponentFilter->Update();// 3,调用ITK的itkLabelShapeKeepNObjectsImageFilterusing LabelShapeKeepNObjectsFilter = itk::LabelShapeKeepNObjectsImageFilter<ImageType>;auto labelShapeKeepNObjectsFilter = LabelShapeKeepNObjectsFilter::New();labelShapeKeepNObjectsFilter->SetInput(connnectedComponentFilter->GetOutput());labelShapeKeepNObjectsFilter->SetBackgroundValue(0);labelShapeKeepNObjectsFilter->SetNumberOfObjects(1);labelShapeKeepNObjectsFilter->SetAttribute(LabelShapeKeepNObjectsFilter::LabelObjectType::NUMBER_OF_PIXELS);labelShapeKeepNObjectsFilter->Update();
// 4、将Label便签转换为1typedef itk::RescaleIntensityImageFilter<ImageType, ImageType> RescaleFilterType;RescaleFilterType::Pointer rescaleFilter = RescaleFilterType::New();rescaleFilter->SetOutputMinimum(0);rescaleFilter->SetOutputMaximum(1);rescaleFilter->SetInput(labelShapeKeepNObjectsFilter->GetOutput());rescaleFilter->Update();//ImageType::Pointer largestccimage = rescaleFilter->GetOutput(); // 5,保存最大连通区域图像const char* out_path = "D:/documents/vs2019/itk_tutorial/largestcompent/build/RelWithDebInfo/output.nii.gz"; // 保存输出结果的路径using WriterFilter = itk::ImageFileWriter<ImageType>;auto writer = WriterFilter::New();writer->SetFileName(out_path);writer->SetInput(rescaleFilter->GetOutput());writer->Update();return EXIT_SUCCESS;
}

2、效果

原始图像:


去除小连通域之后

参考:基于C++和ITK获取2D或3D医学图像的最大连通区域(完整代码)

3、主要函数介绍

itk::ConnectedComponentImageFilter<ImageType, OutputImageType>;

该filter值检测连通区域,不编号,不排序。

itk::LabelShapeKeepNObjectsImageFilter;

该filter对连通区域进行排序,然后只保留最大的几个连通区域。

itk::LabelImageToShapeLabelMapFilter< OutputImageType, LabelMapType> ;

为保留的每个连通区域打上标签(标号),编号顺序为找到不同区域的顺序.

虽然LabelShapeKeepNObjectsImageFilter调用SetAttribute 之后,按照attribute对连通区域大小进行了排序,但该排序并不反映在label上。即大的label并不一定对应大的size。反映在 SetNumberOfObjects(n) 设定保留区域之后,只保留排序后前n个区域的label。

itk::RescaleIntensityImageFilter<OutputImageType, ImageType>;

上一步图像只有标签,图像上没有直接的区别,本步对保留下来的不同连通区域进行不同的染色,以示区分。

参考:二维ITK连通区域提取

ITK学习笔记(四)基于C++和ITK获取3D医学图像的最大连通区域相关推荐

  1. ITK学习笔记(十二) SimpleITK获取二值图像bbox

    ITK学习笔记(十二) SimpleITK获取二值图像bbox sitk_ seg_ img = sitk . ReadImage( m ) bbox =get_ bbox_ from mask(si ...

  2. 学习笔记四.基于HAL库的stm32f103硬件读写EEPROM(CUBEMX)

    基于cubemx的stm32f103硬件读写EEPROM 今天介绍一种可擦除存储器. EEPROM (Electrically Erasable Programmable read only memo ...

  3. Flask学习笔记(四):基于Flask网页显示图片

    原图如下 代码如下 from flask import Flask, request, make_response from datetime import datetime import osapp ...

  4. ITK学习笔记(二)最大圆度连通域提取

    ITK学习笔记(二)最大连通域提取 1.代码 1.1 code 1.2.生成的mask图片 1.3.打印信息 关于编译部分可以参考我的:VTK学习笔记(十)基于VTK和ITK程序 最大圆度概念: 圆度 ...

  5. ITK学习笔记(一)ITK的使用

    ITK学习笔记(一)ITK的使用 第一个ITK程序 1.CMakeLists.txt 2. 测试数据 3.代码 4.结果 ITK官方文档 第一个ITK程序 1.CMakeLists.txt # Thi ...

  6. ITK学习笔记(九) simpleITK重采样数据到固定尺寸

    ITK学习笔记(九) simpleITK重采样数据到固定尺寸 1.resampleSize 2.CT图像预处理之重采样 3.SKIMAGE.TRANSFORM-两种缩放皆可 4.Python Simp ...

  7. ITK学习笔记(八) ITK高斯混合模型 GMM EM

    ITK学习笔记(八) ITK高斯混合模型 GMM EM 1.高斯混合模型 2.变分贝叶斯高斯混合 3.ITK中的GMM.EM 1.高斯混合模型 sklearn.mixture是一个能够学习高斯混合模型 ...

  8. ITK学习笔记(七) ITK旋转方向位置不变

    ITK学习笔记(七) ITK旋转方向位置不变 sitk使用的使LPS坐标系,与slicer中使用的RAS坐标系不同. 在sitk中的方向(1,1,1)(1,1,1)(1,1,1),在slicer中的方 ...

  9. ITK学习笔记(五) ITK计算质心

    ITK学习笔记(五) ITK计算质心 通过LabelGeometryImageFilter可以求Label Image各个区域的质心和BoundingBox.然而,如果图像的spacing不是1,它并 ...

最新文章

  1. 机器学习两大利器:Boosting 与 AdaBoost
  2. 南京:第三届软博会“外包”将唱主角
  3. java rsa 公钥加密_java – 使用公钥进行RSA解密
  4. 连接手表_荣耀手表2 一键连接你的手上智慧新生活
  5. JSP 获取Request 经常使用參数
  6. 阿里巴巴Java开发编码规范—注释规约
  7. 全国哀悼日,CSS如何把整个网页黑白显示
  8. 新加坡政府开放数据门户网站
  9. php微云上传,API - 微云
  10. 早餐为啥不能吃大米粥?医生:不仅是米粥,这3物也最好少吃
  11. python将一张图片粘贴到另外一张图片上,按照指定坐标放置
  12. ubuntu16.04下安装录屏软件OBS studio
  13. python flask实战订餐系统微信小程序-60nginx + uwsgi 实现多进程访问
  14. 【CentOS】CentOS7最小安装版 VMware Tools安装
  15. 【计算机网络】可靠传输
  16. php 顺丰接口实例,顺丰对接源代码
  17. 基于matlab的相干信号的doa 估计,基于空间平滑MUSIC算法的相干信号DOA估计(1)
  18. 面向对象程序设计方法概述
  19. Pytorch_DDC(深度网络自适应,以resnet50为例)代码解读
  20. 学习写华为官网网页的心得

热门文章

  1. 网络存储服务ip-san搭建
  2. git clone ***
  3. Dubbo 泛化引用
  4. MYSQL:通过Navicat导入新的数据库
  5. 如何设定墙纸的显示方式?
  6. python 百度云文字识别 proxy_Python基于百度AI的文字识别的示例
  7. 江哥带你玩转C语言 | 14 - 结构体-枚举-共用体
  8. Python爬虫-网页认识
  9. 电力电子matlab 徐德鸿,动态电压恢复器DVRMATLAB仿真.doc
  10. 全球参考系统(WRS)概述及常用工具汇总