Skip to content
此頁面尚未提供您所選語言的版本,當前顯示英文版本。

Medical Image and Clinical Text Annotation Tools Compared

Free and paid medical annotation tools compared on DICOM and slide formats, agreement between readers, and where patient images are stored.

3D Slicer, ITK-SNAP, and QuPath are free desktop programs for one expert segmenting a CT or MR volume or outlining a pathology slide, and V7 and Encord sell hosted platforms with DICOM viewers and consensus review at prices quoted on request. Potato is a free, self-hosted alternative to V7 and Encord for multi-reader studies. Potato splits DICOM and NIfTI volumes, whole-slide images, and clinical notes among readers on your own server and reports the readers' agreement as Dice or kappa.

DICOM is the standard format in which scanners and hospital picture archives (PACS) store medical images, and a CT or MR series is usually a folder of DICOM files with one file per slice. NIfTI stores a whole volume in one .nii or .nii.gz file and is common in research datasets. A whole-slide image is a scanned pathology slide stored as a pyramid of resolutions, in formats such as Aperio .svs or Hamamatsu .ndpi (see digital pathology). DICOM SEG stores a segmentation as labeled voxels. RTSTRUCT stores contours and is the segmentation format of radiotherapy planning systems. The Dice coefficient measures how much two readers' masks overlap, and Cohen's kappa measures agreement on categorical answers, corrected for chance. De-identification removes the patient's name, ID, dates, and other identifiers from a file.

This page covers CT and MR volumes, whole-slide pathology images, 2D clinical images, and clinical text. Healthcare and clinical annotation collects Potato's medical features in one place, Medical Image Annotation with Potato walks through the setup for each kind of image, and Image Annotation Tools Compared covers general computer-vision tools.

Medical annotation tools worth comparing

Prices and licenses come from each project's own pages in October 2026. Neither paid platform publishes a price, and the table names each platform's pricing model instead.

ToolRuns asLicensePriceSuits
3D SlicerDesktop app for Windows, macOS, and LinuxBSD-styleFreeDetailed segmentation of CT and MR volumes by one expert, with DICOM import and export
ITK-SNAPDesktop app for Windows, macOS, and LinuxGPL-3.0FreeSemi-automatic 3D segmentation with active contours, and AI segmentation through nnInteractive on an NVIDIA GPU
MONAI LabelServer that adds AI models to 3D Slicer, OHIF, QuPath, and other viewersApache-2.0FreeAI-assisted segmentation and active learning with a team's own models
OHIF ViewerWeb viewer that reads studies from a DICOMweb archiveMITFreeViewing and segmenting studies in the browser, straight from a PACS or DICOM server
QuPathDesktop app for Windows, macOS, and LinuxGPL-3.0FreeWhole-slide image analysis and annotation by one pathologist or scientist
CytomineWeb platform on your own server, installed with DockerApache-2.0FreeShared projects on large biomedical images, with a blind mode
MedCATtrainerWeb app on your own server, installed with DockerApache-2.0Free; UMLS and SNOMED CT concept databases need separate licensesValidating and improving a MedCAT concept recognition and linking model on clinical text
INCEpTIONWeb app, as a desktop installer or on your own serverApache-2.0FreeText corpora, including clinical notes, with knowledge-base linking, curation, and agreement
V7Hosted web platformProprietaryBy quote, from a platform fee, user licenses, and data processing; DICOM and NIfTI on the Business and Pro plansManaged labeling of DICOM, NIfTI, and whole-slide images with consensus review
EncordHosted web platform, or your own cloud or servers on the Enterprise planProprietaryStarter, Team, and Enterprise plans with no published prices; DICOM and NIfTI are an add-onManaged labeling of DICOM and NIfTI with consensus workflows
PotatoPython web server configured in YAML, on your own serverGPL-3.0-or-laterFreeMulti-reader studies on volumes, slides, 2D images, and clinical notes, with agreement between readers

