Indholdsfortegnelse:

Brain Box: Tracking Neural Volume Over Time: 20 trin
Brain Box: Tracking Neural Volume Over Time: 20 trin

Video: Brain Box: Tracking Neural Volume Over Time: 20 trin

Video: Brain Box: Tracking Neural Volume Over Time: 20 trin
Video: Brain Criticality - Optimizing Neural Computations 2024, Juli
Anonim
Brain Box: Tracking Neural Volume Over Time
Brain Box: Tracking Neural Volume Over Time

Fremskridtet til grænsen for længere menneskeliv har frembragt stigningen af sygdomme, som civilisationer ikke har set før vores. Blandt disse påvirkede Alzheimers cirka 5,3 millioner levende ældre amerikanere i 2017 eller cirka 1 ud af 10 ældre amerikanere (https://www.alz.org/facts/) og utallige andre med demens. For at hjælpe i kampen med at forstå, hvad der rammer vores ældste, vil denne kode udstyre de fremtidige forskere og ivrige nysgerrige med evnen til at spore hjernens volumen over tid.

Trin 1: Brug af Brain Box

Brug af Brain Box
Brug af Brain Box

For at bruge hjerneboks behøver man kun følgende:

  • MR -scanninger af en hjerne og navn og format på sådanne filer (skal alle have nogenlunde de samme dimensioner)
  • Længde på en scanning
  • Afstand mellem hvert lag (MR -scanning)
  • Patientnavn (Medtag ikke mellemrum, når du indtaster, og skriv venligst store for- og efternavne, f.eks.: Fornavn Efternavn)

Og ud fra dette har man evnen til at holde styr på individers tendenser i hjernens volumen over tid. Således kan tal for Alzheimers tendenser spores af denne software. Længden, vi brugte i forsøget, var 180 mm for længden af en scanning og 5 mm for afstanden mellem MR -scanninger, baseret på gennemsnitlige tal.

Imidlertid behøver anvendelsen af hjerneboks ikke at være begrænset til denne ene opgave. Hvis tværsnittene af et givet fast stof er fotografier, ligesom en tumor i sig selv, kan tendenserne i ændringer i volumen for disse også spores i softwaren.

Trin 2: Intro: Analyse af tværsnit

Intro: Analyse af tværsnit
Intro: Analyse af tværsnit

I tredimensionelle strukturer vil de todimensionelle planer, som sådanne består af, blive kaldt tværsnit. Forestil dig, at en stak papir udgør et rektangulært prisme, så ville hvert stykke papir være et tværsnit af papiret. Når vi forestiller os hjernen, anvender vi den samme tankegang. MR (magnetisk resonansbilleddannelse) (se information om MR) fanger hjernens tværsnit, og fra at bruge de grænser, der er defineret i hvert "lag" i hjernen, kan vi konstruere en struktur til at modellere og finde hjernens volumen. Vi skal dog først opbygge en funktion til at give information om sådanne grænser.

Trin 3: Opsætning af en funktion: LevelCurveTracings.m

Opsætning af en funktion: LevelCurveTracings.m
Opsætning af en funktion: LevelCurveTracings.m
Opsætning af en funktion: LevelCurveTracings.m
Opsætning af en funktion: LevelCurveTracings.m
Opsætning af en funktion: LevelCurveTracings.m
Opsætning af en funktion: LevelCurveTracings.m
Opsætning af en funktion: LevelCurveTracings.m
Opsætning af en funktion: LevelCurveTracings.m

Sørg først for, at din computer har MATLAB_R2017b downloadet (download her), og åbn MATLAB. I MATLAB -grænsefladen skal du klikke på knappen i øverste venstre hjørne af vinduet, der siger "Ny" med et fedt gult plustegn, og vælg indstillingen "funktion" for at åbne et redigeringsvindue et mellemrum, der ligner det i tredje billede. Vi vil fokusere på at ændre den første linje for at konfigurere funktionen. Hvor der står "outputArg1", skal du erstatte det med "brain", "outputArg2" for at sige "huller", "untitled2" til "exp2" og "inputArg1" til "image" og slette "inputArg2". Du har nu en funktion, der skal kaldes ved hjælp af "exp2", idet du tager et argument "billede" og udsender grænserne for "hjerne" og "huller". Den første linje i funktionen skal ligne den linje, der er afbildet på det fjerde billede. Slet hele koden under denne indledende linje.

Trin 4: Udvikling af den bundne algoritme: Find grænser

Udvikling af den bundne algoritme: Find grænser
Udvikling af den bundne algoritme: Find grænser

Indtast koden som følger under linjen. Denne sektion af funktionen udfører følgende linje-for-linje.

  1. Indlæs billedet "billede" i variablen "mri".
  2. Gør "mri" til et billede, der består af værdier i en række tal til enere og nuller (alias binærisering) baseret på en fastsat tærskelværdi. Hvis værdien i en pixel er lig med eller større end 0,1, sættes den til en, hvis ikke, er værdien ved denne pixel sat til nul.
  3. De følgende fire linjer omdanner 10 kolonner og rækker i kanterne af MR -scanningslaget til nuller for at undgå at læse forkerte værdier som grænser (som man lærte ved at eksperimentere med koden).
  4. I den sidste linje sporer bwboundaries grænserne for det binære billede "mri" og sætter det lig med "b", en matrix med de elementer, hvis indekser svarer til grænserne, der er sat til et.

Trin 5: Udvikling af den bundne algoritme: Generering af ydre bundne array

Udvikling af den bundne algoritme: Generering af ydre bundnet array
Udvikling af den bundne algoritme: Generering af ydre bundnet array

Følg med i editorvinduet med følgende kode på billedet. Dette afsnit af koden gør følgende linje-for-linje.

  1. Find længden af hver af rækkerne i det binære billede "b" (cellfun anvender funktionslængden til hver række).
  2. Indstil "loc" for at gemme de maksimale længder.
  3. Find indekset for den maksimale længde, indstillet til at gemme i "LargestTrace".
  4. Find størrelsen på billedet "mri", som består af samme størrelse som "b", og indstil til "BWsize".
  5. Find antallet af rækker i billedets array, indstillet til "ysize".
  6. Find antallet af kolonner i billedets array, indstillet til "xsize".
  7. Generer array "grootsteTraceMat", en "ysize" ved "xsize" matrix af nuller.
  8. Find det ækvivalente indeks fra de abonnerede værdier, der svarer til, hvor de størsteTrace x -værdier og y -værdier var, gem i vektoren "lindex".
  9. I matricen med nuller, "LargestTraceMat", skal du omsætte de elementer ved indekserne, der svarer til indeksværdier, der er gemt som elementer i "lindex", til dem.

Således har det logiske array "LargestTraceMat" det største afgrænsede område af det givne hjernescannetværsnit aftegnet som dem med baggrund af nuller

Trin 6: Udvikling af den bundne algoritme: Arbejde med centerpunkt

Udvikling af den bundne algoritme: Arbejde med centerpunkt
Udvikling af den bundne algoritme: Arbejde med centerpunkt

Dernæst skal vi teste, om tværsnittet består af mere end en region (den største). Ved at teste justeringen af den største regions centroid kan vi se, om der er en sammenhængende region, som ville give en mere centreret centroid eller muligheden for flere regioner.

  1. Brug "regionProps" til at finde oplysninger om de tilstedeværende centroider, der er lig med strukturmatrixen "tempStruct"
  2. Form array "centroids" med data fra feltet "centroid" sammenkædet lodret
  3. Tag den anden kolonneværdier for "centroids" (de vandrette dimensionskoordinater)
  4. Kør et filter for at kontrollere centroidens tilpasning til det vandrette center

Trin 7: Udvikling af den bundne algoritme: Når en Centroid ikke er centreret

Udvikling af den bundne algoritme: Når en Centroid ikke er centreret
Udvikling af den bundne algoritme: Når en Centroid ikke er centreret

I scenariet, hvor centroiden for det største sporområde ikke er centreret, gennemgår vi følgende trin. Som vi havde observeret i MR -scanningerne, var tendensen at få hjernehalvdele afbildet i tværsnittet, når de ikke var sammenhængende, så vi fortsætter nu med at plotte det næststørste spor sammen med det største spor i "grutsteTraceMat"

  1. Indstil den sporede matrix til en ny variabel "b2"
  2. Initialiser tom matrix "b2", med et sæt indekseret af "loc"
  3. Opret en betinget, for når en centroid ikke er centreret (dvs. et lag med flere regioner)
  4. Indstil en ny sporstørrelse, der skal findes for hver række (traceSize2)
  5. Indstil "loc2" for at finde de indekser, hvor grænser er til stede
  6. Lad celler specificeret med "loc2" i "b2" være lig med "grutsteTrace2"
  7. Konverter abonnementer til indekser, indstillet til "lindex"
  8. Skift elementer svarende til "lindex" i "LargestTraceMat" til 1
  9. Initialiser tom matrix "b2", med et sæt indekseret af "loc2"

Trin 8: Udvikling af den bundne algoritme: Interferens af huller

Udvikling af den bundne algoritme: Interferens af huller
Udvikling af den bundne algoritme: Interferens af huller

Ved håndtering af huller holdt de værdier, der er gemt i "b2" styr på andre strukturer end det største spor, og afbildning af disse på en fyldt form af "grutsteTraceMat" afslører, hvor der er huller i hjerneområderne.

  1. Opret array "filledMat", som er en udfyldt i form af "grutsteTraceMat"
  2. Opret array "interferenceMat", en "ysize" ved "xsize" array af nuller
  3. Opret array "interferenceloc" for at gemme værdierne fra "b2", sammenkædet lodret
  4. Opret array "lindex" for at gemme de indeks, der svarer til "interferenceloc"
  5. For indeks i "interferenceMat", der svarer til "lindex", sættes værdien til 1, hvilket gør en anden afgrænset region

Trin 9: Udvikling af den bundne algoritme: Lokalisering af huller, afslutning af hjernegrænser og hulgrænser

Udvikling af den bundne algoritme: Lokalisering af huller, afslutning af hjernegrænser og hulgrænser
Udvikling af den bundne algoritme: Lokalisering af huller, afslutning af hjernegrænser og hulgrænser
  1. Indstil array "tempMat" lig med "interferenceMat" plus "filledMat", og tilføj således hver værdi i matrixen til hinanden
  2. Indstil array "holesLoc" lig med indekserne, hvor "interferenceMat" og "filledMat" begge var lig med en
  3. Opsæt "holesMat" som en nulmatrix med dimensioner "ysize" x "xsize"
  4. Indstil indekser i "holesMat", der er lig med "holesLoc" som dem
  5. Indstil "hjerne" til "grutsteTraceMat"
  6. Indstil "huller" til "holesMat"

Med fundet, hvor værdierne af de tilføjede matricer var lig med 2, blev hullets placeringer let sikret og afbildet på en tom matrix.

Trin 10: Logningsdata: Funktion PatientFiles.m

Logningsdata: Funktion PatientFiler.m
Logningsdata: Funktion PatientFiler.m
Logningsdata: Funktion PatientFiler.m
Logningsdata: Funktion PatientFiler.m
Logningsdata: Funktion PatientFiler.m
Logningsdata: Funktion PatientFiler.m
Logningsdata: Funktion PatientFiler.m
Logningsdata: Funktion PatientFiler.m

Ligesom opsætningen af den sidste funktion, skal du klikke på knappen i øverste venstre hjørne af vinduet, der siger "Ny" med et fedt gult plustegn, og vælg indstillingen "funktion" for at åbne et mellemrum i editorvinduet ligner det på det tredje billede. I den første linje skal du slette outputmatricen og erstatte med blot "output", erstatte "untitled2" med "patientFiles", slette alle inputargumenterne og i stedet følge den formatering, der er angivet i det fjerde billede af kodelinjen. Den første linje i denne funktion skal matche billedets formatering.

Trin 11: Logning af data i filer

Logning af data i filer
Logning af data i filer
Logning af data i filer
Logning af data i filer

For at oprette en fil til at logge de data, der findes af hovedfunktionen (endnu ikke beskrevet), skal vi følge disse trin (som foreskrevet af koden linje for linje).

  1. Kontroller, om input til patientnavn er en streng.
  2. Hvis det ikke er en streng, skal du vise, at patientName -input skal være en streng.
  3. Afslut if -sætningen (forhindr fejl).
  4. Opret en streng sætning "DateandTime", der vil give følgende format: time: minutter-måned/dag/år.
  5. Indstil variabel filnavn til følgende: patientnavn.m.

Nu til det næste afsnit af funktionen: Findes der allerede en fil med dette navn?

1) Antag, at filen med dette navn allerede findes:

  1. Kør filen for at få værdierne fra fortiden i kø
  2. Tilføj dataene "DateandTime" for den aktuelle iteration som en ny celle i cellearrayet med x -værdier (indeksende+1)
  3. Tilføj den aktuelle "brainVolume" -værdi som en ny celle i cellearrayet med y -værdier (indeksende+1)
  4. Gem de aktuelle variabler, der er indlæst i filen.

