Mri wrist joint anatomy images from textbook








| Structure | Best MRI Plane | Sequence |
|---|---|---|
| TFCC / TFC proper | Coronal | PD or T2 fat-sat |
| Carpal ligaments (SLL, LTL) | Coronal | PD fat-sat |
| Extensor compartments | Axial | T1 or PD |
| Carpal tunnel (median nerve) | Axial | T1 or PD |
| Guyon's canal (ulnar nerve/artery) | Axial + Coronal | T1 |
| Radioulnar ligaments (DRUL/VRUL) | Axial | PD fat-sat |
| Carpal bones (osseous anatomy) | Coronal | T1 |
Source: Imaging Anatomy Text and Atlas, Vol. 3 - Bones, Joints, Vessels and Nerves, Chapter 17: Wrist (pp. 589-615)
Send pdf of this images
ls /home/daytona/workspace/ 2>/dev/null && mkdir -p /home/daytona/workspace/wrist-mri-pdf
~/wrist-mri-pdf/generate_pdf.py
import requests
import os
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm, mm
from reportlab.platypus import SimpleDocTemplate, Image, Paragraph, Spacer, PageBreak, Table, TableStyle
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import HRFlowable
from io import BytesIO
from PIL import Image as PILImage
OUTPUT_DIR = "/home/daytona/workspace/wrist-mri-pdf"
PDF_PATH = os.path.join(OUTPUT_DIR, "MRI_Wrist_Joint_Anatomy.pdf")
# Image data: (url, figure_label, caption)
images_data = [
(
"https://cdn.orris.care/cdss_images/6a86bc75f1de7ee4d138bd37c4cf7be5170f5ca41118bb340b41b07050470e4d.png",
"Fig. 17.35 — Triangular Fibrocartilage Complex (TFCC): Coronal & Axial MRI",
"Serial coronal images (a–e) from dorsal to palmar, and axial MRI views (f, g) through the TFCC. "
"The TFC proper (star) attaches on the radial side at the sigmoid notch and on the ulnar side to the fovea and ulnar styloid "
"via the proximal (arrowhead) and distal (thick arrow) laminae. Structures labeled: Lunate, Triquetrum, Ulnotriquetral ligament, "
"ECU tendon, Fovea, Ulnar styloid (S), dorsal radioulnar ligament (dRUL), volar radioulnar ligament (vRUL), "
"ligamentum subcruentum (LS), meniscus homologue (MH), ulnar collateral ligament (UCL)."
),
(
"https://cdn.orris.care/cdss_images/728fdddb16dba69fd80ff6107ee9866bff0251439ff1095c3e7f9d2b54175535.png",
"Fig. 17.35 (a, b) — TFCC Coronal MRI Detail",
"(a) Coronal MRI showing the sigmoid notch, ECU tendon, ligamentum subcruentum (LS), ulnar styloid (S), "
"TFC proper (blue arrow), and proximal lamina (arrowhead). "
"(b) More ulnar coronal slice demonstrating the meniscus homologue (MH), ulnar collateral ligament (UCL), "
"and the foveal attachment of the proximal lamina."
),
(
"https://cdn.orris.care/cdss_images/74c5c3d44a775cd359b10c7da5df2cf5fd5beadc7195fa5a40d46a6e3c19a6b2.png",
"Fig. 17.34 — TFCC Coronal Section Anatomy Diagram",
"Labeled coronal section diagram through the distal radius and ulna showing the complete TFCC architecture: "
"articular disk, proximal (upper) lamina, distal (lower) lamina, meniscus homologue, joint cavity, hyaline cartilage, "
"ulnar collateral ligament, ECU tendon sheath, prestyloid recess, fibrovascular tissue, ulnar fovea, and ulnar head."
),
(
"https://cdn.orris.care/cdss_images/f9856df950e3c9b65b6cc9ad4faf256932834436ab0313a03865b764e707144f.png",
"Fig. 17.50 — Wrist Axial Cross-Section: All 6 Extensor Compartments & Neurovascular Structures",
"Labeled axial cross-section at the distal radius (R) and ulna (U) level. "
"Dorsal (extensor) compartments numbered 1–6: (1) EPB/APL, (2) ECRL/ECRB, (3) EPL, (4) Ext. digitorum/indicis, "
"(5) EDM, (6) ECU. Lister's tubercle separates compartments 2 and 3. "
"Volar structures: FPL, FCR, Median nerve, FCU, Radial artery, Ulnar artery & nerve. "
"Space of Parona (deep to FDP tendons) is also labeled."
),
(
"https://cdn.orris.care/cdss_images/fdfe1233d2c5c0164f0cf96768a1fb412cb5eaf23203321f0ec12d123710a30a.png",
"Fig. 17.64 — Wrist Coronal MRI Overview & Axial ECU Tendon Views",
"(a) Coronal proton density MRI showing all 8 carpal bones in their natural arrangement: "
"proximal row (scaphoid, lunate, triquetrum, pisiform) and distal row (trapezium, trapezoid, capitate, hamate). "
"The radiocarpal and midcarpal joint spaces are clearly defined. "
"(b, c) Axial PD and fat-saturated PD images at the level of the ECU tendon in its groove."
),
(
"https://cdn.orris.care/cdss_images/de79b00a0f68ae1cfe8bc0ceb38f60ecdd13279b5aa1d4bf8ffdaffea91562ea.png",
"Fig. 17.63 — Axial MRI: First Extensor Compartment (de Quervain's Region)",
"Axial fat-saturated T1W (a) and fat-saturated proton density (b) MRI at the level of the first extensor compartment "
"(EPB — extensor pollicis brevis; APL — abductor pollicis longus). "
"These images demonstrate the normal cross-sectional appearance of wrist tendons and their sheaths, "
"with green arrows indicating the first compartment tendons and orange arrow indicating EPL sheath."
),
(
"https://cdn.orris.care/cdss_images/b68c6069612407d66eea841f6bacf764578226eb4e0249ec7624786ae094973f.png",
"Fig. 17.53 (a) — Guyon's Canal (Ulnar Tunnel): Serial Axial MRI",
"Serial axial MRI images from proximal to distal through Guyon's canal. "
"Red arrows: ulnar artery (thick = main trunk; short thin = superficial branch; long thin = deep branch). "
"Blue arrows: ulnar nerve (thick = main; short thin = superficial/sensory branch; long thin = deep/motor branch). "
"Key landmarks: P = pisiform, H = hook of hamate, Hiatus = pisohamate hiatus, "
"PCL = palmar carpal ligament, FCU, FDM, AbDM, PB (palmaris brevis), PHL (pisohamate ligament)."
),
(
"https://cdn.orris.care/cdss_images/63e3c56e7ad03e0abe54c88d451ac7db7e401c6b489742db9745464ca64e4aeb.png",
"Fig. 17.53 (b) — Guyon's Canal: Serial Coronal MRI",
"Serial coronal MRI views (palmar to dorsal) through Guyon's canal demonstrating "
"the course of the ulnar nerve (blue arrows — superficial and deep motor branches) "
"and ulnar artery (red arrows) through the tunnel. "
"Landmarks: P = pisiform, H = hook of hamate, Hiatus = pisohamate hiatus, "
"AbDM, FDM, PHL (pisohamate ligament)."
),
]
def download_image(url):
resp = requests.get(url, timeout=30)
resp.raise_for_status()
return BytesIO(resp.content)
def get_image_dimensions(img_bytes):
img_bytes.seek(0)
pil_img = PILImage.open(img_bytes)
w, h = pil_img.size
img_bytes.seek(0)
return w, h
def build_pdf():
doc = SimpleDocTemplate(
PDF_PATH,
pagesize=A4,
leftMargin=1.5*cm,
rightMargin=1.5*cm,
topMargin=1.5*cm,
bottomMargin=1.5*cm,
)
PAGE_W = A4[0] - 3*cm
PAGE_H = A4[1] - 3*cm
MAX_IMG_W = PAGE_W
MAX_IMG_H = PAGE_H * 0.68
styles = getSampleStyleSheet()
title_style = ParagraphStyle(
'TitleStyle',
parent=styles['Title'],
fontSize=20,
textColor=colors.HexColor('#1a3a5c'),
spaceAfter=4,
spaceBefore=0,
leading=24,
alignment=TA_CENTER,
)
subtitle_style = ParagraphStyle(
'SubtitleStyle',
parent=styles['Normal'],
fontSize=11,
textColor=colors.HexColor('#2e6da4'),
spaceAfter=2,
alignment=TA_CENTER,
leading=14,
)
source_style = ParagraphStyle(
'SourceStyle',
parent=styles['Normal'],
fontSize=9,
textColor=colors.HexColor('#555555'),
spaceAfter=0,
alignment=TA_CENTER,
leading=12,
)
fig_label_style = ParagraphStyle(
'FigLabel',
parent=styles['Normal'],
fontSize=10,
textColor=colors.HexColor('#1a3a5c'),
spaceAfter=3,
spaceBefore=8,
leading=13,
fontName='Helvetica-Bold',
alignment=TA_LEFT,
)
caption_style = ParagraphStyle(
'CaptionStyle',
parent=styles['Normal'],
fontSize=8.5,
textColor=colors.HexColor('#333333'),
spaceAfter=6,
spaceBefore=0,
leading=12,
alignment=TA_JUSTIFY,
)
toc_title_style = ParagraphStyle(
'TOCTitle',
parent=styles['Normal'],
fontSize=13,
textColor=colors.HexColor('#1a3a5c'),
spaceAfter=10,
spaceBefore=4,
fontName='Helvetica-Bold',
alignment=TA_CENTER,
)
toc_item_style = ParagraphStyle(
'TOCItem',
parent=styles['Normal'],
fontSize=9,
textColor=colors.HexColor('#222222'),
spaceAfter=5,
leading=13,
leftIndent=10,
)
table_header_style = ParagraphStyle(
'TableHeader',
parent=styles['Normal'],
fontSize=9,
textColor=colors.white,
fontName='Helvetica-Bold',
alignment=TA_CENTER,
)
table_cell_style = ParagraphStyle(
'TableCell',
parent=styles['Normal'],
fontSize=8.5,
textColor=colors.HexColor('#222222'),
alignment=TA_CENTER,
leading=11,
)
story = []
# ── COVER PAGE ──────────────────────────────────────────────────────────────
story.append(Spacer(1, 2*cm))
story.append(Paragraph("MRI Wrist Joint Anatomy", title_style))
story.append(Spacer(1, 0.3*cm))
story.append(HRFlowable(width="80%", thickness=2, color=colors.HexColor('#2e6da4'), spaceAfter=8, spaceBefore=4))
story.append(Paragraph("Textbook Image Atlas", subtitle_style))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
"Source: Imaging Anatomy Text and Atlas, Vol. 3<br/>"
"Bones, Joints, Vessels and Nerves — Chapter 17: Wrist (pp. 589–615)",
source_style
))
story.append(Spacer(1, 0.6*cm))
# Summary table
toc_items = [
["Fig.", "Topic", "Plane / Sequence"],
["17.35", "TFCC — Coronal & Axial MRI", "Coronal + Axial / PD"],
["17.35 a,b", "TFCC Coronal Detail", "Coronal / PD"],
["17.34", "TFCC Anatomy Diagram", "Coronal Section"],
["17.50", "All 6 Extensor Compartments\n& Neurovascular Structures", "Axial Cross-Section"],
["17.64", "Carpal Bones Overview\n& ECU Tendon", "Coronal + Axial / PD"],
["17.63", "First Extensor Compartment", "Axial / T1W + PDFS"],
["17.53 a", "Guyon's Canal (Ulnar Tunnel)\nSerial Axial MRI", "Axial / T1"],
["17.53 b", "Guyon's Canal\nSerial Coronal MRI", "Coronal / T1"],
]
col_widths = [2.2*cm, 9*cm, 5.5*cm]
table_data = []
for i, row in enumerate(toc_items):
if i == 0:
table_data.append([Paragraph(cell, table_header_style) for cell in row])
else:
table_data.append([Paragraph(cell, table_cell_style) for cell in row])
tbl = Table(table_data, colWidths=col_widths, repeatRows=1)
tbl.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,0), colors.HexColor('#1a3a5c')),
('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.HexColor('#eaf3fb'), colors.white]),
('GRID', (0,0), (-1,-1), 0.5, colors.HexColor('#b0c8e0')),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
('LEFTPADDING', (0,0), (-1,-1), 6),
('RIGHTPADDING', (0,0), (-1,-1), 6),
]))
story.append(Paragraph("Contents", toc_title_style))
story.append(tbl)
story.append(PageBreak())
# ── IMAGE PAGES ─────────────────────────────────────────────────────────────
for idx, (url, label, caption) in enumerate(images_data):
print(f"Downloading image {idx+1}/{len(images_data)}: {label[:60]}...")
try:
img_bytes = download_image(url)
orig_w, orig_h = get_image_dimensions(img_bytes)
# Scale to fit
scale = min(MAX_IMG_W / orig_w, MAX_IMG_H / orig_h)
disp_w = orig_w * scale
disp_h = orig_h * scale
img_bytes.seek(0)
rl_img = Image(img_bytes, width=disp_w, height=disp_h)
rl_img.hAlign = 'CENTER'
story.append(rl_img)
story.append(Paragraph(label, fig_label_style))
story.append(HRFlowable(width="100%", thickness=0.5, color=colors.HexColor('#b0c8e0'), spaceAfter=4, spaceBefore=0))
story.append(Paragraph(caption, caption_style))
except Exception as e:
story.append(Paragraph(f"[Image could not be loaded: {e}]", caption_style))
if idx < len(images_data) - 1:
story.append(PageBreak())
# ── ANATOMY SUMMARY TABLE PAGE ───────────────────────────────────────────────
story.append(PageBreak())
story.append(Spacer(1, 0.5*cm))
story.append(Paragraph("MRI Wrist Anatomy — Quick Reference", toc_title_style))
story.append(Spacer(1, 0.3*cm))
summary_data = [
["Structure", "Best MRI Plane", "Recommended Sequence"],
["TFCC / TFC proper", "Coronal", "PD or T2 fat-sat"],
["Carpal ligaments (SLL, LTL)", "Coronal", "PD fat-sat"],
["Extensor compartments (1–6)", "Axial", "T1 or PD"],
["Carpal tunnel (median nerve)", "Axial", "T1 or PD"],
["Guyon's canal (ulnar n./a.)", "Axial + Coronal", "T1"],
["Radioulnar ligaments (DRUL/VRUL)", "Axial", "PD fat-sat"],
["Carpal bones (osseous anatomy)", "Coronal", "T1"],
["Tendons & tendon sheaths", "Axial + Coronal", "PD / PDFS / T2FS"],
["Articular cartilage", "Coronal", "PD fat-sat"],
]
s_col_widths = [6.5*cm, 5*cm, 5.5*cm]
s_table_data = []
for i, row in enumerate(summary_data):
if i == 0:
s_table_data.append([Paragraph(cell, table_header_style) for cell in row])
else:
s_table_data.append([Paragraph(cell, table_cell_style) for cell in row])
s_tbl = Table(s_table_data, colWidths=s_col_widths, repeatRows=1)
s_tbl.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,0), colors.HexColor('#1a3a5c')),
('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.HexColor('#eaf3fb'), colors.white]),
('GRID', (0,0), (-1,-1), 0.5, colors.HexColor('#b0c8e0')),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('TOPPADDING', (0,0), (-1,-1), 6),
('BOTTOMPADDING', (0,0), (-1,-1), 6),
('LEFTPADDING', (0,0), (-1,-1), 8),
('RIGHTPADDING', (0,0), (-1,-1), 8),
]))
story.append(s_tbl)
story.append(Spacer(1, 0.8*cm))
story.append(HRFlowable(width="80%", thickness=1, color=colors.HexColor('#2e6da4'), spaceAfter=6))
story.append(Paragraph(
"Source: Imaging Anatomy Text and Atlas, Volume 3 — Bones, Joints, Vessels and Nerves<br/>"
"Chapter 17: Wrist | Authors: Jason D. Lather, Farhood Saremi, Dakshesh B. Patel | Pages 589–615",
source_style
))
doc.build(story)
print(f"\nPDF saved to: {PDF_PATH}")
build_pdf()
cd /home/daytona/workspace/wrist-mri-pdf && python generate_pdf.py
MRI Wrist Joint Anatomy
PDF Document · PDF