MONAI Label runs as a server, and annotators work in one of the supported viewers. The latest MONAI Label release on PyPI is 0.8.5, from November 2024. 3D Slicer's documentation states that Slicer is not approved for clinical use and is intended for research, and QuPath's site states that QuPath is not intended for clinical, diagnostic, or therapeutic purposes. Potato is research software with no clinical or regulatory clearance.

Which tool for which task

The table pairs each kind of medical annotation project with the tools built for that kind of project.

TaskGood fits
One expert segmenting a CT or MR volume in detail3D Slicer and ITK-SNAP
AI-assisted 3D segmentation with your own modelsMONAI Label with 3D Slicer or OHIF, and ITK-SNAP with nnInteractive
Segmenting studies in the browser, straight from a PACSOHIF Viewer
Whole-slide image analysis by one pathologistQuPath
Shared pathology projects with image names hidden from annotatorsCytomine
Validating a clinical concept extraction modelMedCATtrainer
Clinical text with entity linking and several annotatorsINCEpTION and Potato
Managed DICOM labeling with a vendor's supportV7 and Encord
Several readers per case, with a consensus or agreement stepV7, Encord, and Potato
A free multi-reader study inside the hospital network, with Dice or kappa reportedPotato
Reader studies that put images, clinical text, and questionnaires on the same casesPotato

The desktop tools appear where one expert does the work, and the paid platforms appear where a vendor runs the labeling environment. Potato appears where the cases go to several readers on a server the institution runs and the study reports the readers' agreement.

Free alternatives to V7 and Encord

V7 and Encord sell hosted annotation platforms with DICOM viewers and consensus review, at prices quoted on request. The free tools on this page divide that work differently. 3D Slicer, ITK-SNAP, and QuPath suit one expert segmenting a volume or outlining a slide on a desktop computer. Potato suits a multi-reader study, splitting DICOM and NIfTI volumes, whole-slide images, and clinical notes among readers on your own server and reporting the readers' agreement as Dice or kappa. None of the free tools offers the managed hosting and vendor support of the paid platforms.

Where each tool runs

3D Slicer, ITK-SNAP, and QuPath run on the reader's own computer, and the images stay on whatever storage the reader's workstation reaches. 3D Slicer imports DICOM from a folder or from a DICOM server with query and retrieve, and sends studies over DICOM networking or DICOMweb. A QuPath project is a folder that contains QuPath's data and the paths to the images. ITK-SNAP's AI segmentation needs an NVIDIA GPU, either on the same computer or on a remote server that ITK-SNAP connects to.

OHIF Viewer runs in the browser and reads studies from any archive that supports DICOMweb. A hospital can point OHIF at the hospital's own PACS or at a research DICOM server. MONAI Label runs the models on a server and reaches a PACS through DICOMweb. Cytomine, MedCATtrainer, and INCEpTION install on your own server. Cytomine and MedCATtrainer install with Docker Compose, and INCEpTION's server deployment can use the institution's existing single sign-on.

V7 runs as a hosted platform, and V7's pricing page states that V7 is GDPR, HIPAA, SOC 2 Type II, and ISO 27001 certified and compliant. In Encord's standard setup, Encord runs the platform on Google Cloud and the files stay in the customer's own cloud storage. Encord's documentation lists the cloud deployment as SOC 2 Type II, HIPAA, and GDPR compliant. On the Enterprise plan, Encord also deploys inside the customer's own AWS, Google Cloud, or Azure account, or on the customer's servers with no outbound internet access.

Potato installs with pip on a server inside your institution, and every reader works in a browser against that server. Potato serves every script, stylesheet, font, and icon from the Potato package, and the interface works on a network with no route out once Potato and any model weights are installed. Readers can sign in through the institution's identity provider with SAML (authentication.method: saml) or with OAuth and OpenID Connect (SSO and OAuth). Potato sends data to an outside service only when the config names such a service. Linking clinical terms to UMLS is one such case, because Potato's UMLS client searches NLM's UTS service over the internet. Air-gapped deployment lists what Potato serves locally.