2) Antag, at filen med dette navn ikke findes:

  1. Opret en ny fil med navnet gemt i variablen "patientnavn"
  2. Tilføj de aktuelle "DateandTime" -data som en celle i det tomme cellearray med x -værdier
  3. Tilføj de nuværende "brainVolume" -data som en celle i det tomme cellearray med y -værdier
  4. Gem de aktuelle variabler, der er indlæst i filen.

Trin 12: Logningsdata: Visning af et plot af hjernevolumen over tid

Logningsdata: Visning af et plot af hjernevolumen over tid
Logningsdata: Visning af et plot af hjernevolumen over tid
  1. Konverter x -værdier array (xVals) til et kategorisk array (xValsCategorical), for at tillade plotting
  2. Generer figurvindue 5
  3. Plot punkterne angivet med "xValsCategorical" og "yVals" (indeholdende hjernevolumen) ved hjælp af hule cirkler til at angive punkter og blive forbundet med stiplede linjer
  4. Titel plottet som: patientName Brain Volume Data
  5. Mærk x -aksen som vist på billedet
  6. Mærk y -aksen som vist på billedet
  7. Lad figur 5 svare til output

Fra dette vil funktionen patientnavn, der kaldes, give en fil med redigerede data, der holder styr på hjernens volumen over tid og et plot, der viser tendenser.

