Opening a DICOM file object
Used functions
Opening a DICOM file object from a file
if (!df) {
goto __dicom_open_error__;
}
import dicom
df = dicom.open_dicomfile('img001.dcm')
if df:
pass # Do something with dicomfile object
else:
print dicom.get_error_message()
# You don't need to close_dicomfile().
# If you want to remove object explicitly, use 'del'.
Opening a DICOM file object from memory buffer
FILE *fp;
char *membuf;
long membufsiz;
fp = fopen("img001.dcm", "rb");
if (!fp) goto __file_error__;
fseek(fp, 0, SEEK_END);
membufsiz = ftell(fp);
fseek(fp, 0, SEEK_SET);
membuf = (char *)malloc(membufsiz);
if (!membuf) goto __memory_error__;
fread(membuf, 1, membufsiz, fp);
fclose(fp);
free(membuf);
if (!df) goto __dicom_open_error__;
import dicom
fileimage = file('img001.dcm', 'rb').read()
df = dicom.open_dicomfile_from_memory(fileimage)
Get a data element and its value
Used functions
You have to get dicom::dataelement
objects before accessing values in a dicom file. A dicom::dicomelement
object can be obtained using function dicom::dataset::get_dataelement
or dicom::dicomfile::get_dataelement
.
std::string value;
} else {
value = std::string("N/A");
}
You may shorten get dataelement->check existence->get value process into one line.
dicom::dicomfile::get_dataelement
takes 'tag value' in several forms. If gggg,eeee mean group and element number of tag in hex form, following forms are acceptable.
0xggggeeee
"0xggggeeee"
"ggggeeee"
"ggggeeee.n.ggggeeee"
"KeyWord"
For example, following forms indicate a data element contains study description
0x00081030
"0x00081030"
"00081030"
"StudyDescription"
KeyWords are defined in ftp://medical.nema.org/medical/dicom/2009/09_06pu3.pdf
Get a data element in a nested dataset
If you need to access a data element in a nested dataset, you can use "ggggeeee.n.ggggeeee"
form.
dataset *ds;
dataelement *de;
double radionuclide_dose;
ds = df->get_dataelement(0x00540016)->
dataset_at(0);
if (ds != NULL) {
} else {
radionuclide_dose = 0.0;
}
Above codes can be shortened using "ggggeeee.n.ggggeeee"
form.
radionuclide_dose = df->get_dataelement("00540016.0.00181074")->to_double(0.0);
Functions to get values
A dicom::dataelement
objects has several functions name like to_variabletype()
.
Used functions
dicomfile *df;
int number_of_slices;
number_of_slices = df->get_dataelement(0x00540081)->to_int(0);
number_of_slices = (*df)[0x00540081].to_int(0);
number_of_slices = (*df)[0x00540081];
double slice_thickeness
slice_thickenss = df->get_dataelement(0x00180050)->to_double(0.0);
slice_thickness = (*df)[0x00180050].to_double(0.0)
slice_thickness = (*df)[0x00180050];
int *matrix_values;
int n;
(*df)["AcquisitionMatrix"].to_int_values_a(&matrix_values, &n);
if (matrix_values != NULL) {
printf("Acquisition Matrix");
for (int i = 0; i < n; i++)
printf(" %d", matrix_values[i]);
free(matrix_values);
}
std::vector<int> matrix_values;
matrix_values =(*df)["AcquisitionMatrix"].to_int_values();
matrix_values =(*df)["AcquisitionMatrix"];
double *image_position;
int n;
(*df)["ImagePositionPatient"].to_double_values_a(&image_position, &n);
if (image_position != NULL) {
printf("Image Patient Position");
for (int i = 0; i < n; i++)
printf(" %lf", image_position[i]);
free(image_position);
}
std::vector<double> image_position;
image_position =(*df)["ImagePositionPatient"].to_double_values();
image_position =(*df)["ImagePositionPatient"];
char *patient_name;
(*df)["PatientName"].to_string_a(&patient_name);
if (patient_name) {
printf("Patient name = %s\n", patient_name);
free(patient_name);
} else {
printf("Patient name is not available\n");
}
std::string patient_name;
patient_name = (*df)["PatientName"].to_string("N/A");
patient_name = (*df)["PatientName"];
char *pixeldata;
int pixeldata_len;
df->get_dataelement(0x7fe00010)->raw_value(&pixeldata, &pixeldata_len);
if (pixeldata) {
}
Get values with Python
# get a value in 'int' form
# equivalent forms to get 'int' values
number_of_slices = df.get_dataelement(0x00540081).get_value()
number_of_slices = df[0x00540081]
# get a value in 'real' form
slice_thickenss = df.get_dataelement(0x00180050).to_double(0.0)
slice_thickenss = df.get_dataelement(0x00180050).get_value()
slice_thickness = df[0x00180050]
# get multiple 'int' values in a dataelement
acq_mat = df.get_dataelement("AcquisitionMatrix").to_int_values()
acq_mat = df.get_dataelement("AcquisitionMatrix").get_value()
acq_mat = df["AcquisitionMatrix"]
# get multiple 'double' values
img_pos = df.get_dataelement("ImagePositionPatient").to_double_values()
img_pos = df.get_dataelement("ImagePositionPatient").get_value()
img_pos = df["ImagePositionPatient"]
# get string values
pat_name = df.get_dataelement("PatientName").to_string()
pat_name = df.get_dataelement("PatientName").to_string("N/A")
pat_name = df["PatientName"]
# get a value in binary form
raw_pixeldata = df.get_dataelement(0x7fe00010).raw_value()
Setting Values
Write to a file
Getting pixel data
Getting pixel data with C++
Used functions
dicomfile *df;
int width, height;
int precision, signedness;
int ncomponents, bytes_per_pixel;
int nframes;
char* pixel_buffer;
int buffer_length;
int row_step, frame_step;
if (df) {
df->get_image_info(&width, &height,
&precision, &signedness,
&ncomponents, &bytes_per_pixel, &nframes);
if (width) {
buffer_length = width*bytes_per_pixel*height*nframes;
pixel_buffer = new char[buffer_length];
row_step = width*bytes_per_pixel;
frame_step = width*bytes_per_pixel*height;
copy_pixeldata_to(&pixel_buffer, row_step, frame_step);
delete pixel_buffer;
}
else {
printf("Problem in get pixel data from a dicom file.\n");
}
}
else {
}
Getting pixel data with Python
import numpy
def extract_pixeldata(filename):
if not df:
return None
width, height, prec, sgnd, ncomps, bpp, nframes = df.get_image_info()
pixeldata = df.get_pixeldata()
if not pixeldata:
return None
if width*height*prec == 0:
return None
shape = [height, width]
if ncomps > 1:
shape += [ncomps]
if nframes > 1:
shape = [nframes] + shape
if prec > 8:
dtype = numpy.int16 if sgnd else numpy.uint16
elif prec > 0:
dtype = numpy.int8 if sgnd else numpy.uint8
else:
return None
ar = numpy.fromstring(pixeldata, dtype=dtype)
ar.shape = shape
return ar
def extract_pixeldata_much_simpler_version(filename):
if df:
return df.to_numpy_array(self)
else:
return None
Setting pixel data
Used functions