Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to replace pixel data on same dicom file using pydicom to read it again with any dicom viewer?

I want to read some DICOM files, so I'm testing pydicom for my work, which I think is considerably useful.

Now I want to load existing DICOM files, replace the pixel data array with another pixel array (e.g. pre-processing or literally another DICOM pixel array) and most of all, I want to read it again with any DICOM viewer application.

For this test, I used the tutorial code below. This code loads a test data file. The size of image is 64*64. The code below does sub-sampling from the original data. After that, the size of image is 8*8, and the result is saved to after.dcm.

But when I read the file using a DICOM viewer app (I used 'Dicompass'), the size of DICOM image is still 64*64. What is it that I'm missing?

I referred to the pydicom documentation (http://pydicom.readthedocs.io/en/stable/getting_started.html, https://pydicom.github.io/pydicom/stable/index.html) to solve my problem.

# authors : Guillaume Lemaitre <[email protected]>
# license : MIT

import pydicom
from pydicom.data import get_testdata_files

print(__doc__)

# FIXME: add a full-sized MR image in the testing data
filename = get_testdata_files('MR_small.dcm')[0]
ds = pydicom.dcmread(filename)

# get the pixel information into a numpy array
data = ds.pixel_array
print(data)

print('The image has {} x {} voxels'.format(data.shape[0],
                                        data.shape[1]))
data_downsampling = data[::8, ::8]
print('The downsampled image has {} x {} voxels'.format(
    data_downsampling.shape[0], data_downsampling.shape[1]))

# copy the data back to the original data set
ds.PixelData = data_downsampling.tostring()
# update the information regarding the shape of the data array
ds.Rows, ds.Columns = data_downsampling.shape

# print the image information given in the dataset
print('The information of the data set after downsampling: \n')
print(ds)
print(ds.pixel_array)
print(len(ds.PixelData))
ds.save_as("after.dcm")
like image 872
user8697183 Avatar asked Feb 19 '18 06:02

user8697183


People also ask

What is pixel data in DICOM?

Pixel data describe a color image with a single sample per pixel (single image plane). The pixel value is used as an index into each of the Red, Blue, and Green Palette Color Lookup Tables (0028,1101-1103&1201-1203). This value may be used only when Samples per Pixel (0028,0002) has a value of 1.

How do I read a DICOM image?

View DICOM Images To view the image data imported from a DICOM file, use one of the toolbox image display functions imshow or imtool . Note, however, that because the image data in this DICOM file is signed 16-bit data, you must use the autoscaling syntax with either display function to make the image viewable.

What is DICOM metadata?

DICOM files contain metadata that provide information about the image data, such as the size, dimensions, bit depth, modality used to create the data, and equipment settings used to capture the image. To read metadata from a DICOM file, use the dicominfo function.

How do I read a DICOM header in Python?

Access header data elements It translates the keyword to a (group,element) number and returns the corresponding value for that key if it exists. dir will return any DICOM tag names in the dataset that have the specified string anywhere in the name (case insensitive).


1 Answers

The code looks OK. But, you are not overwriting original file.

You load the file with:

filename = get_testdata_files('MR_small.dcm')[0]
ds = pydicom.dcmread(filename)

where original file name is "MR_small.dcm".

Then you save the file with:

ds.save_as("after.dcm")

where destination file name is different. That means, original file is still unchanged.

You should either load "after.dcm" in your DICOM viewer to test

OR

You should overwrite the file (pydicom.filewriter.dcmwrite) while saving it.


Not a part of your problem, but if you are creating copy of original image with change in pixel data, it is recommended that you also modify instance specific information in dataset like InstanceNumber (0020,0013), SOPInstanceUID (0008,0018) etc.

like image 118
Amit Joshi Avatar answered Sep 25 '22 17:09

Amit Joshi