Trin 13: Lukning af huller i undergrunde: Subplotclose.m

Lukning af huller i undergrunde: Subplotclose.m
Lukning af huller i undergrunde: Subplotclose.m

Funktionen, tilpasset fra kode fra https://www.briandalessandro.com, fungerer for at lukke hullerne mellem hovedplodens underplotfigurer, når figurerne, der viser MR -billederne og hjernelagene, oprettes. Subplot -funktionen, der bruges inden for subplotclose.m, justerer placeringen af de givne subplots, så de passer godt til hinanden i aspektet af den længere dimension. For eksempel, hvis koden har til hensigt en 7 x 3 matrix, passer rækkerne tæt, da rækkedimensionen er længere. Hvis koden har til hensigt en 3 x 7 matrix, passer kolonnerne tæt, med huller i rækkerne, som vist i figurerne i vores hovedkode.

Trin 14: Hovedkoden: Sletning af alle og forespørgsel efter input

Hovedkoden: Sletning af alle og forespørgsel efter input
Hovedkoden: Sletning af alle og forespørgsel efter input

For at starte hovedkoden skal du klikke på den samme knap, der siger "Ny" i øverste venstre hjørne af vinduet, og vælge "Script" i stedet for "Funktion" fra de tidligere sektioner. Indtast koden som vist på billedet i editorvinduet. Kodelinjerne udfører følgende opgaver i rækkefølge:

  1. Luk alle åbne filer undtagen 0, 1 og 2.
  2. Luk alle figurvinduer.
  3. Ryd alle variabler i arbejdsområdet.
  4. Ryd kommandovinduet.
  5. Visning i kommandovinduet: Angiv følgende dimensioner for MR -scanninger:
  6. På en ny linje i kommandovinduet, spørg: Længde af en scanning i milimeter:. Svaret fra brugeren indstilles til variablen "lengthMM".
  7. Spørg på en ny linje: Afstand mellem MR -scanninger i milimeter:. Svaret fra brugeren indstilles til variablen "ZStacks".

