2012-10-27 5 views
1

C# 용 SimpleITK로 RAW 파일을 읽으려면 어떻게해야합니까? C# 용 SimpleITK를 사용하여 RAW 이미지 파일 읽기

나는

내 코드는 윈도우 (64 비트)에 SimpleITK C# 버전 0.5.1을 사용

String fileName = @"d:\Temp\MRI\t1_icbm_normal_1mm_pn3_rf20.rawb"; 
ImageFileReader reader = new ImageFileReader(); 
reader.SetFileName(fileName); 
Image image = reader.Execute(); 

그것은 .png를 잘 동작 또는 RAW 이미지 예를 들어, 이미지가 아니라 분석한다.

System.ApplicationException : Exception thrown in SimpleITK ImageFileReader_Execute: ..\\..\\..\\..\\..\SimpleITK\Code\IO\src\sitkImageReaderBase.cxx:44: 
sitk::ERROR: Unable to determine ImageIO reader for "d:\Temp\MRI\t1_icbm_normal_1mm_pn3_rf20.rawb" 

내가 ImageFileReader이 파일 형식을 인식 할 수없는 것을 이해 :

나는 다음과 같은 오류가 발생합니다. 표준 ITK 템플릿이 숨겨져 있기 때문에 SimpleITK에서 이미지 유형 및 이미지 매개 변수를 전달하는 방법이 있습니까?

답변

4

Insight-Users 그룹 덕분에이 문제를 해결할 수있는 몇 가지 단서가 있습니다. 문제는 ImageFileReader가 RAW 파일을 읽을 수 없다는 것입니다. 해결책은 이진 데이터를 수동으로 읽고 ImportImageFilter를 사용하여 Image 객체를 작성하는 것입니다. 다음 코드는 :

[Test] 
    public void ReadImageRAW() 
    { 
     String fileName = @"d:\Temp\MRI\t1_icbm_normal_1mm_pn3_rf20.rawb"; 

     Byte[] imageData = System.IO.File.ReadAllBytes(fileName); 

     UInt32 width = 181; 
     UInt32 height = 217; 
     UInt32 depth = 181; 

     ImportImageFilter importImageFilter = new ImportImageFilter(); 

     importImageFilter.SetSize(new VectorUInt32(new UInt32[] {width, height, depth})); 

     importImageFilter.SetDirection(new VectorDouble(new Double[] {1, 0, 0, 
                     0, 1, 0, 
                     0, 0, 1})); 

     importImageFilter.SetOrigin(new VectorDouble(new Double[] { 0, 0, 0 })); 

     importImageFilter.SetSpacing(new VectorDouble(new Double[] {1, 1, 1})); 

     GCHandle hObject = GCHandle.Alloc(imageData, GCHandleType.Pinned); 
     IntPtr imageDataPtr = hObject.AddrOfPinnedObject(); 

     importImageFilter.SetBufferAsUInt8(imageDataPtr); 

     Image importedImage = importImageFilter.Execute(); 
     SimpleITK.Show(importedImage); 
    } 
0

이 질문은 또한 [1] SimpelITK FAQ에 대한 답변이 일반 원 영상 파일

정보 누락. 데이터의 기본 크기와 유형을 설명하는 네 서사 헤더 정보가 없으므로이 형식은 본질적으로 결함이 있습니다. RawImageIO 클래스는 SimpleITK에서 사용할 수 없으므로이 헤더 정보를 프로그래밍 방식으로 하드 코딩하는 직접적인 방법은 없습니다. 제안 된 방법은 원시 데이터 파일을 참조하고 데이터의 크기와 유형을 설명하는 메타 이미지 헤더 파일 (* .mhd)을 만드는 것입니다. 메타 이미지 헤더를 쓰는 방법에 대한 문서는 여기에서 찾을 수 있습니다. 다음 아마도 이름 sample.mhd의 샘플 메타 영상 헤더 파일 :

ObjectType = Image 
NDims = 3 
DimSize = 256 256 64 
ElementType = MET_USHORT 
ElementDataFile = image.raw (this tag must be last in a MetaImageHeader) 

[1] http://www.itk.org/Wiki/SimpleITK/FAQ#How_do_I_read_a_RAW_image_into_SimpleITK.3F