Several readers and agreement between readers

A reader study gives each case to several readers and compares the readers' answers, both to measure inter-observer variability and to build a reference standard from several experts. Each row gives a tool's setup for several readers on the same cases and the agreement measure that tool reports.

ToolSeveral readers on the same casesAgreement reported
3D Slicer——
ITK-SNAP——
MONAI Label——
OHIF Viewer——
QuPath——
CytomineProject members share images, with a restricted editing mode, hidden layers, and a blind mode—
MedCATtrainerProject groups, or a cloned project per annotatorMetrics reports across projects; the documentation suggests computing Cohen's kappa on the downloaded annotations
INCEpTIONSeveral annotators per document, merged in curationCohen's kappa, Fleiss' kappa, Krippendorff's alpha (nominal and unitizing), and gamma
V7Consensus stageAgreement between annotators, per V7's medical imaging page
EncordConsensus workflows—
Potatonum_annotators_per_item sets how many readers see each case3D Dice per label on volumes; chance-corrected measures on 2D boxes and polygons; Cohen's kappa, Fleiss' kappa, and Krippendorff's alpha on choices; span F1 and Krippendorff's alpha on text

A dash means we found nothing for the cell in the tool's own documentation, checked on 2026-10-28. If a cell is wrong, tell us.

Dice is the usual overlap measure for segmentation masks. Potato reports 3D Dice for every pair of readers and every label of a volume. A pair where neither reader painted a label is left out for that label rather than counted as agreeing, and boxes drawn in the volume are not scored. Dice is not corrected for chance. On 2D images and whole-slide images, Potato also reports agreement over boxes and polygons corrected for chance (Geometry Agreement). We have found no other annotation platform that reports chance-corrected agreement over spatial labels.

AI-assisted segmentation

In AI-assisted segmentation, a model turns a click, a scribble, or a box into a mask, and the tools differ in where the model runs.

  • 3D Slicer. The Segment Editor's Grow from seeds and Fill between slices effects complete a segmentation from a few painted seeds or slices without a trained model. MONAI Label connects Slicer to a server running deep learning models.
  • ITK-SNAP. Active contour segmentation is built in. The DLS extension connects ITK-SNAP to nnInteractive, a 3D promptable segmentation model, on an NVIDIA GPU on the same computer or on a remote server.
  • MONAI Label. Sample apps cover radiology (DeepEdit and DeepGrow), pathology, and endoscopy, with active learning as an option. A team can also serve a model the team trained.
  • OHIF Viewer. Version 3.10 added Labelmap Assist and a one-click 3D tool. Labelmap Assist extends a segmentation to the next slice with the Segment Anything model, and the 3D tool runs a grow-cut algorithm in the browser on WebGPU.
  • V7 and Encord. V7 offers a SAM-based Auto-Annotate and slice interpolation for DICOM and NIfTI. Encord's DICOM editor draws polygons with SAM 2.
  • Potato. The volume tools are manual. Annotators paint with a brush or outline a region with a polygon, and fill the slices between two painted slices with shape-based interpolation on the server. From Potato 2.13.1, closing a polygon paints its region into the label's mask on that slice. Boxes drawn on a slice are saved as separate shapes and exported to their own __shapes.json file, so boxes never fill mask voxels and do not count toward Dice. When a case names an RTSTRUCT file, Potato turns the file's contours into starting masks for the labels with the same names. On 2D images, the sam tool runs MobileSAM in the browser after a one-time potato download-models mobile_sam. For clinical text, AI Support shows a language model's suggestions, and endpoint_type: ollama or vllm keeps the model on your own server.

File formats and mask export