Trin 15: Hovedkoden: Batchbehandling af billederne

Hovedkoden: Batchbehandling af billederne
Hovedkoden: Batchbehandling af billederne
Hovedkoden: Batchbehandling af billederne
Hovedkoden: Batchbehandling af billederne

I dette afsnit vil koden indlæse billederne (bestående af MR -scanninger af hjernens tværsnit) og gemme navnene på hver billedfil i variablen "Base" og vise hver af MR -scanninger. Følg venligst med koden på billedet, som gør følgende:

  1. Opret struktur array "BrainImages", der indeholder oplysninger om alle filer i den aktuelle mappe, der passer til navneformatet for MRI _ (). Png
  2. Indstil variabel "NumberofImages" lig med antallet af elementer i strukturmatrixen "BrainImages"
  3. Åbn figurvindue 1
  4. Indstil en for -loop til at gennemgå antallet af billeder, der tælles i filen
  5. For hver sløjfe er "CurrentImage" det respektive navn på hver fil MRI_i-p.webp" />
  6. Generer en 3 x 7 delplot for at vise de 19 billeder, der skal indlæses af "imshow"
  7. Vis hvert billede som et andet element i underplotfigurvinduet
  8. Titel hvert delplot -element som niveau_, hvor tomt er iterationsnummeret for for -løkken.
  9. Afslut for -loop (undgå fejl)

