2014-05-01 144 views
0

我試圖從180度(或翻轉)的DICOM文件中旋轉原始像素數據。然而,在將像素數據寫回到文件(在這種情況下,它是一個DICOM文件)並顯示它之後,我已經成功地翻轉了圖像。圖像的最終輸出不正確。旋轉圖像的原始像素數據180度

下面是我試圖翻轉180 /鏡像的圖像樣本示例。

enter image description here

下面是我使用進行翻轉代碼:

 string file = @"adicomfile.dcm"; 
     DicomFile df = new DicomFile(); 
     df.Load(file); 

      // Get the amount of bits per pixel from the DICOM header. 
     int bitsPerPixel = df.DataSet[DicomTags.BitsAllocated].GetInt32(0, 0); 

      // Get the raw pixel data from the DICOM file. 
     byte[] bytes = df.DataSet[DicomTags.PixelData].Values as byte[]; 

        // Get the width and height of the image. 
     int width = df.DataSet[DicomTags.Columns].GetInt32(0, 0); 
     int height = df.DataSet[DicomTags.Rows].GetInt32(0, 0); 

     byte[] original = bytes; 
     byte[] mirroredPixels = new byte[width * height * (bitsPerPixel/8)]; 

     width *= (bitsPerPixel/8); 

        // The mirroring/image flipping. 
     for (int i = 0; i < original.Length; i++) 
     { 
      int mod = i % width; 
      int x = ((width - mod - 1) + i) - mod; 

      mirroredPixels[i] = original[x]; 
     } 

     df.DataSet[DicomTags.PixelData].Values = mirroredPixels; 

     df.Save(@"flippedicom.dcm", DicomWriteOptions.Default); 

這是我的輸出(不正確)。白色和失真不是所需的輸出。

enter image description here

我使用ClearCanvas DICOM庫,但是這不應該的問題,因爲我只是試圖操縱包含在文件本身的原始像素數據。

期望的輸出將優選看起來像原始,但翻轉180 /鏡像。

一些援助將不勝感激。我試過我最好的搜索,但無濟於事。

+0

拍一個小圖像作爲測試,看看它實際移動的是什麼字節 – csharpwinphonexaml

+0

事實上,你的圖像是正確的形狀,並在正確的位置有正確的元素告訴我你的數學是正確的,你正在移動像素正確的地方到正確的地方。所以我不得不懷疑你沒有移動整個像素 - 也許你只是移動紅色或綠色或藍色通道,如果是彩色圖像,或者你沒有正確遮蓋透明度並將其添加回來。我說你的數學會給你正確的位置,但是你不是從原點拾取整個像素,或者不是將整個像素寫回翻轉的圖像。 –

+0

「bitsPerPixel」的值是什麼(以及圖像的PhotometricInterpretation是什麼)?如果它大於8,那麼你將需要一個int數組而不是字節數組 –

回答

0

它花了一段時間,但我最終通過使用Java庫中的方法解決了我的問題。你可以看到類here

string file = @"adicomfile.dcm"; 
DicomFile df = new DicomFile(); 
df.Load(file); 

// Get the amount of bits per pixel from the DICOM header. 
int bitsPerPixel = df.DataSet[DicomTags.BitsAllocated].GetInt32(0, 0); 

// Get the raw pixel data from the DICOM file. 
byte[] bytes = df.DataSet[DicomTags.PixelData].Values as byte[]; 

// Get the width and height of the image. 
int width = df.DataSet[DicomTags.Columns].GetInt32(0, 0); 
int height = df.DataSet[DicomTags.Rows].GetInt32(0, 0); 

byte[] newBytes = new byte[height * width * (bitsPerPixel/8)]; 
int stride = bitsPerPixel/8; 

for (int y = 0; y < height; y++) 
{ 
     for (int x = 0; x < width * stride; x++) 
     { 
     newBytes[((height - y - 1) * (width * stride)) + x] = bytes[(y * (width * stride)) + x]; 
    } 
} 

// Set patient orientation. 
df.DataSet[DicomTags.PatientOrientation].Values = @"A\L"; 

// The pixel data of the DICOM file to the flipped/mirrored data. 
df.DataSet[DicomTags.PixelData].Values = mirroredPixels; 

// Save the DICOM file. 
df.Save(@"flippedicom.dcm", DicomWriteOptions.Default); 

輸出是正確的,我能夠繼續對原始像素數據進行其他修改。

謝謝大家的指點。