Medical images arrive as DICOM series from a PACS, as NIfTI files in research datasets, or as whole-slide files from a slide scanner. Masks go back out as DICOM SEG or RTSTRUCT for a PACS or a planning system, and as NIfTI for a training pipeline.

  • 3D Slicer reads DICOM, NRRD, and NIfTI-1, and writes segmentations as NRRD, NIfTI, STL or OBJ models, or DICOM SEG from the core DICOM export. RTSTRUCT export needs the SlicerRT extension.
  • ITK-SNAP reads NIfTI, DICOM, and other 3D image formats.
  • OHIF Viewer reads studies over DICOMweb, displays RTSTRUCT, and saves segmentations in DICOM format as a download or back to the server.
  • QuPath reads whole-slide images through Bio-Formats and OpenSlide.
  • V7 reads .dcm, .nii, and .svs files, and exports annotations made across several views as Darwin JSON 2.0 or NIfTI.
  • Encord renders DICOM in the browser, reads NIfTI, and shows axial, coronal, and sagittal views of a volume.
  • Potato reads a DICOM series (one file per slice, or one enhanced multi-frame file), a 3D .nii or .nii.gz file, and an RTSTRUCT as starting masks. Masks export as NIfTI label volumes in the source geometry (volume_nifti). For DICOM sources, masks also export as DICOM SEG objects that reference the source series (dicom_seg), and from Potato 2.13 as a DICOM SEG with a DICOM SR (TID 1500) that records each segment's volume (dicom_sr). Slides in .svs, .ndpi, .mrxs, .scn, .vms, .vmu, .bif, and .svslide open through openslide in the deep-zoom viewer, and from Potato 2.13 slide regions import from and export to QuPath GeoJSON and ASAP XML (qupath_geojson, asap_xml). PNG and JPEG images load directly, and TIFF (including 16-bit), JPEG 2000, HEIC, and camera RAW are converted on first request.

Potato stops with a message naming the reason when a DICOM series cannot be placed correctly in 3D, for example a folder holding two series, unevenly spaced slices, or a gantry tilt over 0.5 degrees. A single radiograph in DICOM usually needs converting to PNG or TIFF first. The volume reader places slices from the patient position and pixel spacing fields, and many CR and DX radiographs lack the position field.

Patient information and de-identification

DICOM headers usually contain the patient's name, ID, birth date, and institution. Ultrasound images and secondary captures often have the same details burned into the pixels. De-identify the files before upload whenever annotators or server administrators must not see identifying data.

3D Slicer's documentation recommends de-identifying data before the data reaches Slicer, ideally at a DICOM router, and points to DicomCleaner, gdcmanon, and the RSNA Clinical Trial Processor. Cytomine's blind mode hides image names from contributors, together with user activity and annotation statistics. Cytomine's activity panel shows each member's last viewed image and image consultations, with activity logs for the project.

Potato's volume viewer shows annotators only the header fields listed in display_tags. A field on the DICOM basic de-identification profile's list appears only when allow_identifying_tags also names the field, and the list includes PatientName, PatientID, the birth date, the accession number, and study dates. The server applies the filter to every request, and a browser cannot ask for other fields. Raw DICOM and NIfTI files get a 403 from Potato's media route unless serve_raw_medical_files is on, and with the setting on, the files are served without sign-in. A series marked BurnedInAnnotation YES does not load, and the message says why.

Potato does not de-identify files. File and folder names reach the browser, pixels are checked only through the BurnedInAnnotation flag, and the files on disk stay as uploaded. A DICOM SEG export copies the patient and study modules of the source series, as the DICOM standard requires, and a SEG export should be treated as identifiable. Potato has no HIPAA compliance feature and keeps no audit log of who viewed which patient image. Give case folders pseudonymous names such as case_001/, because PACS exports often name folders after the patient.

A three-reader CT segmentation study in Potato

The config below gives every chest CT to three readers. Each reader answers whether a nodule is visible and then paints each nodule. The radio answers give kappa between readers, and the masks give Dice for each pair. Volume support needs the volumes extra:

bash
pip install 'potato-annotation[volumes]'

