AI-Based Pipeline for the Segmentation of White Matter Hypoattenuations in CT Scans: A Design-Choice Validation Study
The 2 matches
- [1] § Methods and Materials › Image Preprocessing and Registration › Format Conversion and Quality Control ↔ src/nifti_selection.py, lines 81–157 · score 0.77 · gantry tilt, dcm2niix, NIfTI slices, equidistant, DICOM
- [2] § Methods and Materials › Image Preprocessing and Registration › Format Conversion and Quality Control ↔ src/datasets/structure.py, lines 18–157 · score 0.69 · dcm2niix, NIfTI, equidistant, tilt, resamples, matched
Paper
Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
Python · 381 lines · 16 KB · no license · 1 match
- """Pipeline step summaries"""
- import json
- from pathlib import Path
- import pandas as pd
- from src.create_region_of_interest import select_regions_of_interest
- from src.datasets.structure import DatasetStructure
- from src.determine_patient_orientation import get_patient_orientation, PatientOrientation
- from src.read_nifti_information import get_nifti_headers, NIFTI_SELECTION_FILES
- NON_INFORMATIVE_NIFTI_COLUMNS = [
- 'ConversionSoftware',
- 'ConversionSoftwareVersion',
- 'SeriesNumber',
- 'ImageComments'
- ]
- def clean_nifti_info(
- base_path: Path,
- column_missing_data_threshold: int = 5,
- ):
- """
- Clean the nifti info dataframe.
- Args:
- column_missing_data_threshold: Maximum percentage of missing data in a column before it is rejected.
- """
- nifti_info_file_path = base_path / NIFTI_SELECTION_FILES[0]
- cleaned_nifti_info_file_path = base_path / NIFTI_SELECTION_FILES[1]
- all_nifti_info = pd.read_pickle(nifti_info_file_path)
- # Convert vector to PatientOrientation
- all_nifti_info['ImageOrientationPatientDICOM'] = all_nifti_info['ImageOrientationPatientDICOM'].apply(
- get_patient_orientation)
- # Drop unnecessary columns
- attribute_frequencies = all_nifti_info.isnull().sum()
- five_percent_of_data = len(all_nifti_info) / 100 * column_missing_data_threshold
- # Keep columns that have less than 5% missing data
- usually_available_attributes = all_nifti_info[
- attribute_frequencies[attribute_frequencies <= five_percent_of_data].index]
- usually_available_attributes = usually_available_attributes.drop(NON_INFORMATIVE_NIFTI_COLUMNS, axis=1, errors='ignore')
- usually_available_attributes.to_pickle(cleaned_nifti_info_file_path)
- def add_statistics(
- summary: dict,
- step_df: pd.DataFrame,
- step_name: str,
- explanation: str
- ):
- summary['step_name'].append(step_name)
- summary['explanation'].append(explanation)
- summary['nifti_file_count'].append(len(step_df))
- summary['original_version_count'].append(
- len(step_df.groupby(['patient_id', 'study_subdir', 'series_subdir']).count()))
- summary['patient_count'].append(len(step_df.groupby(['patient_id']).count()))
- return summary
- def add_roi_statistics(summary_object, step_df, step_name, explanation):
- summary_object['step_name'].append(step_name)
- summary_object['explanation'].append(explanation)
- summary_object['roi_count'].append(len(step_df))
- summary_object['nifti_file_count'].append(len(step_df.groupby('registered_file_path').count()))
- summary_object['original_version_count'].append(
- len(step_df.groupby(['patient_id', 'study_subdir', 'series_subdir']).count()))
- summary_object['patient_count'].append(len(step_df.groupby(['patient_id']).count()))
- return summary_object
- def filter_nifti_files(
- base_path: Path,
- dataset_folder_structure: DatasetStructure,
- ):
- cleaned_nifti_info_file_path = base_path / NIFTI_SELECTION_FILES[1]
- filtered_nifti_info_file_path = base_path / NIFTI_SELECTION_FILES[2]
- summary_statistics = {
- 'step_name': [],
- 'nifti_file_count': [],
- 'original_version_count': [],
- 'patient_count': [],
- 'explanation': []
- }
- cleaned_nifti_info: pd.DataFrame = pd.read_pickle(cleaned_nifti_info_file_path)
- summary_statistics = add_statistics(
- summary_statistics,
- cleaned_nifti_info,
- 'Original nifti files produced by dcm2niix v1.0.20230411',
- 'For a subset of the data, dcm2niix creates multiple nifti files per DICOM. See https://github.com/rordenlab/dcm2niix/blob/master/FILENAMING.md'
- )
- # Filter for only axial orientations
- only_axial = cleaned_nifti_info.loc[cleaned_nifti_info['ImageOrientationPatientDICOM'] == PatientOrientation.AXIAL]
- summary_statistics = add_statistics(
- summary_statistics,
- only_axial,
- 'Only axial files',
- 'Remove files where the Image Orientation (Patient) is not axial.'
- )
- # Filter for non-localizers
- only_axial = _add_slice_count(
- only_axial,
- base_path,
- dataset_folder_structure
- )
- no_localizer_axial = only_axial.loc[
- (only_axial['ImageType'].apply(lambda x: 'LOCALIZER' not in x if x is not None else False))
- & (only_axial['nifti_slice_count'] > 2)
- ]
- summary_statistics = add_statistics(
- summary_statistics,
- no_localizer_axial,
- 'Without localizer files',
- '''Remove files where the Image Type contains "LOCALIZER" and volumes with less than three slices as
- indicated in the NIfTI file header.'''
- )
- # Filter for ROI nifti files
- no_roi_no_localizer_axial = no_localizer_axial.loc[no_localizer_axial['nifti_file'].apply(lambda x: 'ROI' not in x)]
- summary_statistics = add_statistics(
- summary_statistics,
- no_roi_no_localizer_axial,
- 'Without ROI files',
- 'DICOM files can contain binary overlays. dcm2niix creates additional ROI files for these overlays.'
- )
- # Choose a single nifti if there are multiple ones per directory
- unique_version_no_roi_no_localizer_axial = no_roi_no_localizer_axial \
- .groupby(['patient_id', 'study_subdir', 'series_subdir']) \
- .apply(dataset_folder_structure.choose_nifti_file, include_groups=False) \
- .reset_index()
- summary_statistics = add_statistics(
- summary_statistics,
- unique_version_no_roi_no_localizer_axial,
- 'Choose unique version from duplicates',
- '''dcm2niix creates additional files for gantry tilt correction (Tilt_1), resliced equidistance
- (Eq_1) or both (Tilt_Eq_1) in addition to non-corrected files. We choose the corrected files here.'''
- )
- summary_statistics_df = pd.DataFrame(summary_statistics)
- print(summary_statistics_df)
- summary_statistics_df.to_csv(cleaned_nifti_info_file_path.parent / '02_summary_statistics.csv')
- unique_version_no_roi_no_localizer_axial.to_pickle(filtered_nifti_info_file_path)
- def _add_slice_count(df, base_path: Path, dataset_folder_structure: DatasetStructure):
- slice_counts = []
- nifti_headers = get_nifti_headers(base_path)
- with_slice_count = df.copy()
- for index, row in with_slice_count.iterrows():
- file_path = dataset_folder_structure.create_path_from_csv_row(base_path / 'niftis', row, file_column_name='nifti_file')
- slice_count = nifti_headers[str(file_path)].get_data_shape()[2]
- slice_counts.append(slice_count)
- with_slice_count.loc[:, 'nifti_slice_count'] = slice_counts
- return with_slice_count
- def check_registration_files(base_path: Path, dataset_folder_structure: DatasetStructure):
- filtered_nifti_info_file_path = base_path / NIFTI_SELECTION_FILES[2]
- registered_nifti_info_file_path = base_path / NIFTI_SELECTION_FILES[3]
- filtered_nifti_info = pd.read_pickle(filtered_nifti_info_file_path)
- age_group_info = pd.read_csv(base_path / 'age_group.csv', dtype={'age_group': 'int32', 'patient_id': 'str'})
- nifti_files_with_age_groups = filtered_nifti_info.merge(
- age_group_info,
- on='patient_id',
- how='inner',
- )
- registered_files = []
- for index, row in nifti_files_with_age_groups.iterrows():
- if index % 100 == 0:
- print(f'Processing {index} / {nifti_files_with_age_groups.shape[0]}')
- registered_file = Path(
- str(
- dataset_folder_structure.create_path_from_csv_row(
- root_folder_path=base_path / 'registered_niftis',
- row=row,
- file_column_name='nifti_file'
- )
- )
- )
- if registered_file.is_file():
- registered_files.append(registered_file.name)
- else:
- registered_files.append(None)
- print(registered_files)
- nifti_files_with_age_groups['registered_file'] = registered_files
- success_registration_files = nifti_files_with_age_groups.loc[
- ~(nifti_files_with_age_groups['registered_file'].isnull())]
- success_registration_files.to_pickle(registered_nifti_info_file_path)
- write_registered_nifti_files_summary(registered_nifti_info_file_path)
- failed_registration_files = nifti_files_with_age_groups.loc[nifti_files_with_age_groups['registered_file'].isnull()]
- failed_registration_files.to_csv(
- registered_nifti_info_file_path.parent / '03_failed_registration_files.csv',
- index=False
- )
- def write_registered_nifti_files_summary(registered_nifti_info_file_path):
- registered_nifti_files_info = pd.read_pickle(registered_nifti_info_file_path)
- summary_statistics = {
- 'step_name': [],
- 'nifti_file_count': [],
- 'original_version_count': [],
- 'patient_count': [],
- 'explanation': []
- }
- add_statistics(
- summary_statistics,
- registered_nifti_files_info,
- 'Co-registration with FLIRT v. 6.0',
- '''Registration seems to fail especially for the Siemens (Manufacturer) SOMATOM PLUS 4
- (Manufacturers Model Name) with Software Version VC10C.'''
- )
- summary_statistics_df = pd.DataFrame(summary_statistics)
- print(summary_statistics_df)
- summary_statistics_df.to_csv(registered_nifti_info_file_path.parent / '03_summary_statistics.csv', index=False)
- def manual_low_similarity_check_results(
- base_path: Path,
- dataset_structure: DatasetStructure,
- ):
- registered_nifti_info = pd.read_pickle(base_path / NIFTI_SELECTION_FILES[3])
- registration_failures_path = base_path / dataset_structure.REGISTRATION_FAILURES_CSV
- if registration_failures_path.exists():
- manual_exclusions = pd.read_csv(registration_failures_path)
- else:
- manual_exclusions = pd.DataFrame(columns=['image_path'])
- registered_nifti_info = dataset_structure.add_relative_path_to_dataframe(
- df=registered_nifti_info,
- relative_path_column_name='registered_file_path',
- file_column_name='registered_file'
- )
- accurate_registrations = registered_nifti_info.loc[~registered_nifti_info['registered_file_path'].isin(manual_exclusions['image_path'])]
- inaccurate_registrations = registered_nifti_info.loc[registered_nifti_info['registered_file_path'].isin(manual_exclusions['image_path'])]
- accurate_registration_path = base_path / NIFTI_SELECTION_FILES[4]
- accurate_registrations.to_pickle(accurate_registration_path)
- # List of accurate registrations for superimpose QC.
- full_path = accurate_registrations['registered_file_path'].apply(lambda relative_path: str(base_path / 'registered_niftis' / relative_path))
- with open(accurate_registration_path.parent / '04_accurate_registration_files.json', 'w') as file:
- json.dump(full_path.to_list(), file, indent=4)
- inaccurate_registrations.to_csv(
- accurate_registration_path.parent / '04_inaccurate_registration_files.csv',
- index=False
- )
- write_ssim_qc_nifti_files_summary(accurate_registration_path)
- def write_ssim_qc_nifti_files_summary(accurate_registration_path):
- registered_nifti_files_info = pd.read_pickle(accurate_registration_path)
- summary_statistics = {
- 'step_name': [],
- 'nifti_file_count': [],
- 'original_version_count': [],
- 'patient_count': [],
- 'explanation': []
- }
- add_statistics(
- summary_statistics,
- registered_nifti_files_info,
- 'Manual check of low SSIM score registration files.',
- '''The co-registration can produce inaccurate co-registrations even if the FLIRT call was successful.
- This step identifies five groups per age group: complete, skull_base, skull_vault, middle, and incomplete to
- group similar scans together (done by a calculation of the information available across the x-axis for the
- co-registered scans). Afterwards the SSIM score to measure similarity between CT scan and MRI template is
- calculated and low similarity score registrations were examined manually.'''
- )
- summary_statistics_df = pd.DataFrame(summary_statistics)
- print(summary_statistics_df)
- summary_statistics_df.to_csv(accurate_registration_path.parent / '04_summary_statistics.csv', index=False)
- def manual_superimpose_check_results(
- base_path: Path,
- ):
- registered_nifti_info = pd.read_pickle(base_path / NIFTI_SELECTION_FILES[4])
- blacklist_path = base_path / 'quality_control/superimpose_information/blacklist.json'
- if blacklist_path.exists():
- with open(blacklist_path, 'r') as file:
- blacklist_information = json.load(file)
- manual_exclusions = [entry['file'] for entry in blacklist_information]
- else:
- manual_exclusions = []
- accurate_registrations = registered_nifti_info.loc[~registered_nifti_info['registered_file_path'].isin(manual_exclusions)]
- inaccurate_registrations = registered_nifti_info.loc[registered_nifti_info['registered_file_path'].isin(manual_exclusions)]
- accurate_registrations_path = base_path / NIFTI_SELECTION_FILES[5]
- accurate_registrations.to_pickle(accurate_registrations_path)
- inaccurate_registrations.to_csv(
- accurate_registrations_path.parent / '05_inaccurate_registration_files.csv',
- index=False
- )
- write_superimpose_qc_nifti_files_summary(base_path)
- def write_superimpose_qc_nifti_files_summary(base_path: Path):
- registered_nifti_files_info = pd.read_pickle(base_path / NIFTI_SELECTION_FILES[5])
- summary_statistics = {
- 'step_name': [],
- 'nifti_file_count': [],
- 'original_version_count': [],
- 'patient_count': [],
- 'explanation': []
- }
- add_statistics(
- summary_statistics,
- registered_nifti_files_info,
- 'Manual check superimposed dataset of registration files.',
- '''This is an additional quality control step. The registered CT scans were superimposed and
- outliers where identified and inspected manually to find inaccurate registrations. Inaccurate registrations
- have regions of interest for the arteries that are not at the actual position of the arteries. These were
- excluded.'''
- )
- summary_statistics_df = pd.DataFrame(summary_statistics)
- print(summary_statistics_df)
- summary_statistics_df.to_csv((base_path / NIFTI_SELECTION_FILES[5]).parent / '05_summary_statistics.csv', index=False)
- def select_scans_with_at_least_one_roi(base_path: Path, dataset_structure: DatasetStructure):
- registered_nifti_info = pd.read_pickle(base_path / NIFTI_SELECTION_FILES[5])
- selected_rois = select_regions_of_interest(registered_nifti_info, base_path, dataset_structure)
- selected_rois.to_pickle(base_path / NIFTI_SELECTION_FILES[6])
- write_at_least_one_roi_nifti_files_summary(base_path)
- def write_at_least_one_roi_nifti_files_summary(base_path: Path):
- registered_nifti_files_info = pd.read_pickle(base_path / NIFTI_SELECTION_FILES[6])
- summary_statistics = {
- 'step_name': [],
- 'roi_count': [],
- 'nifti_file_count': [],
- 'original_version_count': [],
- 'patient_count': [],
- 'explanation': []
- }
- add_roi_statistics(
- summary_statistics,
- registered_nifti_files_info,
- 'Check if at least half of one ROI is present in the scans.',
- '''Not all scans contain the ROIs we defined in the MRI template. This step filters scans where
- there is no ROI present, e.g. skull vault scans, that don't reach low enough. This step filters by calculating
- the size of the ROI mask in the native CT space in absolute (mm^2) values compared to the original size of the
- ROI. The condition of inclusion for CT scans is at least one ROI with a size of half of the original
- template ROI.'''
- )
- summary_statistics_df = pd.DataFrame(summary_statistics)
- print(summary_statistics_df)
- summary_statistics_df.to_csv((base_path / NIFTI_SELECTION_FILES[6]).parent / '06_summary_statistics.csv', index=False)
nifti_selection.py at commit db2d7de, no license · at the source
Overview
- Institute for Adaptive and Neural Computation, Data Science and Artificial Intelligence, School of Informatics, University of Edinburgh, Edinburgh, EH89AB, UK
- Computer Science Department, The Applied College, Taibah University, Madinah, 46537, Saudi Arabia
- Institute for Neuroscience and Cardiovascular Research, Center for Clinical Brain Sciences, University of Edinburgh, Edinburgh, EH16 4SB, UK
- Department of Neurology, West China Hospital, Sichuan University, Chengdu, 610041, China
- Usher Institute, Center for Medical Informatics, University of Edinburgh, Edinburgh, EH164UX, UK
Abstract
Purpose: White matter hyperintensities are a key imaging marker of vascular pathology, defined on brain magnetic resonance imaging (MRI) and typically manifesting on non-contrast computed tomography (CT) as subtle white matter hypoattenuation (WMH). Accurately segmenting WMH in CT scans remains challenging due to their low contrast with the surrounding tissue. This work presents an end-to-end framework for WMH segmentation in CT scans and validates the design choices in each step of the processing pipeline. We leverage a state-of-the-art deep-learning method combined with manually annotated and pseudo-labelled datasets from paired CT-MRI scans from different clinical scanners to deliver reliable outcomes.
Approach: Our framework includes DICOM data curation, sequence selection, and automatic label generation as preparation steps. Preprocessing includes z-score intensity normalisation, skull stripping, CT windowing and two-step CT-MRI registration to accurately transfer MRI-derived labels into the CT space. Further processing involves the use of a 3D nnU-Net initially trained on CT images with aligned MRI-based WMH manually derived (n=
Findings: CT-based WMH volumes showed a near-perfect correlation with ground-truth MRI WMH volumes (r = 0.98), with a systematic overestimation (mean difference = 2.40 mL; 95% limits of agreement: -8.31 to 13.11 mL) that may be adjustable in downstream tasks. This overestimation reflected challenges in the precise delineation of small WMH lesions and confounding from other imaging markers of brain disease. Across the evaluated cohort, ground-truth WMH volumes ranged from 1.02 to 149.34 mL. The best-performing configuration achieved a mean absolute error below 3 mL, corresponding to approximately 17% of the mean WMH volume, and a mean Dice similarity coefficient of 0.57. Segmentation accuracy decreased in the presence of stroke lesions. Models trained on single-pathology datasets, as well as approaches relying on template-based spatial normalisation, did not achieve satisfactory performance despite using the same backbone network configuration.
Conclusion: Using a multi-centre dataset and a multi-modal approach with expert-annotated data combined with pseudo-labelled data for training can substantially narrow the performance gap between CT- and MRI-based WMH segmentation. The framework proposed provides a generalisable solution that underscores the practical viability of CT for evaluating WMH burden in clinical and research scenarios—particularly where MRI is unavailable or contraindicated—thereby broadening access to small-vessel disease assessment.
Reproduced under the paper's license (CC BY), from the paper cited above.
Repository
Its files are read in the Code ↔ Paper reader above, with 2 matches between paragraphs and lines of code.
bjin96/ct-processing
db2d7de50a9b480effff9abd857dd64a85383657, 6 July 2026Availability: 1 check, the latest on 30 September 2026: the link answers
- 30 September 2026: the link answers
25 files
- example_execution/
full_pipeline.sh , Shell, 86 lines - run.py, Python, 35 lines
- src/
__init__.py , Python, 1 line - src/
call_command_line.py , Python, 15 lines - src/
co_registration.py , Python, 199 lines - src/
commands.py , Python, 317 lines - src/
completeness_group_simil , Python, 203 linesarity.py - src/
convert_dicom_to_nifti.p , Python, 96 linesy - src/
create_completeness_grou , Python, 96 linesps.py - src/
create_dataset_json.py , Python, 37 lines - src/
create_dicom_information , Python, 47 lines_csv.py - src/
create_nnunet_dataset.py , Python, 166 lines - src/
create_region_of_interes , Python, 220 linest.py - src/
ct_windowing.py , Python, 81 lines - src/
datasets/ , Python, 1 line__init__.py - src/
datasets/ , Python, 16 linesdatasets.py - src/
datasets/ , Python, 317 lines, 1 matchstructure.py - src/
determine_patient_orient , Python, 42 linesation.py - src/
image_similarity.py , Python, 83 lines - src/
nifti_selection.py , Python, 381 lines, 1 match - src/
read_annotation_file.py , Python, 30 lines - src/
read_nifti_information.p , Python, 140 linesy - src/
region_of_interest_defin , Python, 160 linesition.py - src/
scan_completeness.py , Python, 113 lines - README.md, Text, 151 lines
The paper's code and data availability statement is in the Data section.
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 24 scripts, each with its path and the digest of its content;
- 2 matches between paragraphs of the paper and lines of the code (method lexical-v1);
- neither the text of the paper nor the code itself.
Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.
Data
No dataset and no data link were found in the paper.
Data and Code Availability
The framework presented uses software modules and libraries publicly available. The backbone neural network architecture used, namely nnUNet, is also freely available. The imaging data could be available upon request to the principal investigators of the primary studies. The neural network weights of the proposed model can also be made available upon request.
Reproduced under the paper's license (CC BY), from the paper cited above.
Versions
The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.
Version 1, 30 September 2026: the first record
Recorded: type, journal, dates, 12 authors, 6 keywords, 33 references.
Cite
This paper
Alamoudi, N., Valdés Hernández, M. D. C., Seth, S., Jin, B., Sakka, E., Arteaga-Reyes, C., García, D. J., Cheng, Y., Jochems, A. C., Mair, G., Wardlaw, J. M., & Bernabeu, M. O. (2026). AI-Based Pipeline for the Segmentation of White Matter Hypoattenuations in CT Scans: A Design-Choice Validation Study. medRxiv (preprint). https://
BibTeX
@article{alamoudi2026ai,
author = {Alamoudi, Nada and Valdés Hernández, Maria Del C. and Seth, Sohan and Jin, Benjamin and Sakka, Eleni and Arteaga-Reyes, Carmen and García, Daniela Jaime and Cheng, Yajun and Jochems, Angela C.C. and Mair, Grant and Wardlaw, Joanna M. and Bernabeu, Miguel O.},
title = {{AI-Based Pipeline for the Segmentation of White Matter Hypoattenuations in CT Scans: A Design-Choice Validation Study}},
journal = {medRxiv (preprint)},
year = {2026},
month = mar,
publisher = {medRxiv},
doi = {10.64898/
url = {https://
}
RIS
TY - JOUR
AU - Alamoudi, Nada
AU - Valdés Hernández, Maria Del C.
AU - Seth, Sohan
AU - Jin, Benjamin
AU - Sakka, Eleni
AU - Arteaga-Reyes, Carmen
AU - García, Daniela Jaime
AU - Cheng, Yajun
AU - Jochems, Angela C.C.
AU - Mair, Grant
AU - Wardlaw, Joanna M.
AU - Bernabeu, Miguel O.
TI - AI-Based Pipeline for the Segmentation of White Matter Hypoattenuations in CT Scans: A Design-Choice Validation Study
T2 - medRxiv (preprint)
J2 - medRxiv
PY - 2026
DA - 2026/
PB - medRxiv
DO - 10.64898/
UR - https://
ER -
CSL-JSON
{
"id": "10.64898/
"type": "article",
"title": "AI-Based Pipeline for the Segmentation of White Matter Hypoattenuations in CT Scans: A Design-Choice Validation Study",
"container-title": "medRxiv (preprint)",
"author": [
{
"family": "Alamoudi",
"given": "Nada"
},
{
"family": "Valdés Hernández",
"given": "Maria Del C."
},
{
"family": "Seth",
"given": "Sohan"
},
{
"family": "Jin",
"given": "Benjamin"
},
{
"family": "Sakka",
"given": "Eleni"
},
{
"family": "Arteaga-Reyes",
"given": "Carmen"
},
{
"family": "García",
"given": "Daniela Jaime"
},
{
"family": "Cheng",
"given": "Yajun"
},
{
"family": "Jochems",
"given": "Angela C.C."
},
{
"family": "Mair",
"given": "Grant"
},
{
"family": "Wardlaw",
"given": "Joanna M."
},
{
"family": "Bernabeu",
"given": "Miguel O."
}
],
"container-title-short":
"DOI": "10.64898/
"publisher": "medRxiv",
"URL": "https://
"issued": {
"date-parts": [
[
2026,
3,
11
]
]
}
}
The tracing map gets a citation of its own once an author has validated it and it has a DOI.
Similar papers
The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.
- [1] doi:10.1212/wnl.0000000000218502
- Retinal Optical Coherence Tomography-Angiography and Longitudinal Changes in Cognition and Cerebral Small Vessel Disease.Journal: NeurologyIn common: stroke, other, structural MRI / diffusion, 3 references, 2 authors
- [2] doi:10.1038/s41597-026-07184-5 [code]
- A Multiple Sclerosis MRI Dataset with Tri-Mask Annotations for Lesion Segmentation.Journal: Scientific dataIn common: pydicom, scikit-image, NiBabel, 4 other tools, methods / tools, structural MRI / diffusion, 2 references
- [3] doi:10.64898/2026.03.09.26347914 [code]
- Multimodal Ageing Biomarkers and Plasma Proteomic Signatures Associated with All-Cause MortalityJournal: medRxiv (preprint)In common: structural MRI / diffusion, 2 authors
- [4] doi:10.1186/s12938-026-01555-0 [code]
- Incorporating normal periventricular changes for enhanced pathological white matter hyperintensity segmentation: on multiclass deep learning approaches.Journal: Biomedical engineering onlineIn common: scikit-image, pandas, SciPy, 2 other tools, stroke, methods / tools, structural MRI / diffusion, 3 references
- [5] doi:10.3389/frai.2026.1771088 [code]
- Few-shot deployment of pretrained MRI transformers in brain imaging tasks.Journal: Frontiers in artificial intelligenceIn common: pydicom, scikit-image, NiBabel, 4 other tools, methods / tools, structural MRI / diffusion, 1 reference
- [6] doi:10.1080/07853890.2026.2685416 [code]
- Pulmonary and cerebral damage in COVID-19 survivors: is there any association?Journal: Annals of medicineIn common: pydicom, scikit-image, NiBabel, 4 other tools, stroke, other, structural MRI / diffusion
- [7] doi:10.1162/imag.a.1262 [code]
- Frame-wise multi-echo distortion correction for superior functional MRI.Journal: Imaging neuroscience (Cambridge, Mass.)In common: pydicom, Nilearn, scikit-image, 5 other tools
- [8] doi:10.1371/journal.pcbi.1014555 [code]
- Body surface potential driven personalisation of electrophysiological digital twins in hypertrophic cardiomyopathy.Journal: PLoS computational biologyIn common: pydicom, scikit-image, NiBabel, 4 other tools, other, structural MRI / diffusion
- [9] doi:10.1016/j.nicl.2026.104001 [code]
- Effect of vascular lesion preprocessing on Brain Intensity AbNormality Classification Algorithm (BIANCA) white matter hyperintensity segmentation.Journal: NeuroImage. ClinicalIn common: NiBabel, pandas, SciPy, 2 other tools, stroke, methods / tools, structural MRI / diffusion, 2 references
- [10] doi:10.1212/wnl.0000000000218472 [code]
- Lesion-Level Subtypes of White Matter Hyperintensity Evolution Beyond Spatial Location.Journal: NeurologyIn common: Nilearn, NiBabel, pandas, 3 other tools, stroke, structural MRI / diffusion, 1 reference
Contribute
The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.
Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 1 repository of the authors' code, each at its verified commit and with its license, 24 scripts, and 2 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:81b90936b8ee58c8…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
Request its removal
To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).
Discussion, reproductions, activity
Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.
Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
