如何使用c++读取dicom像素

我想解析DICOM文件以进行一些像素处理。我尝试使用DCMTK库,但它对我不起作用。我想要一些非常简单的东西,如轻量级跨平台C++库,因为我只想读取DICOM文件。

任何建议都将不胜感激。

点赞
用户2836621
用户2836621

ImageMagick可以用来读取DICOM文件,免费且跨平台,通常在Linux发行版上安装,并且可在OSX和Windows上使用。

以下是6.x版本的示例代码:

////////////////////////////////////////////////////////////////////////////////
// sample.cpp
// Mark Setchell
//
// ImageMagick Magick++ sample code
//
// Compile with:
// g++ sample.cpp -o sample $(Magick++-config --cppflags --cxxflags --ldflags --libs)
////////////////////////////////////////////////////////////////////////////////
#include <Magick++.h>
#include <iostream>

using namespace std;
using namespace Magick;

int main(int argc,char **argv)
{
   // 初始化ImageMagick库
   InitializeMagick(*argv);

   // 创建Image对象并读取DICOM图像
   Image image("sample.dcm");

   // 获取图像尺寸
   int w = image.columns();
   int h = image.rows();
   cout << "Dimensions: " << w << "x" << h << endl;

   PixelPacket *pixels = image.getPixels(0, 0, w, h);

   for(int y=0; y<h; y++){
      for(int x=0; x<w; x++){
         Color color = pixels[w * y + x];
         cout << x << "," << y << ":" << color.redQuantum() << "/" << color.greenQuantum() << "/" << color.blueQuantum() << endl;
      }
   }
}

示例输出

Dimensions: 512x512
0,0:0/0/0
1,0:0/0/0
2,0:0/0/0
3,0:0/0/0
4,0:0/0/0
5,0:0/0/0
6,0:0/0/0
7,0:0/0/0
8,0:0/0/0
9,0:0/0/0
10,0:0/0/0
11,0:0/0/0
12,0:0/0/0
13,0:0/0/0
14,0:0/0/0
15,0:0/0/0
16,0:0/0/0
17,0:0/0/0
18,0:0/0/0
19,0:0/0/0
20,0:0/0/0
21,0:0/0/0
22,0:0/0/0
23,0:0/0/0
24,0:0/0/0
25,0:0/0/0
...
...
260,18:80/80/80
261,18:144/144/144
262,18:192/192/192
263,18:80/80/80
264,18:32/32/32
265,18:144/144/144
...
...

如果要使用7.x版本,请参见Eric的技巧这里

或者在终端中使用以下命令将文件转换为原始的8位RGB二进制数据:

# 将512x512图像转换为8位RGB二进制文件
convert sample.dcm -depth 8 rgb:image.bin

ls -l image.bin
-rw-r--r--    1 mark  staff    786432 30 Jun 15:29 image.bin

你可以从文件大小中看到,图像现在是786432个字节,每个512x512像素为3个字节,因此你可以直接将数据读入C++程序,知道你会得到:

RGB RGB RGB RGB ... RGB

或者在终端中使用以下命令将图像数据转储为十六进制:

convert sample.dcm -depth 8 txt: | more

示例输出

# ImageMagick pixel enumeration: 512,512,65535,gray
0,0: (0,0,0)  #000000  gray(0)
1,0: (0,0,0)  #000000  gray(0)
2,0: (0,0,0)  #000000  gray(0)
2016-06-30 14:24:48