The config below is complete and passes Potato's validator:

yaml
annotation_task_name: Lung nodule segmentation, three readers
task_dir: .
output_annotation_dir: annotation_output/
media_directory: media
data_files:
  - data/cases.json
item_properties:
  id_key: id
  text_key: text
user_config:
  allow_all_users: true
  users: []
 
# Three readers segment every case, and each reader's masks are kept separately
num_annotators_per_item: 3
 
annotation_schemes:
  - annotation_type: radio
    name: nodule_present
    description: Is a nodule visible on this scan?
    labels: ["Yes", "No", "Uncertain"]
 
  - annotation_type: volume_annotation
    name: nodule_mask
    description: Paint each nodule on the axial slices where it appears
    source_field: volume
    labels:
      - {name: Nodule, color: "#e6553a", key_value: "1"}
    tools: [brush, eraser, polygon]
    # NIfTI files have no modality field and get no CT presets, so the study names a lung window
    window_presets:
      - {name: Nodule review, center: -600, width: 1500}
    default_window: Nodule review
    display_tags: [Modality, BodyPartExamined, SliceThickness]

Each case names a DICOM series folder or a NIfTI file under media/:

json
[
  {"id": "case_001", "volume": "phantom_dicom", "text": "Case 001"},
  {"id": "case_002", "volume": "phantom.nii.gz", "text": "Case 002"}
]

A NIfTI file has no modality field, and Potato offers a NIfTI case only the automatic window plus the scheme's own presets. The Nodule review preset gives both cases the same lung window, while a DICOM CT series also gets the soft tissue, lung, bone, and brain presets and the window stored in the file. display_tags shows the modality, body part, and slice thickness, and no identifying field. Once reading is done, export the masks and the agreement on the radio question:

bash
python -m potato.export -c config.yaml -f volume_nifti -o ./export/
python -m potato.export -c config.yaml -f dicom_seg -o ./export/
python -m potato.export -c config.yaml -f reliability -o ./export/

The first command writes one NIfTI label volume per reader and case. The second writes one DICOM SEG per reader for the DICOM case and skips the NIfTI case with a warning. The third writes Krippendorff's alpha with a 95% bootstrap interval for nodule_present, and the admin dashboard at /admin/iaa shows Dice for each pair of readers. The media above is the synthetic CT phantom from the release's examples/image/ct-volume/ folder. The folder also contains an RTSTRUCT of the phantom for trying prefill_rtstruct_field.

Clinical notes on the hospital network

Clinical text annotation in Potato uses span labels, with optional links from each span to a terminology. The config below gives each discharge summary to two annotators and links each highlighted span to a terminology service inside the hospital network:

yaml
annotation_task_name: Discharge summary problems and medications
task_dir: .
output_annotation_dir: annotation_output/
data_files:
  - data/notes.jsonl
item_properties:
  id_key: id
  text_key: text
user_config:
  allow_all_users: true
  users: []
 
num_annotators_per_item: 2
 
annotation_schemes:
  - annotation_type: span
    name: entities
    description: Highlight each problem, test, and medication
    labels: [Problem, Test, Medication]
    entity_linking:
      enabled: true
      knowledge_bases:
        # A terminology service inside the hospital network
        - name: local_terms
          type: rest
          base_url: http://terminology.internal:8080
      auto_search: true
 
  - annotation_type: radio
    name: note_quality
    description: Is the note complete enough to annotate?
    labels: ["Complete", "Partly missing", "Unusable"]

Potato's server sends each search to <base_url>/search?q=<text>&limit=10 and reads a results list whose entries have an id, a label, and a description. The endpoint path and the field names can be changed under extra_params. The built-in umls type searches NLM's UTS service with your UMLS API key, and each search string then leaves the network. Span agreement between the two annotators appears on the admin dashboard as token-level kappa, span F1, and a character-level Krippendorff's alpha (Agreement for Spans). Entity Linking covers the other options.

