想用ITK读入一张dcm图像,然后写成jpg形式

yingzijuntuan 2013-07-24 04:57:24
如题,但是一直运行不成功,代码如下:求帮忙看看
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkRescaleIntensityImageFilter.h"
#include "itkGDCMImageIO.h"
#include "itkJPEGImageIO.h"
// Software Guide : EndCodeSnippet


void main( )
{


typedef signed short InputPixelType;
const unsigned int InputDimension = 2;

typedef itk::Image< InputPixelType, InputDimension > InputImageType;

typedef itk::ImageFileReader< InputImageType > ReaderType;

ReaderType::Pointer reader = ReaderType::New();
const char * infilename = "C:\\Users\\zhq\\Desktop\\data\\SNAP_CR\\E403434298\\E403434298S1901I301.dcm";
std::cout<<"infilename : "<<infilename<<std::endl ;
reader->SetFileName( infilename );

typedef itk::GDCMImageIO ImageIOType;

ImageIOType::Pointer gdcmImageIO = ImageIOType::New();

reader->SetImageIO( gdcmImageIO );


reader->Update();
typedef itk::JPEGImageIO JPEIOType ;
JPEIOType::Pointer jpgIO = JPEIOType::New();
typedef itk::ImageFileWriter< InputImageType > Writer1Type;

Writer1Type::Pointer writer1 = Writer1Type::New();
const char * outfilename = "C:\\Users\\zhq\\Desktop\\2.jgp";
writer1->SetFileName( outfilename );
writer1->SetInput( reader->GetOutput() );

writer1->SetImageIO( jpgIO );


writer1->Update();



}
...全文
557 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ri_aje 2013-07-25
  • 打赏
  • 举报
回复
这个文件中存储数据的元信息是什么?
ri_aje 2013-07-25
  • 打赏
  • 举报
回复
不知道,我没用过 DCM 格式的文件,我记得 dcm 把 metadata 以固定的格式放在文件头部了,然后 itk/vtk 的 reader 好像能够自动获取。但看 itk::Image 那个定义的接口,至少 data type 你还是要指定正确的,否则因为二进制读取长度的问题,数据可能出错。
yingzijuntuan 2013-07-25
  • 打赏
  • 举报
回复
怎么得到元信息呀?
ri_aje 2013-07-25
  • 打赏
  • 举报
回复
引用 4 楼 yingzijuntuan 的回复:
[quote=引用 3 楼 ri_aje 的回复:] 这个文件中存储数据的元信息是什么?
什么叫元信息?是数据类型还是什么? 说起数据类型来,我又对ITK里面的数据类型感到迷惑,居然可以把像素点定义为char型的,这是为什么?我按照example里面的区域生长法分割东西,结果定义为char型就ok,int型就得不到分割图,求解释![/quote] 元信息(metadata,我也不知道我翻译的对不对)就是关于数据的各种说明和格式,对于 image (or volume data),一般包含 (1) data dimension, eg. 2d or 3d? (2) size in each dimension, e.g. 200x500x317. (3) number of channels for each voxel (or pixel in the case of 2d image), usually one, for color or vector field, may be 2 or more. (4) type of data stored, (unsigned) char, (unsigned) short, (unsigned) int, float, double? or some other types. (5) for data type whose size > 1, little endian or big endian. 像你说的 char 就行 int 就不行,很大可能是因为 image 中的数据格式是 unsigned char,强行按 int 读的话,长度计算错误,后面读的就都是没用的信息了。 关于你奇怪 pixel 可以是 char。首先,没有什么规定 pixel data type 一定不能是 char,完全看具体的应用。其次,如果存储数据的具体值都在 [0,127],那 char 和 unsigned char 看不出区别,不过一般情况下单通道基础数据都是 unsigned char 类型,节省空间并且也没有大小端转换的烦恼。
一刀切 2013-07-25
  • 打赏
  • 举报
回复
医学图像处理的?
yingzijuntuan 2013-07-25
  • 打赏
  • 举报
回复
引用 3 楼 ri_aje 的回复:
这个文件中存储数据的元信息是什么?
什么叫元信息?是数据类型还是什么? 说起数据类型来,我又对ITK里面的数据类型感到迷惑,居然可以把像素点定义为char型的,这是为什么?我按照example里面的区域生长法分割东西,结果定义为char型就ok,int型就得不到分割图,求解释!
yingzijuntuan 2013-07-24
  • 打赏
  • 举报
回复
下面的是读入dcm,输出dcm的错误
yingzijuntuan 2013-07-24
  • 打赏
  • 举报
回复
不行呀,我现在就仅仅是读入一个dcm,然后输出dcm都有问题呀,求帮忙看看!
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkRescaleIntensityImageFilter.h"
#include "itkGDCMImageIO.h"

#include <list>
#include <fstream>

int main()
{
  typedef signed short InputPixelType;
  const unsigned int   InputDimension = 3;

  typedef itk::Image< InputPixelType, InputDimension > InputImageType;

  typedef itk::ImageFileReader< InputImageType > ReaderType;

  ReaderType::Pointer reader = ReaderType::New();
  reader->SetFileName( "C:\\Users\\zhq\\Desktop\\data\\pdVISTA\\E403434298\\E403434298S1601I1.dcm" );

  typedef itk::GDCMImageIO           ImageIOType;

  ImageIOType::Pointer gdcmImageIO = ImageIOType::New();

  reader->SetImageIO( gdcmImageIO );

  reader->Update();

  typedef itk::ImageFileWriter< InputImageType >  Writer1Type;

  Writer1Type::Pointer writer1 = Writer1Type::New();

  writer1->SetFileName( "C:\\Users\\zhq\\Desktop\\2.dcm" );
  writer1->SetInput( reader->GetOutput() );

  writer1->SetImageIO( gdcmImageIO );

  writer1->Update();

}

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