Dette viser i figurvindue 1 alle MR -scanninger i rå form i en 3 x 7 -konfiguration uden huller i x -orienteringen.

Trin 16: Hovedkoden: Polstring

Hovedkoden: Polstring
Hovedkoden: Polstring

Med polstring undgår vi problemet med små uoverensstemmelser i billedstørrelserne, der kan give fejl ved dimensionens uoverensstemmelse, hvis et billede er lidt større end et andet.

  1. Åbn figurvindue 2
  2. Indlæs billedmatrixen fra MRI_1-p.webp" />
  3. Find størrelsen på billedets matrix og indstil til "OriginalXPixels" (for antal rækker) og "OriginalYPixels" (for antal kolonner)
  4. Opsæt matrixen "BrainMat" til at bestå af alle nuller med 20 flere rækker og 20 flere kolonner for hvert plan og 19 samlede tværsnit, en pr. Plan.
  5. Konfigurer "HolesMat" til at bestå af det samme tredimensionale array af nuller til senere at indtaste hulkoordinater
  6. Opret "zeroMat" for at være på størrelse med pad plus tyve rækker og tyve kolonner, et todimensionalt array af nuller.

Trin 17: Hovedkoden: Bestemmelse af grænser

Hovedkoden: Bestemmelse af grænser
Hovedkoden: Bestemmelse af grænser
Hovedkoden: Bestemmelse af grænser
Hovedkoden: Bestemmelse af grænser
  1. Indstil en for loop til at gå igennem dataene fra hvert billede, der er indlæst tidligere
  2. På samme måde som batchbehandling tidligere, indlæser "CurrentImage" filer med "MRI_i.png", hvor i er iterationsnummeret
  3. Kør hvert billede gennem behandlingsfunktionen "LevelCurveTracings2.m", som du lavede tidligere
  4. Find størrelsen på output "Brain", sæt antallet af rækker til "Currentrow" og antallet af kolonner til "Currentcolumns"
  5. Indstil "CurrentMat" til en matrix af nuller med de dimensioner, der er angivet af "Currentrow" og "Currentcolumns"
  6. Centrer dataene fra "Brain" i "CurrentMat" med en margen på 10 rækker på alle sider
  7. Generer en underplot med dimensioner 3 x 7, for at vise billedernes grænser
  8. Titel på hvert af delplotelementerne i figurvinduet
  9. Generer tredimensionel matrix "BrainMat" bestående af hvert grænselag "CurrentMat"
  10. Afslut for -loop (for at undgå fejl)

