{
  "source_file": "0930",
  "source_platform": "Hashnode",
  "author": "Lakshmi Mahabaleshwara",
  "title_listed": "What Happens to a Medical Image Before and After a Model Sees It",
  "keywords": "",
  "domain": "图像处理",
  "content_type": "深度技术解析",
  "is_paid_flag": "否",
  "url": "https://freecodecamp.org/news/what-happens-to-a-medical-image-before-and-after-a-model-sees-it",
  "publish_date": "2026-08-24",
  "corpus_stage": "",
  "notes": "",
  "id": "e5365e0dad4e",
  "collected_at": "2026-10-02T14:11:46",
  "title": "What Happens to a Medical Image Before and After a Model Sees It",
  "body_markdown": "Medical imaging papers are full of familiar-looking terms: normalization, labels, validation, annotation, and preprocessing.\nIf you come from general machine learning, you may think you already know what these words mean. And sometimes you do.\nBut medical imaging adds a few twists. Some terms have a different meaning, and some are used in more than one way depending on the context.\nThis article follows a chest X-ray from the moment it's acquired to the point where a model makes a prediction. Along the way, we'll look at the common terms you'll see in medical imaging papers and what they actually mean.\nA companion\nnotebook\nlets you run most of these steps yourself instead of just reading about them.\nWhat We'll Cover:\nWhat You'll Learn\nFrom Image to Dataset\n1. Acquisition\n2. Anonymization, de-identification, and pseudonymization\n3. Safe Harbor and Expert Determination\nFrom Dataset to Model Input\n4. Preprocessing\n5. Normalization\n6. Annotation and label\n7. Dataset splitting\nFrom Model to Prediction\n8. Classification, detection, and segmentation\n9. Augmentation\n10. Postprocessing\nFrom One Hospital to the Real World\n11. Harmonization\n12. Retrospective and prospective validation\nPutting it together\nConclusion\nWhat You'll Learn\nWhat each stage of a medical imaging pipeline is called, and what actually happens at each stage\nThe difference between anonymization, de-identification, and pseudonymization\nWhy \"annotation\" and \"normalization\" can mean different things depending on the context\nHow classification, detection, and segmentation differ on the same image\nWhat harmonization fixes, and why validation design can matter more than model choice\nFrom Image to Dataset\n1. Acquisition\nAcquisition is when the image is created. It includes the imaging machine, its settings, and how the patient is positioned.\nTwo chest X-rays of the same patient may look different if they were taken using different machines. The manufacturer, detector, exposure settings, and image-processing software can all affect the final image.\nPatient's position matters too. For example, a standing\nPA (Posteroanterior)\nchest X-ray can look very different from a portable\nAP (Anteroposterior)\nX-ray taken while a patient is lying in bed.\nOne important difference is the apparent size of the heart. This can affect what a model learns.\nA lot of this information is stored in the\nDICOM\nfile.\nDICOM (Digital Imaging and Communications in Medicine) is the standard format used to store and communicate medical images. A DICOM file contains much more than pixels. It can also contain information about the patient, scanner, study, image orientation, pixel spacing, and other details.\nThe image used in this tutorial originally arrived as a JPEG, so the original clinical DICOM metadata wasn't available. For demonstration, the notebook wraps the image in a new DICOM file and adds a few useful fields.\nds = pydicom.dcmread(\"synthetic_cxr.dcm\")\n\nfor tag in [\"Modality\", \"BodyPartExamined\", \"ViewPosition\",\n            \"Manufacturer\", \"ManufacturerModelName\", \"KVP\", \"PixelSpacing\"]:\n    print(f\"{tag:24s} {ds[tag].value}\")\nOne field worth paying attention to is\nPixelSpacing\n. It tells you the physical size represented by each pixel, usually in millimeters. Two images can both be 512 × 512 pixels but cover different physical areas.\nSo if you want to measure something in millimeters, you can't simply count pixels. You also need to know the pixel spacing.\n2. Anonymization, De-identification, and Pseudonymization\nThese three terms are often used interchangeably, but they have different meanings.\nDe-identification\nDe-identification removes or changes information that could identify a person.\nFor example:\nPatient name\nMedical record number\nDate of birth\nPhone numbers\nOther identifying information\nThe goal is to reduce the chance that the data can be linked back to a person.\nPseudonymization\nPseudonymization replaces an identifier with a code.\nFor example:\nJane Doe → SUBJ_0041\nThe important difference is that a separate key can still connect\nSUBJ_0041\nback to Jane Doe.\nHospitals may need this because they sometimes need to find the original patient again.\nAnonymization\nAnonymization aims to make re-identification no longer reasonably possible.\nUnlike pseudonymization, there's no retained key that can be used to reconnect the data to the person.\nA simple question can help:\nCan this data still be linked back to the person using additional information?\nIf the answer is yes because a separate key exists, you're generally dealing with pseudonymization rather than true anonymization.\nThe exact legal meaning depends on the country and regulation, so researchers should be careful when using these terms.\nThe pixels can contain identifiers, too\nRemoving information from the DICOM header is only one part of the job.\nSometimes text is actually drawn into the image.\nFor example:\nPatient name\nDate\nHospital name\nR\nPORTABLE\nThis is called\nburned-in annotation.\nRemoving the DICOM metadata does nothing to this text. You have to find the text in the pixels and remove it.\nThis is harder than it sounds. A simple rule such as \"look for bright pixels near the top of the image\" will find more than just text. Bones such as the clavicle and ribs are also bright.\nThat means a real de-identification pipeline usually combines several techniques:\nText detection\nOCR\nImage-region rules\nDICOM metadata removal\nValidation\nThe goal isn't just to remove text. It's to prove that the text was actually removed.\nFor example:\nIDENTIFIERS = [\n    \"PatientName\",\n    \"PatientID\",\n    \"PatientBirthDate\",\n    \"PatientSex\",\n    \"InstitutionName\",\n    \"ReferringPhysicianName\",\n    \"StudyDate\",\n    \"StudyTime\",\n    \"AccessionNumber\"\n]\n\nfor tag in IDENTIFIERS:\n    if tag in ds:\n        ds[tag].value = \"\"\n\n# Records that an identity-removal process was performed.\n# This field alone does not make the dataset de-identified.\nds.PatientIdentityRemoved = \"YES\"\nThe pixel-level part is where a simple demo and a real production pipeline are very different.\n3. Safe Harbor and Expert Determination\nIf you work with US healthcare data, you'll often see two HIPAA terms:\nSafe Harbor\nand\nExpert Determination\n.\nThey are two ways to determine whether protected health information has been de-identified under HIPAA.\nSafe Harbor\nSafe Harbor is a checklist. It requires removing 18 categories of identifiers, including things such as:\nNames\nGeographic information smaller than a state\nCertain dates\nPhone numbers\nMedical record numbers\nDevice identifiers\nFull-face photographs\nIt's relatively straightforward because you can follow a defined list.\nExpert Determination\nExpert Determination takes a different approach. A qualified expert evaluates the risk of re-identification and documents why the remaining risk is very small. This can allow researchers to keep information that Safe Harbor would require them to remove.\nFor example, exact dates can be very useful when studying how a disease changes over time.\nSo there's a trade-off:\nSafe Harbor is simpler and more restrictive\nExpert Determination is more flexible, but requires a documented risk assessment\nThese are US HIPAA concepts. Other countries have different privacy laws and definitions.\nFor example, the GDPR in the EU and India's DPDP Act have their own approaches to anonymous and pseudonymous data.\nFrom Dataset to Model Input\n4. Preprocessing\nPreprocessing is what you do to an image before giving it to a model.\nCommon preprocessing steps include:\nResizing\nWindowing\nChanging orientation\nNormalizing pixel values\nResizing\nModels usually expect images of a fixed size. Medical images can come in many different sizes, so they're often resized.\nBut resizing changes the relationship between pixels and physical space.\nFor example, if you resize an image from 1024 × 1024 to 512 × 512, each pixel now represents a different physical area.\nSo if you need physical measurements, such as distances or areas in millimeters, you need to account for the original or resampled pixel spacing.\nWindowing\nWindowing selects a range of intensity values and maps that range to the display range. Values outside the range are clipped.\nRadiologists commonly use different window settings when looking at CT images because different tissues become easier to see under different windows.\nWindowing changes how the image is represented or displayed. It doesn't mean the original image data has been changed.\nThe notebook demonstrates windowing using the 2nd and 98th percentiles:\nlo, hi = np.percentile(img, [2, 98])\nwindowed = np.clip(\n    (img.astype(float) - lo) / (hi - lo),\n    0,\n    1\n)\nOrientation\nMedical images also contain information about orientation. Getting this wrong means left and right are swapped, which, for a chest X-ray, is a serious mistake.\n5. Normalization\nHere's the first word with dual meanings.\nIn machine learning, normalization usually means transforming numerical values into a more consistent scale or distribution so that training behaves more predictably. Two common versions:\nMin-max\n: rescale so the lowest value becomes 0 and the highest becomes 1.\nf = img.astype(np.float32)\n\nminmax = (f - f.min()) / (f.max() - f.min())\nZ-score\n: subtract the mean and divide by the standard deviation, giving a mean of 0 and a standard deviation of 1.\nzscore = (f - f.mean()) / f.std()\nMin-max normalization has one weakness. It depends directly on the minimum and maximum values. A very bright pixel, such as one caused by a device or noise, can change the range and squeeze most of the image into a smaller part of the scale.\nZ-score normalization is less dependent on the minimum and maximum, although extreme values can still affect the mean and standard deviation.\nIn medical imaging, normalization can also be applied consistently across images or datasets, but making images from different scanners or institutions comparable is more specifically described as\nharmonization\n. The distinction becomes important when you are dealing with multiple sites, as explained in section 10.\n6. Annotation and Label\nBoth describe information associated with an image, but they differ in what that information represents.\nA\nlabel\nusually describes the image as a whole.\nFor example:\nImage → Pneumonia\nAn\nannotation\nusually tells you where something is in the image.\nIt could be:\nA point\nBounding box\nPolygon\nContour\nPixel-level mask\nFor example:\nImage → Lung mask\nThe key difference is\nlocation\n.\nA label tells you\nwhat\nis present while an annotation can tell you\nwhat\nis present and\nwhere\nit is.\nAnnotations also take much more effort to create.\nA large dataset may have millions of image-level labels extracted from radiology reports, but only a small subset may have detailed masks created by clinicians.\nThat shortcut has a cost. A report may say \"pneumonia,\" but that doesn't necessarily tell you exactly which pixels show pneumonia. This can lead to\nnoisy labels\n.\n7. Dataset Splitting\nOne of the most important decisions in a medical imaging study is\nhow you split the data\n.\nThe split should usually happen at the\npatient level\n, not the image level.\nImagine a patient has five X-rays. If you put three images into training and two into testing, the model has already seen images from that patient during training. Patient-specific characteristics can appear in both sets. This is a form of\ndata leakage\n.\nThe same idea applies to:\nMultiple scans from the same patient\nMultiple images from the same study\nImages derived from the same original scan\nThe goal is simple: the test set should contain patients the model didn't see during training.\nSo instead of:\nSplit images and assign patients\ndo this:\nSplit patients and assign their images\nThis is one of those details that can have a bigger effect on your results than changing the model architecture.\nFrom Model to Prediction\n8. Classification, Detection, and Segmentation\nTake the same chest X-ray and ask three different questions.\nClassification\nIs there pneumonia?\nThe model returns a label or probability.\nPneumonia: 0.92\nIt tells you\nwhat\nis in the image. It doesn't tell you where.\nDetection\nWhere is the abnormality? The model returns a bounding box.\n[x, y, width, height]\nIt tells you roughly where the finding is. It doesn't describe its exact shape.\nSegmentation\nWhich pixels belong to the abnormality?\nThe model returns a pixel-level mask. This gives you the shape and location of the finding.\nA simple way to remember it:\nClassification = What?\nDetection = Where?\nSegmentation = Which pixels?\nThe amount of annotation work usually increases as you move from classification to detection to segmentation.\nSo choose the simplest task that answers your question. If you only need to know whether a scan is abnormal, you probably don't need segmentation.\n9. Augmentation\nAugmentation creates new training examples by transforming existing images.\nCommon transformations include:\nRotation\nTranslation\nZoom\nBrightness changes\nThis can be useful when medical datasets are small.\nBut medical images have an important constraint: the transformed image should still look like something that could realistically happen to a patient.\nFor example, a horizontal flip is common in natural-image machine learning.\nFlip a photo of a cat and you still have a cat.\nBut flip a chest X-ray and the heart moves to the other side. You may have just created an image that looks like\ndextrocardia\n, where the heart is on the right side.\nThe same problem happens with markers. A right-side marker can suddenly appear on the left. The letter itself is also mirrored. A model doesn't automatically understand that this is anatomically wrong.\nOther augmentations can cause problems, too. A large brightness change might hide important findings. An aggressive crop might remove part of the lungs.\nSo before using an augmentation, ask: could this image realistically come from a real scanner and a real patient?\nIf not, don't use it.\n# Reasonable: small rotation\nM = cv2.getRotationMatrix2D((cx, cy), 7, 1.0)\nrotated = cv2.warpAffine(\n    img,\n    M,\n    (w, h),\n    borderMode=cv2.BORDER_REPLICATE\n)\n\n# Potentially problematic for a chest X-ray:\nflipped = img[:, ::-1]\n10. Postprocessing\nPostprocessing happens after the model produces its output.\nA segmentation model usually produces a probability for every pixel. After applying a threshold, the mask may contain small unwanted regions or holes.\nFor example, the notebook's raw mask contains:\nTwo large lung regions\nFourteen small unwanted regions\nA common cleanup step is to keep only the largest connected components.\nSince we expect two lungs, we can keep the two largest regions. We can also fill small holes.\nlabelled, n = ndimage.label(mask > 0)\n\nsizes = ndimage.sum(\n    mask > 0,\n    labelled,\n    range(1, n + 1)\n)\n\nkeep = np.isin(\n    labelled,\n    np.argsort(sizes)[-2:] + 1\n)\n\nclean = ndimage.binary_fill_holes(keep)\nIn this example, the cleanup reduces the number of connected components from 16 to 2 while changing less than 5% of the pixels.\nThat illustrates an\nimportant point about evaluation:\npixel-overlap metric might barely change, even though the structure of the prediction has changed significantly.\nFor some applications, the number and shape of connected regions matter more than a small change in pixel overlap. So choose metrics that match the errors you actually care about.\nAlso, be careful with postprocessing. If your model needs a lot of cleanup before the result looks good, the cleanup may be hiding problems in the model.\nAlways look at the raw output, too.\nFrom One Hospital to the Real World\n11. Harmonization\nImagine two hospitals use different scanners.\nThe images may have different:\nBrightness\nContrast\nNoise\nResolution\nImage-processing characteristics\nA model trained mostly on Hospital A may learn some of these differences instead of learning features related to the disease. It may perform well on Hospital A but fail on Hospital B.\nThis is where\nharmonization\ncan help.\nHarmonization tries to make data from different sources more comparable while preserving the information that matters.\nOne simple example is\nhistogram matching\n.\nIt adjusts the pixel-value distribution of one image to look more like a reference image.\nfrom skimage.exposure import match_histograms\n\nharmonized = match_histograms(\n    image_from_hospital_b,\n    reference_from_hospital_a\n)\nThis can help with brightness and contrast differences, but it can't solve everything.\nIf two scanners have different resolution, noise characteristics, or image-processing pipelines, histogram matching alone isn't enough.\nAnd if information was lost during image acquisition or clipping, harmonization can't magically recover it.\nA useful rule of thumb is:\nNormalization makes numerical values more consistent.\nHarmonization addresses systematic differences between data sources.\n12. Retrospective and Prospective Validation\nThis section is about study design.\nRetrospective\nA retrospective study uses data that already exists.\nFor example:\nWe collected 4,000 chest X-rays from the hospital archive and tested our model on them.\nThis is common in medical AI because it's relatively fast and inexpensive.\nBut it also creates opportunities for bias. Researchers may make decisions about which patients to include, which scans to exclude, which hospital to use, and which threshold to choose.\nThese decisions can unintentionally make the results look better.\nProspective\nIn a prospective study, you define the study plan first and then collect data going forward.\nFor example:\nWe define the patient population, evaluation criteria, and success metrics before collecting the images.\nThis can reduce some sources of bias because important decisions are made before seeing the results.\nExternal validation\nYou'll also see the term\nexternal validation\n.\nThis means testing the model on data that is independent of the data used to develop it.\nFor example:\nHospital A → Training\nHospital A → Internal test\nHospital B → External validation\nAn even stronger test might be:\nHospital A + B → Development\nHospital C → External validation\nA model that performs well on its own hospital's data but poorly at another hospital may have learned site-specific patterns instead of general disease features.\nExternal validation is therefore often much more informative than simply creating another random split from the same dataset.\nPutting it Together\nNow consider this sentence from a hypothetical medical imaging paper:\nWe retrospectively collected 4,120 de-identified frontal chest radiographs from two institutions. Images were resampled to 512 × 512, intensity-normalized, and harmonized across sites by histogram matching. Lung fields were manually annotated by two radiologists; segmentation output was postprocessed by largest-component selection. The model was externally validated on 890 studies from a third site.\nThat paragraph contains a lot of information, but now you can decode it:\nRetrospectively collected:\nThe researchers used images that already existed.\nDe-identified:\nIdentifying information was removed or changed.\nTwo institutions:\nThe dataset comes from more than one source.\nResampled to 512 × 512:\nImages were converted to a common image size.\nIntensity-normalized:\nPixel values were transformed to a more consistent numerical scale.\nHarmonized:\nThe researchers tried to reduce systematic differences between the two sites.\nManually annotated by two radiologists:\nExperts created spatial information showing where the lung fields are.\nPostprocessed:\nThe model's raw segmentation output was cleaned up.\nExternally validated:\nThe model was tested on independent data from another site.\nAnd that last part is especially important. A model that works well only on the data it was developed on tells you much less about how it will perform in the real world.\nConclusion\nA medical imaging paper can describe an entire data pipeline in just a few sentences.\nOnce you understand the terminology, you can start reading those sentences differently.\nInstead of just looking at the model and its accuracy, you can ask:\nWhere did the images come from?\nWhat scanner was used?\nWere patients kept separate between training and testing?\nHow were identifiers removed?\nCould there be burned-in text?\nWho created the labels or annotations?\nWhat preprocessing was performed?\nHow were pixel values normalized?\nWere different hospitals or scanners harmonized?\nWas the model externally validated?\nWas the test data truly independent?\nWhat happened to the model's output after prediction?\nThe model is only one part of a medical imaging pipeline. Very often, the more important questions come\nbefore the model ever sees an image\n.",
  "metadata": {
    "title": "What Happens to a Medical Image Before and After a Model Sees It",
    "description": "Medical imaging papers are full of familiar-looking terms: normalization, labels, validation, annotation, and preprocessing. If you come from general machine learning, you may think you already know w",
    "keywords": null,
    "author": null,
    "og:site_name": "freeCodeCamp.org",
    "og:type": "article",
    "og:title": "What Happens to a Medical Image Before and After a Model Sees It",
    "og:description": "Medical imaging papers are full of familiar-looking terms: normalization, labels, validation, annotation, and preprocessing. If you come from general machine learning, you may think you already know w",
    "og:url": "https://www.freecodecamp.org/news/what-happens-to-a-medical-image-before-and-after-a-model-sees-it/",
    "og:image": "https://cdn.hashnode.com/uploads/covers/5e1e335a7a1d3fcc59028c64/9014bf41-16ea-4661-926a-4444a53484f8.png",
    "og:image:width": "1920",
    "og:image:height": "1080",
    "twitter:card": "summary_large_image",
    "twitter:title": "What Happens to a Medical Image Before and After a Model Sees It",
    "twitter:description": "Medical imaging papers are full of familiar-looking terms: normalization, labels, validation, annotation, and preprocessing. If you come from general machine learning, you may think you already know w",
    "twitter:url": "https://www.freecodecamp.org/news/what-happens-to-a-medical-image-before-and-after-a-model-sees-it/",
    "twitter:image": "https://cdn.hashnode.com/uploads/covers/5e1e335a7a1d3fcc59028c64/9014bf41-16ea-4661-926a-4444a53484f8.png",
    "twitter:label1": "Written by",
    "twitter:data1": "Lakshmi Mahabaleshwara",
    "twitter:label2": "Filed under",
    "twitter:data2": "Medical Imaging, Machine Learning, Healthcare AI, #medical-ai, Data Preprocessing, Image Segmentation, pytorch, De-identification, AI in Healthcare,",
    "twitter:site": "@freecodecamp",
    "article:published_time": "2026-08-24T20:40:43.010Z",
    "article:modified_time": "2026-08-24T20:40:43.010Z",
    "article:tag": "AI in Healthcare,",
    "article:publisher": "https://www.facebook.com/freecodecamp"
  },
  "paywall": {
    "listed_paid": false,
    "detected": false,
    "marker": "",
    "public_only": false,
    "policy": "付费/会员内容只保留页面公开可见部分，不绕过付费墙"
  },
  "crawl": {
    "success": true,
    "status_code": 200,
    "error": ""
  },
  "code_blocks": [
    {
      "file": "attachments/e5365e0dad4e/code/body-000.txt",
      "chars": 220,
      "language": "text"
    },
    {
      "file": "attachments/e5365e0dad4e/code/body-001.txt",
      "chars": 93,
      "language": "text"
    },
    {
      "file": "attachments/e5365e0dad4e/code/body-002.txt",
      "chars": 21,
      "language": "text"
    },
    {
      "file": "attachments/e5365e0dad4e/code/body-003.txt",
      "chars": 43,
      "language": "text"
    },
    {
      "file": "attachments/e5365e0dad4e/code/body-004.txt",
      "chars": 72,
      "language": "text"
    },
    {
      "file": "attachments/e5365e0dad4e/code/body-005.txt",
      "chars": 428,
      "language": "text"
    },
    {
      "file": "attachments/e5365e0dad4e/code/body-006.txt",
      "chars": 142,
      "language": "text"
    },
    {
      "file": "attachments/e5365e0dad4e/code/body-007.txt",
      "chars": 114,
      "language": "text"
    },
    {
      "file": "attachments/e5365e0dad4e/code/body-008.txt",
      "chars": 73,
      "language": "text"
    },
    {
      "file": "attachments/e5365e0dad4e/code/body-009.txt",
      "chars": 34,
      "language": "text"
    },
    {
      "file": "attachments/e5365e0dad4e/code/body-010.txt",
      "chars": 18,
      "language": "text"
    },
    {
      "file": "attachments/e5365e0dad4e/code/body-011.txt",
      "chars": 18,
      "language": "text"
    },
    {
      "file": "attachments/e5365e0dad4e/code/body-012.txt",
      "chars": 16,
      "language": "text"
    },
    {
      "file": "attachments/e5365e0dad4e/code/body-013.txt",
      "chars": 22,
      "language": "text"
    },
    {
      "file": "attachments/e5365e0dad4e/code/body-014.txt",
      "chars": 236,
      "language": "text"
    },
    {
      "file": "attachments/e5365e0dad4e/code/body-015.txt",
      "chars": 215,
      "language": "text"
    },
    {
      "file": "attachments/e5365e0dad4e/code/body-016.txt",
      "chars": 137,
      "language": "text"
    },
    {
      "file": "attachments/e5365e0dad4e/code/body-017.txt",
      "chars": 82,
      "language": "text"
    },
    {
      "file": "attachments/e5365e0dad4e/code/body-018.txt",
      "chars": 62,
      "language": "text"
    }
  ],
  "images": [
    {
      "status": "ok",
      "url": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/f7c468f5-87bf-43ed-b035-40658803e6d2.png",
      "bytes": 152484,
      "reused": true,
      "local_path": "attachments/e5365e0dad4e/images/003.png",
      "src": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/f7c468f5-87bf-43ed-b035-40658803e6d2.png",
      "alt": "Chest X-ray showing identifying text and anatomical structures, illustrating why burned-in annotations cannot be removed by simply deleting DICOM metadata.",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/09d29749-7e91-4be6-8569-bcea52249e4a.png",
      "bytes": 265233,
      "reused": true,
      "local_path": "attachments/e5365e0dad4e/images/004.png",
      "src": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/09d29749-7e91-4be6-8569-bcea52249e4a.png",
      "alt": "Chest X-ray before and after preprocessing, illustrating changes such as resizing, windowing, and orientation.",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/a5015387-4f30-482e-bf9b-54fde7d56b15.png",
      "bytes": 43858,
      "reused": true,
      "local_path": "attachments/e5365e0dad4e/images/005.png",
      "src": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/a5015387-4f30-482e-bf9b-54fde7d56b15.png",
      "alt": "Chest X-ray showing different pixel-value normalization methods, comparing the original image with min-max and z-score normalized versions.",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/9c7da7a1-5382-4136-8b3b-07293e794010.png",
      "bytes": 285588,
      "reused": true,
      "local_path": "attachments/e5365e0dad4e/images/006.png",
      "src": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/9c7da7a1-5382-4136-8b3b-07293e794010.png",
      "alt": "Chest X-ray illustrating the difference between an image-level label and a spatial annotation, with a lung region marked on the image.",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/a06f3760-0fa8-4b37-ba1a-567a77c2ae25.png",
      "bytes": 362194,
      "reused": true,
      "local_path": "attachments/e5365e0dad4e/images/007.png",
      "src": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/a06f3760-0fa8-4b37-ba1a-567a77c2ae25.png",
      "alt": "Chest X-ray showing three model outputs: an image-level classification label, a bounding box for detection, and a pixel-level segmentation mask.",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/4eb5cc4a-b415-4d97-8f8a-341ce433576e.png",
      "bytes": 310129,
      "reused": true,
      "local_path": "attachments/e5365e0dad4e/images/008.png",
      "src": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/4eb5cc4a-b415-4d97-8f8a-341ce433576e.png",
      "alt": "Chest X-ray showing examples of image augmentation, including rotation and horizontal flipping, demonstrating how transformations can change anatomical orientation.",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/262a38f4-9da2-416e-98ba-7828b19df58f.png",
      "bytes": 156968,
      "reused": true,
      "local_path": "attachments/e5365e0dad4e/images/009.png",
      "src": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/262a38f4-9da2-416e-98ba-7828b19df58f.png",
      "alt": "Lung segmentation mask before and after postprocessing, showing removal of small connected regions and filling of holes.",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/309ae26c-a241-4af2-a59f-3004cad885d5.png",
      "bytes": 292940,
      "reused": true,
      "local_path": "attachments/e5365e0dad4e/images/010.png",
      "src": "https://cdn.hashnode.com/uploads/covers/69fd77e89f93a850a46d376f/309ae26c-a241-4af2-a59f-3004cad885d5.png",
      "alt": "Chest X-rays from different imaging sources before and after harmonization, illustrating differences in brightness and contrast between sites.",
      "downloaded": true
    }
  ],
  "audio": [],
  "videos": [],
  "links": [
    {
      "href": "https://github.com/lakshmi-mahabaleshwara/healthtech-playground/blob/main/what_happens_before_the_model.ipynb",
      "label": "notebook",
      "type": "a"
    }
  ],
  "repair_version": 2,
  "repaired_at": "2026-10-14T10:50:57Z",
  "source_url": "https://freecodecamp.org/news/what-happens-to-a-medical-image-before-and-after-a-model-sees-it",
  "papers": [],
  "actual_video_files": [],
  "body_chars": 20652,
  "expected_body_images": 8,
  "discovery_status": "ok",
  "delivery_status": "ok",
  "missing_reason": "",
  "raw_html": "attachments/e5365e0dad4e/pages/source.html",
  "local_html": "attachments/e5365e0dad4e/pages/article.html",
  "body_base_path": "attachments/e5365e0dad4e/pages/",
  "body_markdown_path": "attachments/e5365e0dad4e/pages/article.md"
}