2016-09-23 2 views
4

J'essaie de lire les valeurs de pixels d'une image contenue dans un fichier DICOM dans ma simple application C++ en utilisant la bibliothèque DICOM Grassroots (GDCM). Lors de la lecture des métadonnées de fichiers que je reçois les informations suivantes sur l'image:Lecture des valeurs de pixel d'une image

Bits allocated: 16 
Bits Stored: 16 
High Bit: 15 
Unsigned or signed: 1 
Samples pr pixel: 1 
Dimensions: 2 
Dimension values: 256x256 
Pixel Representation: 1 
SamplesPerPixel: 1 
ScalarType: INT16 
PhotometricInterpretation: MONOCHROME2 
Pixel buffer length: 131072 

Étant donné que l'image a une résolution de 256x256 et est de type MONOCHROME2, je pensais la longueur du tampon de pixel à 256x256 = 65536 éléments mais est en fait 131072 éléments de long. Si j'utilise MATLAB à la place pour importer les données de pixels, j'obtiens exactement 65536 valeurs dans la plage 0 - 850 où 0 est noir et 850 est blanc. Quand je regarde le tampon de pixels que j'obtiens de la lecture GDCM dans mon application C++, le pixelbuffer est 131072 éléments où chaque élément indexé est dans la plage de -128 à +127 et chaque élément indexé impair est dans la plage de 010. -3. comme ceci:

Exerpt:  

PixelBuffer[120] = -35 
PixelBuffer[121] = 0 
PixelBuffer[122] = 51 
PixelBuffer[123] = 2 
PixelBuffer[124] = 71 
PixelBuffer[125] = 2 
PixelBuffer[126] = 9 
PixelBuffer[127] = 2 
PixelBuffer[128] = -80 
PixelBuffer[129] = 2 
PixelBuffer[130] = 87 
PixelBuffer[131] = 3 
PixelBuffer[132] = 121 
PixelBuffer[133] = 3 
PixelBuffer[134] = -27 
PixelBuffer[135] = 2 
PixelBuffer[136] = 27 
PixelBuffer[137] = 2 
PixelBuffer[138] = -111 
PixelBuffer[139] = 1 
PixelBuffer[140] = 75 
PixelBuffer[141] = 1 
PixelBuffer[142] = 103 

Que signifie cet arrangement de valeurs? Est-ce une sorte de représentation typique des pixels pour les images monochromes? J'ai été "googeling image pixel structure" et similaire mais ne peux pas trouver ce que je cherche. Y at-il des ressources disponibles qui peuvent m'aider à comprendre cette disposition des valeurs et comment elles sont corrélées à chaque pixel?

+1

'INT16' signifie que chaque pixel est constitué par un nombre entier de 2 octets. –

+0

Merci, ça m'a beaucoup aidé. Quel est un bon moyen de les combiner à un INT16. J'ai pensé à utiliser quelque chose comme c = (b << 8) + a; où "a" est LSB et "b" est MSB mais cela ne fonctionne pas lorsque "a" est signé. Aussi, comment "noir" est-il considéré comme 0 quand j'ai des valeurs négatives? Je suppose qu'une valeur négative ne peut pas être considérée comme "plus noire" que "noire"? – MrCravon

+0

Vous avez la bonne idée, mais vous devez traiter tous les octets et les valeurs à deux octets comme non signés. Je ne suis pas sûr de ce que votre code ressemble, mais vous pouvez commencer par lire des octets comme 'unsigned char' au lieu de' char', ou vous pouvez lancer à unsigned tôt, ou lancer à unsigned tard et juste à zéro tout signe de restes- bits étendus comme: 'unsigned court c = (static_cast (b) << 8) + (static_cast (a) & 0xff);'. C'est plutôt moche, mais cette technique est susceptible de fonctionner dans la plupart des cas. –

Répondre

1

j'utiliser ce code pour lire le fichier 16 bits MONOCHROME2 Dicom:

byte[] signedData = new byte[2]; 
     List<int> tempInt = new List<int>(); 
     List<ushort> returnValue = new List<ushort>(); 

     for (i = 0; i < PixelBuffer.Length; ++i) 
     { 
      i1 = i * 2; 
      signedData[0] = PixelBuffer[i1]; 
      signedData[1] = PixelBuffer[i1 + 1]; 
      short sVal = System.BitConverter.ToInt16(signedData, 0); 

      int pixVal = (int)(sVal * rescaleSlope + rescaleIntercept); 

      tempInt.Add(pixVal); 
     } 

     int minPixVal = tempInt.Min(); 
     SignedImage = false; 
     if (minPixVal < 0) SignedImage = true; 

     foreach (int pixel in tempInt) 
     { 
      ushort val; 
      if (SignedImage) 
       val = (ushort)(pixel - short.MinValue); 
      else 
      { 
       if (pixel > ushort.MaxValue) val = ushort.MaxValue; 
       else val = (ushort)(pixel); 
      } 

      returnValue.Add(val); 
     }