Medical & Scientific Vision
Hounsfield Units
The scale on which CT scanners report attenuation, fixed at 0 for water and −1000 for air, how scanners are calibrated to it, why tissue values still depend on the X-ray energy and the scanner, and how windowing turns it into a displayed image.
beginner
A CT scanner reconstructs the linear attenuation coefficient of X-rays at every voxel, but it reports a CT number in Hounsfield units (HU), on a scale where water is 0 and air is −1000. Because scanners are calibrated to the same two reference points, CT intensities carry a physical meaning that camera pixel values lack, and a threshold or normalization in HU refers to roughly the same material in any scan. Only water and air are fixed, though: the values of every other material depend on the X-ray energy, and so on the tube voltage, the scanner and the patient.
Definition
The Hounsfield unit expresses a linear attenuation coefficient relative to that of water, in parts per thousand, offset so that water is zero. Both coefficients are taken at the scanner’s effective energy, and the scanner outputs integers that usually lie between −1000 and 3000 (Kak & Slaney, 1988, §4.1.2).
Intuition
Hounsfield’s Nobel lecture explains the reference: water was set to zero for convenience, because its absorption is close to that of tissue, with air at −1000 at the bottom of the scale and bone near the top, some 1000 levels either side of water. Adding 1000 to every reading makes air zero and water +1000, giving readings that relate to true absorption (Hounsfield, 1979). The scale is attenuation, shifted and scaled so that soft tissues, which differ from water by a few per cent, get small integers. It follows that one HU is 0.1% of water’s attenuation, so Hounsfield’s stated accuracy of about 1/4% with respect to water and typical noise of 1/2% on tissue correspond to about 2.5 and 5 HU.
Formal Definition
Kak and Slaney (1988, ch. 4, Eq. 12) write the CT number as
with both coefficients at the same effective energy. Water gives , and , which Kak and Slaney take as the attenuation of air, gives . Air’s attenuation is not exactly zero: by our calculation from the NIST tables used in the example below, dry air attenuates about a thousandth as strongly as water and would read about −999 HU.
A real scanner rarely reads exactly 0 for water and −1000 for air. If its measured values are a linear function of the true attenuation, they can be corrected with the measured values for water and air (Kak & Slaney, 1988, ch. 4, Eq. 13):
This two-point linear calibration maps the measured water and air values to 0 and −1000 and interpolates everything else.
Typical Values
Published tables give tissue values as ranges. Taubmann et al. (2018, Table 8.1) list the HU observed in several materials and note that denser structures generally have larger values; Hounsfield’s lecture (1979, Fig. 11) drew a scale from which the values below are read approximately.
| Material | Taubmann et al. (2018), Table 8.1 | Hounsfield (1979), Fig. 11 |
|---|---|---|
| Air | −1000 | −1000 |
| Lung | −600 to −400 | — |
| Fat | −100 to −60 | about −90 to −70 |
| Water | 0 | 0 |
| Muscle | 10 to 40 | — |
| Blood | 30 to 45 | “blood volume measurements” near 40 |
| Soft tissue | 40 to 80 | “tissue” about 20 to 35 |
| Bone | 400 to 3000 | near +1000, top of the scale |
The sources agree on the order of materials and differ in detail: Hounsfield’s scale ends at about +1000, while Taubmann et al.’s bone range reaches 3000, the top of Kak and Slaney’s range. These are ranges for orientation, not reference values.
Calibration and Energy Dependence
Attenuation depends on photon energy, and a CT tube emits a spectrum: at 120 kVp, photons from 0 to 120 keV (Taubmann et al., 2018, §8.5.2). McCullough’s effective energy, as Kak and Slaney (1988, §4.1.2) present it, is the monochromatic energy at which a material would show the attenuation the scanner measures; McCullough et al. found 72 keV for the original EMI head scanner at 120 kV. It depends on how the detectors respond to photons as well as on the tube spectrum, and it is valid only when every ray leaves the object with the same spectrum; when the exit spectra differ, beam-hardening artifacts appear.
Materials change their attenuation with energy at different rates, so calibrating water and air does not calibrate anything else. Taubmann et al. (2018, §8.5) state that for materials other than water and air, the HU value depends on the design and settings of the CT system and on the whole scanned object, and that single-energy CT cannot provide quantitative information on tissue composition (§8.5.2).
Quality-control testing reflects this. AAPM Report 233 (2019, Table 7a) summarizes CT number accuracy tests; in the American College of Radiology (ACR) method, a phantom with inserts of known materials, including water and air, is scanned at each available tube voltage. For the ACR phantom it lists −7 to 7 HU for water, −1005 to −970 HU for air, 850 to 970 HU for Teflon/bone, −107 to −84 HU for polyethylene and 110 to 135 HU for acrylic, and notes that these tolerances apply at 120 kV (or 130 kV), while at other tube voltages only those for water and air apply. The IEC method it summarizes requires water within ±10 HU for objects up to 30 cm across.
Measuring at two energies turns the dependence into information. Kak and Slaney (1988, §4.1.2–4.1.3) describe how two scans with different spectra separate the photoelectric and Compton contributions to attenuation, after Brooks and after Alvarez and Macovski, which allows some chemical identification of materials and an attenuation image at any chosen energy, free from beam hardening in principle. Hounsfield (1979) cited separating iodine from tissue by subtracting pictures at two X-ray energies as the most used example. Taubmann et al. (2018, §8.5.2) describe dual-energy CT, for example at 80 and 140 kVp, as the route to quantitative tissue information. DICOM requires HU as the rescaled output of original CT images that are neither localizers nor multi-energy acquisitions (NEMA, 2026, C.8.2.1).
Windowing and Display
A CT image spans thousands of HU, a display a few hundred grey levels, and soft tissues differ by tens of HU. Hounsfield (1979) described restricting the displayed tones to a small part of the scale, a “window” raised to see tissue such as the heart or lowered for detail in the air of the lungs, and narrowed to bring out the difference between the liver and other organs; his Fig. 11 draws a window a few tens of HU wide.
A window is specified by its centre (level) and width . DICOM defines the default linear mapping from an input value , the stored value after the rescale to HU, to an output in (NEMA, 2026, C.11.2.1.2.1):
In the standard’s own example, and map inputs of −50 and below to 0 and inputs above 49 to 255. The standard notes that the terms are not used consistently in practice and were not defined in its earlier releases. An image can carry several centre and width pairs as alternative views, each with a free-text explanation, and the VOI LUT Function attribute can replace the linear mapping with LINEAR_EXACT, which maps exactly the interval from to , or with a sigmoid (NEMA, 2026, C.11.2).
Windowing is a display mapping, not a change to the data. It follows from the formula that inside the window every difference, contrast and noise alike, is multiplied by , and that outside it values are clipped.
Examples
Two scripts simulate a scanner with scikit-image 0.25.2 and NumPy 2.3.5. The phantoms are discs of water, fat (adipose tissue), skeletal muscle and cortical bone in air, with attenuation coefficients from the NIST tables of mass attenuation coefficients and densities (Hubbell & Seltzer, 2004; Tables 2 and 4, ICRU-44 compositions for the tissues) at 60 and 80 keV. The scanner is monoenergetic, the idealization behind the effective energy: each energy stands in for a scanner or tube voltage with that effective energy, not for a particular product, and beam hardening and scatter are left out.
The first script scans a 20 cm water cylinder in air, with Poisson noise from photons per ray and filtered back-projection, and reports uncalibrated numbers based on a wrong factory value for water plus a drift of 12 HU. Water and air readings from this scan calibrate, by Kak and Slaney’s correction, a second scan of the cylinder with fat, muscle and bone inserts, and the results are compared with HU computed directly from the NIST coefficients.
import numpy as np
from skimage.transform import radon, iradon
# Linear attenuation coefficients in 1/cm: mass attenuation coefficients
# (NIST SRD 126, Table 4) times densities (Table 2) at two photon energies.
mu = {60: dict(air=1.205e-3 * 0.1875, water=0.2059, fat=0.95 * 0.1974,
muscle=1.05 * 0.2048, bone=1.92 * 0.3148),
80: dict(air=1.205e-3 * 0.1662, water=0.1837, fat=0.95 * 0.1800,
muscle=1.05 * 0.1823, bone=1.92 * 0.2229)}
n, dx = 256, 0.1 # 256 x 256 pixels of 1 mm
yy, xx = np.mgrid[:n, :n] - n / 2 + 0.5
disc = lambda x0, y0, r: (xx - x0) ** 2 + (yy - y0) ** 2 <= r ** 2
inside, body = disc(0, 0, n / 2 - 1), disc(0, 0, 100) # 20 cm water cylinder
inserts = {"fat": (-50, 0), "muscle": (50, 0), "bone": (0, 50)}
theta = np.linspace(0.0, 180.0, 360, endpoint=False)
def scan(m, seed, N0=1e5):
"""Monoenergetic parallel-beam scan with Poisson counts, Hann-filtered FBP."""
p = radon(m, theta=theta) * dx
counts = np.random.default_rng(seed).poisson(N0 * np.exp(-p))
return iradon(-np.log(np.maximum(counts, 1) / N0), theta=theta,
filter_name="hann") / dx
def raw_numbers(rec):
# The scanner's uncalibrated output: a factory value for water and a drift.
return 1000 * (rec - 0.19) / 0.19 + 12
for E, m in mu.items():
calib = np.where(body, m["water"], m["air"]) * inside
test = calib.copy()
for name, (x0, y0) in inserts.items():
test[disc(x0, y0, 15)] = m[name]
Hm = raw_numbers(scan(calib, seed=1))
Hw, Ha = Hm[disc(0, 0, 40)].mean(), Hm[disc(0, 0, 120) & ~disc(0, 0, 108)].mean()
H = 1000 * (raw_numbers(scan(test, seed=2)) - Hw) / (Hw - Ha) # Kak & Slaney Eq. 13
true = {k: 1000 * (v - m["water"]) / m["water"] for k, v in m.items()}
print(f"{E} keV: raw water {Hw:7.1f}, raw air {Ha:7.1f}")
for name in ["water", "fat", "muscle", "bone"]:
roi = disc(*inserts[name], 10) if name in inserts else disc(0, -50, 10)
print(f" {name:6s} calibrated {H[roi].mean():7.1f} HU "
f"from NIST {true[name]:7.1f} HU ROI SD {H[roi].std():5.1f}")
60 keV: raw water 95.8, raw air -986.8
water calibrated -0.7 HU from NIST 0.0 HU ROI SD 16.0
fat calibrated -87.7 HU from NIST -89.2 HU ROI SD 13.8
muscle calibrated 45.6 HU from NIST 44.4 HU ROI SD 14.4
bone calibrated 1936.7 HU from NIST 1935.5 HU ROI SD 24.5
80 keV: raw water -21.1, raw air -986.9
water calibrated 0.6 HU from NIST 0.0 HU ROI SD 11.4
fat calibrated -69.3 HU from NIST -69.1 HU ROI SD 12.5
muscle calibrated 42.2 HU from NIST 42.0 HU ROI SD 11.3
bone calibrated 1331.4 HU from NIST 1329.7 HU ROI SD 16.0
The uncalibrated water readings are off by different amounts at the two energies, since the factory value fits neither. After the correction, every insert agrees with its NIST value to within the noise of its region, so each scanner is correctly calibrated. Yet between the energies, water and muscle barely move while fat shifts by about 20 HU and cortical bone by about 600 HU, a third of its value, because bone’s attenuation falls much faster with energy than water’s. Fat and bone fall inside Taubmann et al.’s ranges; muscle, at 42–44 HU, lies just above their 10 to 40 HU, another instance of the spread between sources.
The second script adds a faint disc 20 HU above water to the 60 keV phantom, converts the reconstruction to HU, and displays it through three windows with the DICOM formula, measuring the disc’s contrast against a surrounding ring in grey levels, the ring’s noise, their ratio, and the fraction of the cylinder clipped to black or white.
import numpy as np
from skimage.transform import radon, iradon
# The 60 keV test phantom of the first script, plus a faint disc 20 HU above water.
m = dict(air=1.205e-3 * 0.1875, water=0.2059, fat=0.95 * 0.1974,
muscle=1.05 * 0.2048, bone=1.92 * 0.3148)
n, dx = 256, 0.1
yy, xx = np.mgrid[:n, :n] - n / 2 + 0.5
disc = lambda x0, y0, r: (xx - x0) ** 2 + (yy - y0) ** 2 <= r ** 2
body = disc(0, 0, 100)
mu = np.where(body, m["water"], m["air"]) * disc(0, 0, n / 2 - 1)
for name, (x0, y0) in {"fat": (-50, 0), "muscle": (50, 0), "bone": (0, 50)}.items():
mu[disc(x0, y0, 15)] = m[name]
lesion, ring = disc(0, -50, 12), disc(0, -50, 28) & ~disc(0, -50, 18)
mu[lesion] *= 1.02 # +20 HU
theta = np.linspace(0.0, 180.0, 360, endpoint=False)
p = radon(mu, theta=theta) * dx
counts = np.random.default_rng(0).poisson(1e5 * np.exp(-p))
rec = iradon(-np.log(np.maximum(counts, 1) / 1e5), theta=theta,
filter_name="hann") / dx
hu = 1000 * (rec - m["water"]) / m["water"] # a calibrated scanner
print("HU: background %.1f, lesion %.1f, background SD %.1f"
% (hu[ring].mean(), hu[lesion].mean(), hu[ring].std()))
def window(x, c, w, ymin=0.0, ymax=255.0):
# DICOM PS3.3 C.11.2.1.2.1, default LINEAR function
y = ((x - (c - 0.5)) / (w - 1) + 0.5) * (ymax - ymin) + ymin
y = np.where(x <= c - 0.5 - (w - 1) / 2, ymin, y)
return np.where(x > c - 0.5 + (w - 1) / 2, ymax, y)
print("window (C, W) contrast noise SD contrast/noise body pixels clipped")
for c, w in [(500, 3000), (40, 400), (0, 100)]:
g = window(hu, c, w)
con, sd = g[lesion].mean() - g[ring].mean(), g[ring].std()
clipped = np.mean((g[body] == 0) | (g[body] == 255))
print("(%4d, %4d) %10.2f %9.2f %15.2f %19.1f%%"
% (c, w, con, sd, con / sd, 100 * clipped))
HU: background 0.4, lesion 19.1, background SD 13.2
window (C, W) contrast noise SD contrast/noise body pixels clipped
( 500, 3000) 1.59 1.12 1.41 0.0%
( 40, 400) 11.93 8.45 1.41 4.4%
( 0, 100) 47.68 34.05 1.40 8.7%
The disc’s mean offset is recovered to within 2 HU, although the pixel noise is of the same order as the offset. The wide window shows the whole cylinder, bone included, but compresses the disc to under two grey levels. Narrower windows spread the 20 HU over more grey levels and the noise by the same factor, so the ratio stays at about 1.4: windowing makes the disc easier to see, not more detectable, at the price of clipping. It follows from the window limits that the middle window clips only values outside −160 to 240 HU, in this phantom the bone insert and the blurred rim of the cylinder, while the narrowest clips everything outside −50 to 50 HU, the fat insert included.
Comparing HU Across Scanners
Calibration guarantees water and air, within tolerance. The rest of the scale shifts with whatever changes the effective energy:
- Tube voltage and filtration, which change the spectrum and with it the values of materials whose attenuation varies with energy differently from water’s, as the example shows for bone (Kak & Slaney, 1988; Taubmann et al., 2018).
- The scanner’s design, including its detectors (Kak & Slaney, 1988, §4.1.2).
- The patient, since the spectrum hardens more over longer paths through the body (Taubmann et al., 2018, §8.5).
- Manufacturer differences in practice. Lamba et al. (2014) identified, by a database search, 48 adult patients who had unenhanced abdominal CT on scanners from two manufacturers (a GE Volume CT and a Siemens Definition AS Plus) within 12 months, and measured HU at nine identical soft-tissue locations on each pair. According to their abstract, agreement between the scanners was low, with an intraclass correlation coefficient as low as 0.198 for subcutaneous fat in the left posterolateral flank, mean values on the Siemens scanner were lower at all sites but one, and all differences were statistically significant.
Medical Computer Vision and Computer Vision in Radiology note the same limitation. For vision methods, intensity steps in HU transfer between CT scans better than between photographs or MRI scans, which have no absolute scale, but a threshold or normalization tuned on one scanner’s data is not exact on another’s. DICOM records the tube voltage (KVP) and a reconstruction kernel label in the CT Image Module (NEMA, 2026, C.8.2.1), so a dataset’s mix can be checked.
Common Misconceptions
- “HU measure density.” Denser materials generally have higher values, but attenuation also depends on atomic composition through the photoelectric effect; Hounsfield (1979) described CT as detecting mainly density with atomic number as a minor second variable, and dual-energy methods separate the two contributions (Kak & Slaney, 1988).
- “Stored DICOM pixel values are HU.” They become HU only after the linear rescale with the Rescale Slope and Intercept in the header (NEMA, 2026, C.8.2.1).
- “A narrow window improves the image.” It changes only the display, as the second example shows.
Where It Is Used
- Thresholding and segmentation. Because air, fat, soft tissue and bone occupy distinct ranges of the scale, thresholding in HU is a natural first step for separating the body from air or bone from soft tissue, and the calibrated values help medical image segmentation in CT. It follows from the limits above that thresholds placed close to a tissue’s range are the least portable between scanners.
- Intensity normalization for networks. CT pipelines can clip HU to a range and rescale it, which is windowing used as preprocessing. nnU-Net clips CT intensities to percentiles of the training set’s foreground and standardizes them with one global mean and standard deviation, relying on HU being quantitative.
- Display. A window is how HU reach a screen. DICOM expects software that renders images to apply a window stored in the image unless the user, a presentation state or a hanging protocol overrides it (NEMA, 2026, C.11.2.1.2.2).
Related
- Computer Vision in Radiology
How computer vision is used on radiological images such as chest X-rays, mammograms, CT, MRI and ultrasound, for computer-aided detection and diagnosis, triage of reading worklists, quantification and report generation, and how such systems are evaluated, why they fail through shortcut learning and dataset shift, and how regulators classify them.
- nnU-Net
A self-configuring framework for biomedical image segmentation that keeps a plain U-Net and sets everything around it, from target spacing, normalization, patch and batch size and network depth to the choice of 2D, 3D and cascaded configurations, from a fingerprint of the training data by fixed parameters, rules and cross-validation.
- Medical Image Segmentation
Delineating organs, tumors, lesions and other structures voxel by voxel in CT, MRI and other medical images; the 2D, 2.5D and 3D approaches, losses for very small targets, voxel spacing and anisotropy, metrics such as Dice and surface distances with their pitfalls, and benchmarks such as the Medical Segmentation Decathlon.
- Thresholding
Segmenting an image by comparing each pixel's intensity with a threshold, chosen by hand, from the histogram as in Otsu's method, or from each pixel's neighborhood as in Sauvola's method.
- Image Noise
The random variation in recorded pixel values that does not come from the scene, its physical sources in the camera, and how it is modeled and measured.
- Magnetic Resonance Imaging (MRI)
A medical imaging method that uses a strong magnet, magnetic field gradients and radio waves to sample the spatial Fourier transform (k-space) of the body's hydrogen magnetization, producing cross-sectional images whose contrast is set by tissue relaxation times and the scanner's sequence parameters.
References
- Kak, A. C. & Slaney, M. (1988). Principles of Computerized Tomographic Imaging. IEEE Press. Republished by the Society for Industrial and Applied Mathematics (SIAM), 2001.
- Hounsfield, G. N. (1979). Computed Medical Imaging. Nobel Lecture, 8 December 1979.
- Taubmann, O., Berger, M., Bögel, M., Xia, Y., Balda, M. & Maier, A. (2018). Computed Tomography. In A. Maier, S. Steidl, V. Christlein & J. Hornegger (Eds.), Medical Imaging Systems: An Introductory Guide, Lecture Notes in Computer Science, 147–189. Springer (open access, CC BY 4.0).
- American Association of Physicists in Medicine (2019). Performance Evaluation of Computed Tomography Systems. AAPM Report No. 233, Report of AAPM Task Group 233.
- Lamba, R., McGahan, J. P., Corwin, M. T., Li, C.-S., Tran, T., Seibert, J. A. & Boone, J. M. (2014). CT Hounsfield Numbers of Soft Tissues on Unenhanced Abdominal CT Scans: Variability Between Two Different Manufacturers' MDCT Scanners. American Journal of Roentgenology, 203(5), 1013–1020.
- National Electrical Manufacturers Association (2026). DICOM PS3.3 2026d: Information Object Definitions. Section C.8.2.1 (CT Image Module) and Section C.11.2 (VOI LUT Module).
- Hubbell, J. H. & Seltzer, S. M. (2004). Tables of X-Ray Mass Attenuation Coefficients and Mass Energy-Absorption Coefficients from 1 keV to 20 MeV for Elements Z = 1 to 92 and 48 Additional Substances of Dosimetric Interest. NIST Standard Reference Database 126, NISTIR 5632 (data last updated July 2004). National Institute of Standards and Technology.