Underafsnittet efterfylder hullerne i toppen og bunden af den foreslåede tredimensionelle form

  1. Indstil "LevelCurve1" lig med det første lag af "BrainMat" (bunden af fast stof)
  2. Indstil "LevelCurveEnd" lig med det sidste lag af "BrainMat" (øverst på solid)
  3. Overskriv "LevelCurve1" med et udfyldt lag
  4. Overskriv "LevelCurveEnd" med et udfyldt lag
  5. Indstil det udfyldte lag som det nederste lag af "BrainMat"
  6. Indstil det udfyldte lag som det øverste lag af "BrainMat"

Trin 18: Hovedkoden: Bestemmelse af den korrekte Z -dimension

Hovedkoden: Bestemmelse af den korrekte Z -dimension
Hovedkoden: Bestemmelse af den korrekte Z -dimension

De tre første linjer består i at oprette et tomt array "z" og udføre enkle konverteringsoperationer (divider pixel med længde) for at få en korrekt aflæsning af volumen i mm^3

  1. Opret en for -loop for at cykle gennem hvert lag
  2. Find antallet af dem i et givet lag
  3. Konverter z -koordinaterne for dem til værdier, der skaleres til det korrekte forhold, indstillet til "tempz", en kolonnevektor
  4. Tilføj z -værdi for niveaukurven til vektoren z

Med denne z koordinater justeres korrekt.

Trin 19: Hovedkoden: Bestemmelse af X- og Y -koordinater

Hovedkoden: Bestemmelse af X- og Y -koordinater
Hovedkoden: Bestemmelse af X- og Y -koordinater

Nu for at bestemme x- og y -positionerne for hvert af punkterne i grænserne.

  1. Initialiser "xBrain" som et tomt array
  2. Initialiser "yBrain" som et tomt array
  3. Indstil en for loop til at gå gennem hvert indlæste billede
  4. Kompilér en matrix med to kolonner for at gemme de plane koordinater for hvert punkt i bunden, repræsenteret af kolonnevektorerne "RowBrain" og "ColumnBrain"
  5. Tilføj "xBrain" med de aktuelt fundne "RowBrain" -koordinater
  6. Tilføj "yBrain" med de aktuelt fundne "ColumnBrain" -koordinater
  7. Afslut for -loop (for at undgå fejl)

Trin 20: Hovedkoden: Plotte en tredimensionel struktur, finde volumen og logdata

Hovedkoden: Plotte en tredimensionel struktur, finde volumen og logdata
Hovedkoden: Plotte en tredimensionel struktur, finde volumen og logdata
Hovedkoden: Plotte en tredimensionel struktur, finde volumen og logningsdata
Hovedkoden: Plotte en tredimensionel struktur, finde volumen og logningsdata
Hovedkoden: Plotte en tredimensionel struktur, finde volumen og logningsdata
Hovedkoden: Plotte en tredimensionel struktur, finde volumen og logningsdata
Hovedkoden: Plotte en tredimensionel struktur, finde volumen og logningsdata
Hovedkoden: Plotte en tredimensionel struktur, finde volumen og logningsdata

Ved hjælp af funktionen alphaShape vil vi oprette en tredimensionel struktur, hvorfra vi kan beregne hjernens volumen.

  1. Brug funktionen alphaShape, tilslut vektorerne "xBrain", "yBrain" og "z" for x-, y- og z -koordinaterne, og sæt lig med "BrainPolyhedron"
  2. Åbn figurvindue 3
  3. Plot den beregnede alfa -form "BrainPolyhedron", der vises i figurvinduet
  4. Beregn volumen af alfa -formen ved hjælp af en funktion "volumen", der fungerer for alfa -former
  5. Konverter lydstyrken til mm^3
  6. Udskriv mængden af det faste stof i kommandovinduet
  7. Bed om, at et patientnavn skal indstilles som input
  8. Få den aktuelle dato og klokkeslæt med uret, og indstil til "DateandTime"
  9. Opkaldsfunktion "patientFiles" for at logge og plotte de beregnede data

Herfra skal det andet og tredje billede vise de figurer, der dukker op, og det fjerde billede det, der skal vises i kommandovinduet.

Anbefalede: