Search code examples
matlabimage-processingdicom

Can Hounsfield Units be shifted?


I'm working on some chest scans from the LIDC database, I am trying to apply iterative (optimal) thresholding on them to extract the lung area. Many researchers use an initial threshold of (or around -500) although they use the same database. I quote

The HU values in each Lung CT scan range from +2000 to -2000HU. The lung area is a low density area ranging from -1000 to -450HU, called non-body area.

I'm using Matlab for that purpose, my scans have different ranges and the problem is, non of them has the lung area under the range of (-1000 to -450HU) (or at least as far as I know), all of the areas ranges are from 0 and above except the area of the rim (the area produced by the scan machine).

How can I make those scans have normal ranges (shift the hounsfield units or something else) for me to work normally on with a lung window of (width of 1500, and center of -500)?

Example of a scan: Here's a Dicom slice with the properties below:

  • Widow Center: -600
  • Window Width: 1600
  • Rescale Intercept: -1024
  • min value: -1024
  • max value: +4095

I'm using the function dicomreadVolume to read the scans:

% Read the scan volume: (the result will be in 4D )
[V,s,d] = dicomreadVolume(fullfile('scan folder...'));

% Convert into 3D:
V2 = squeeze(V);

% display the slice number 83
imtool(V2(:, :, 83));

enter image description here enter image description here


Solution

  • Looking at the histograms, it seems that the function dicomreadVolume() does not take Rescale Slope and Rescale Intercept into account. I suppose the Pixel Representation (0028, 0103) of the image is 0 (= unsigned integer).

    So in fact, you are not dealing with HU in Matlab, you are rather dealing with raw pixel values. The transformation to HU is achieved by applying the linear transformation to each pixel. The linear transformation is defined by Rescale Intercept (0028,1052) and Rescale Slope (0028,1053):

    <pixel value in HU> := RescaleIntercept + RescaleSlope * <untransformed pixel value> 
    

    I would strongly recommend to go that way rather than shifting the range by some random value obtained from one particular image. This is because HU are valid across all images of the scan.