ITK入门教程(4)ITK图像读写
主要内容
- 1. 常见的医学图像格式
- 2. ITK的数据处理管道结构
- 3. ITK图像读写机制
- 4. RGB图像的读写程序示例
- 5. 读写3维mhd图像
1. 常见的医学图像格式
2. ITK的数据处理管道结构
ITK中的数据处理对象分为3种类型:
- Source类型对象的输出为数据对象,包括各种图像文件读取类
- Filter类型对象以一个或多个数据对象作为输入,然后输出一个或多个数据对象,包括数据处理算法类
- Mapper类型对象是管道处理的最后一步,它将最终处理结果存到硬盘
3. ITK图像读写机制
- 用户层面:
itkImageFileReader
(读)itkImageFileWriter
(写) - 内部实现:由内部
ImageIO
对象具体负责图像文件读写操作,该对象通过对象工厂根据用户输入文件类型生成相应的ImageIO
对象。 - 优点:
- 使用方便,用户无需关注内部实现细节
- 扩展方便,扩展支持新的图像读取而无需修改用户接口,只需添加相应的工厂类和IO类
- ITK图像读写类图
4. RGB图像的读写程序示例
#include"itkImage.h"
#include"itkImageFileReader.h"
#include"itkImageFileWriter.h"
// PNG对应
#include <itkPNGImageIOFactory.h>
// BMP对应
#include <itkBMPImageIOFactory.h>
// JPG对应
#include <itkJPEGImageIOFactory.h>
// mhd格式图像
// #include <itkMetaImageIOFactory.h>//using ImageType = itk::Image<unsigned char, 2>; //如果使用这行,则保存的是灰度图像
using PixelType = itk::RGBPixel< unsigned char>; // 如果使用的是这行,则保存的是RGB图像
// 通过指定表示像素的类型和图像维数来定义图像类型
using ImageType = itk::Image<PixelType, 2>;
void WriteImage(const ImageType::Pointer image, const std::string&fileName) {itk::ObjectFactoryBase::RegisterFactory(itk::JPEGImageIOFactory::New());using WriterType = itk::ImageFileWriter<ImageType>;WriterType::Pointer writer = WriterType::New();writer->SetFileName(fileName);writer->SetInput(image);writer->Update();
}
/*使用图像类型就可以实例化图像读取器类。把图像类型作为模板参数来定义读入内存中的数据代表的意义。这里的类型不需要和文件中储存的类型完全一样。读取器除了将文件中的像素类型映射为ImageFileReader中的像素类型外,不对像素数据做任何转换。*/
itk::ImageFileReader<ImageType>::Pointer ReadImage(const std::string&filename)
{// 读取器至少需要知道载入内存的图像的文件名信息。可以通过SetFileName( )方法来实现。这里的文件格式可由文件名扩展推断得知。用户也可以使用itk::ImageIOBase类(从该类的继承图可以找到可能性列表)来显式指定数据格式。itk::ObjectFactoryBase::RegisterFactory(itk::JPEGImageIOFactory::New());// 或itk::BMPImageIOFactory::New() // 或itk::JPGImageIOFactory::New()using ImageReader = itk::ImageFileReader<ImageType>;// 现在就可以用Reader类型来创建一个Reader对象。一个由::Pointer 定义的itk::SmartPointer智能指针用来指向新创建的Reader。调用New( )方法来创建图像读取器的实例。ImageReader::Pointer reader = ImageReader::New();reader->SetFileName(filename);/* Reader对象被作为管道源对象,它们响应管道更新请求并启动管道中的数据流。管道更新机制确保Reader仅在Reader 得到数据请求而且没有读取任何数据的情况下运行。在当前的例子中,因为Reader的输出并未连接到其它的滤波器,所以我们显式地调用了Update( )方法。在正常应用中Reader的输出连接到图像滤波器的输入,滤波器的更新调用会触发reader的更新。下面演示了reader如何显式调用更新。*/reader->Update();return reader;
}int main(int argc, char* argv[])
{const std::string fileName = "lena.jpg";itk::ImageFileReader<ImageType>::Pointer image = ReadImage(fileName);std::string fileNameOutput = "lenaOutput.jpeg";//通过对调用reader的GetOutput( )方法来访问新读取的图像。这个方法也可以在更新请求发送到reader//之前调用。即使图像是空的图像(直到Reader实际执行,图像才不为空图像),其图像引用都是有效的。WriteImage(image->GetOutput(), fileNameOutput);
}
5. 读写3维mhd图像
#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include"itkRescaleIntensityImageFilter.h"
// mhd格式图像
#include <itkMetaImageIOFactory.h>const unsigned int kDimension = 3;
typedef float PixelType;
typedef itk::Image<PixelType, kDimension> ImageType;
typedef itk::ImageFileReader<ImageType> ReaderType;
typedef itk::ImageFileWriter<ImageType> WriterType;
typedef itk::Point<float, 3> PointType;int main(int argc, char **argv)
{itk::ObjectFactoryBase::RegisterFactory(itk::MetaImageIOFactory::New());// itk::PNGImageIOFactory::New()或itk::BMPImageIOFactory::New() // 或itk::JPGImageIOFactory::New()ReaderType::Pointer reader = ReaderType::New();reader->SetFileName("3.mhd"); //当前文件夹下需要有3.mhd 3.raw两个文件reader->Update();Rescale the image so that it can be seen(the output is 0 and 1,we want 0 and 255)//using RescaleType = itk::RescaleIntensityImageFilter<ImageType, ImageType>;//RescaleType::Pointer rescaler = RescaleType::New();//rescaler->SetInput(reader->GetOutput());//rescaler->SetOutputMinimum(0);//rescaler->SetOutputMaximum(1);//rescaler->Update();//ImageType::Pointer image = rescaler->GetOutput();ImageType::Pointer image = reader->GetOutput();typedef itk::ImageFileWriter<ImageType> WriterType;WriterType::Pointer writer = WriterType::New();writer->SetFileName("result_3.mhd");writer->SetInput(image);writer->Update();return 0;}
ITK入门教程(4)ITK图像读写相关推荐
- 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析
[-] 一开胃菜之一 关于OpenCV的命名空间 二开胃菜之二 关于Mat类型 三图像的载入和显示 imread函数 namedWindow函数 imshow函数 四输出图像到文件imwrite函 ...
- ITK入门教程(10)ITK从缓冲器中导入图像数据
目录 1.概述 2.过程分析 3.代码样例 4.结果展示 1.概述 这个例子阐述了如何导入数据到itk::Image类中.这在和其它软件系统接口时非常有用.许多系统使用连续的内存块作为图像像素数据的缓 ...
- ITK入门教程(8)ITKRGB图像
@TOC 1.概述 RGB(红.绿.蓝)是数字图像中常使用的一种彩色模型.RGB 表示的是使用三基色来分析人类肉眼所能分辨的可见光的代表彩色模型. ITK 使用itk::RGBPixel 类型来支持一 ...
- ITK入门教程(17)nii,mhd,stl之间的相互转换
本文细说一下医学图像中常见的文件格式之间的转换. 1.如何将raw/mhd转换为Nifti/nii 您应该能够使用 SimpleITK 来完成.你会做这样的事情: import SimpleITK a ...
- ITK入门教程(13)点集之得到点中的存储数据
目录 1.概述 2.过程讲解 3.代码 4.结果 1.概述 Itk::PointSet 类是与图像类交互的.因此点集中的点可以很方便地保存从图像计算得到的值.与点相关的值被指定为PixelType像素 ...
- ITK入门教程(7)ITK定义原点和间距
主要内容 1.概述 2.代码实现 3.结果 参考目录 1.概述 尽管ITK可以用来执行通用图像处理的任务,但是这个工具包的主要目的是处理医学图像数据.因此关于图像的额外信息是强制性要求的.尤其是与像素 ...
- ITK入门教程(1)添加噪声
从本文开始,将开启ITK之旅! ITK 是一个开源的跨平台库,为开发人员提供了一套广泛的图像分析软件工具. ITK 通过极限编程方法开发,建立在经过验证的面向空间的架构上,用于处理.分割和配准二维.三 ...
- Photoshop 入门教程 如何更改图像分辨率?
欢迎观看 Photoshop 入门教程,您将通过这些教程学习 Photoshop 的基本工具和使用技巧.小编将为您介绍 Photoshop 工作区,并向您展示更改图像分辨率的使用方法. 首先安装Pho ...
- ITK入门教程(6)ITK图像数据访问与修改(低效版本)
主要内容 1.概述 2.代码展示 3.结果展示 参考目录 1.概述 本节阐述SetPixel( )和GetPixel( )方法的用法.这两个方法可以直接访问图像中包含的像素数据.考虑到这两种方法相对缓 ...
最新文章
- sql server面试题
- MySQL中 Order By 和 Limit 的排序问题
- 杰奇linux伪静态,常用的13个.htaccess重写URL的伪静态规则
- 在家办公是什么“下场”,来看看美国历史
- 微信浏览器取消缓存的方法
- visual studio 调试 定义debug常量_有趣的阅读 12个提高生产力的Visual Studio调试技巧...
- 在带有OR条件的LEFT JOIN中使用索引(Using index in LEFT JOIN with OR condition)
- 大数据_Flink_流式处理_简介_流数处理的发展演变---Flink工作笔记0004
- 让Android Studio 使用上vs的android模拟器
- python联系题1
- LeetCode之3Sum Closest(Kotlin)
- 中石油acm训练赛NO.9(小X与煎饼)
- 机器学习实战 —— 决策树(完整代码)
- 文心一言打开f12后进入空白页面
- 在Windows下安装Vim编辑器
- 使用Teleport Ultra批量克隆网站,使用Easy CHM合并生成chm文件
- 牛根生的“牛“,牛在哪里?
- Android 工程师必知必会的“ AOP知识 ”
- 舞动DB2图书签售火爆 部分作者现身中关村图书大厦
- 旺季选品逻辑:用数据思维找到潜力爆款
热门文章
- 2020.8.26丨代谢组测序产品概述
- 169v 条目不存在_钴催化1,6烯炔与片呐醇硼烷的不对称硼氢化/环化反应
- 虚拟机连接服务器出现网络错误,winscp连接VM虚拟机出现网络错误连接超时
- WebRTC之DTLS技术解析
- 应对深度学习人才缺口,百度黄埔学院发起深度学习架构师培养计划
- 浏览器兼容:在ie edge中消除默认出现的密码框小眼睛标志
- 云计算入门_云计算:入门
- 用Python+OpenCV进行数据扩充
- tkinter matplotlib 画图
- Matlab——二进制转十进制(包含小数转换)