2016-06-30 18 views
0

Я хочу разбирать файлы DICOM, чтобы выполнить некоторую обработку пикселей. Я пробовал библиотеки DCMTK, но он не работает для меня. Я хочу что-то очень простое, например, облегченная библиотека кросс-платформы на C++, так как я просто хочу читать файлы DICOM.Как читать dicom пикселей в C++

Любые предложения будут очень благодарны.

+1

Вы могли бы получить некоторую помощь, если вы могли бы быть более конкретным, чем «она не работает». (Основываясь на моем ограниченном знании DICOM, «легкий» - это то, чего вы просто не найдете. Даже DCMTK утверждает, что он реализует «большие части» стандарта.) – molbdnilo

+0

Я не имел в виду, что я не знал, как чтобы использовать его, я установил dcmtk.3.6.0 на ubuntu, но не знал, с чего начать, как я могу использовать его для чтения dcm-файлов. –

+0

Что касается просмотра документации DCMTK (например, здесь: http: // support. dcmtk.org/docs-snapshot/mod_dcmdata.html#Examples) и/или в многочисленные примеры инструментов (в подкаталогах «apps» пакета исходного кода). –

ответ

0

Вы можете использовать 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) 
{ 
    // Initialise ImageMagick library 
    InitializeMagick(*argv); 

    // Create Image object and read in DICOM image 
    Image image("sample.dcm"); 

    // Get dimensions 
    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 см технику Эрика here.

Или, в командной строке в терминале, вы можете преобразовать файл к сырьевым 8-битный RGB двоичных данных, как это:

# Convert 512x512 image to 8-bit RGB binary file 
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 байт, что 3 байта для каждого из 512x512 пикселей, так что вы можете непосредственно считывать данные в программу вашего C++ зная, что вы получите:

RGB RGB RGB RGB ... RGB 

Или, в командной строке в терминале, вы можете вывести изображение данные как hex:

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) 
Смежные вопросы