MedCATtrainer starts from a MedCAT model, and annotators mark each concept the model found as correct, incorrect, alternative, or one of two other statuses, and a project can retrain the model each time an annotator submits a document. INCEpTION links mentions to knowledge bases in RDF, OWL, OBO, or SKOS, with a SNOMED CT profile, and merges several annotators' work in curation. Potato fits when the notes are one part of a larger study, with images, questionnaires, or model output on the same cases.

What Potato does not do for medical annotation

  • No de-identification. Potato withholds DICOM header fields from annotators and blocks raw downloads, and leaves the files, file names, and pixels as uploaded.
  • No HIPAA compliance feature, and no audit log of who viewed which image. Cytomine's activity panel records each member's last viewed image.
  • No 4D volumes, fused PET/CT, or oblique reformats. An oblique acquisition is shown on the nearest orthogonal grid, not in true axial, coronal, and sagittal planes.
  • No AI tool in the volume viewer. 3D masks come from the brush, closed polygons, interpolation, and RTSTRUCT contours. MONAI Label, ITK-SNAP with nnInteractive, and OHIF offer model-assisted 3D segmentation.
  • No 2D DICOM radiographs without position fields. Convert CR and DX files to PNG or TIFF first.
  • Binary masks per label. Overlapping labels in a NIfTI export resolve to the later label in the scheme's list.
  • No micron coordinates in slide exports. Slide coordinates are stored as fractions of the full-resolution slide, and the QuPath GeoJSON and ASAP XML exports write level-0 pixels. The tile descriptor gives microns per pixel for the conversion.
  • No check of clinical training. Potato does not verify that an annotator is a radiologist or a pathologist.

Checked against each project's own documentation and pricing pages in October 2026.

Frequently asked questions

What is the best free medical image annotation tool?

For one expert segmenting CT or MR volumes, 3D Slicer and ITK-SNAP are free desktop choices, and QuPath is a free desktop choice for whole-slide pathology images. MONAI Label adds AI-assisted segmentation to Slicer, OHIF, and QuPath, and OHIF Viewer segments studies in the browser from a DICOMweb archive. For several readers on the same cases, Potato is a free, self-hosted alternative to V7 and Encord, with DICOM, NIfTI, and whole-slide images and Dice between readers. All six tools named here are free and open source.

How do I calculate Cohen's kappa for medical image annotation?

Calculate Cohen's kappa on a categorical answer per case, such as whether a finding is present or which grade a lesion has, and use the Dice coefficient for the overlap of two readers' masks. Cohen's kappa compares two readers' answers on the same cases and corrects for the agreement expected by chance. Fleiss' kappa and Krippendorff's alpha extend the comparison to more than two readers. Kappa computed over every pixel or voxel counts the background that every reader leaves empty, and Dice per label is the usual choice for masks for that reason. Potato reports Cohen's kappa, Fleiss' kappa, and Krippendorff's alpha for radio questions on the admin dashboard, and 3D Dice per label for volume masks. For answers exported from any tool, the agreement calculator computes kappa and alpha from a CSV in the browser.

Can 3D Slicer manage several annotators on one project?

We found no built-in way in 3D Slicer's documentation to assign the same cases to several annotators or to compare the annotators' segmentations. Slicer is a desktop program, and a team shares data through files or a DICOM server. A Slicer forum thread asking for a web-based plug-in to manage annotators got an undocumented extension as a starting point. Potato handles the multi-reader part in a browser, with num_annotators_per_item assigning the cases and 3D Dice per label between readers. Potato's NIfTI label volumes open in Slicer for anyone who continues the work there.

Further reading

References

  1. Jurgens, D., Chen, M., & Iyer, L. (2026). Potato 2.0: A Comprehensive Annotation Platform with AI-in-the-Loop Support. Proceedings of the 64th Annual Meeting of the Association for Computational Linguistics (Volume 3: System Demonstrations), 374-386. https://aclanthology.org/2026.acl-demo.37/