Innholdsfortegnelse:

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

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

Video: Brain Box: Tracking Neural Volume Over Time: 20 Steps
Video: IQ TEST 2024, November
Anonim
Brain Box: Tracking Neural Volume Over Time
Brain Box: Tracking Neural Volume Over Time

Fremskrittet til grensen til lengre menneskeliv har ført til fremveksten av sykdommer som ikke er sett av sivilisasjoner før vårt. Blant disse påvirket Alzheimer omtrent 5,3 millioner levende eldre amerikanere i 2017, eller omtrent 1 av 10 eldre amerikanere (https://www.alz.org/facts/) og utallige andre med demens. For å hjelpe i kampen for å forstå hva som rammer våre eldste, vil denne koden utstyre fremtidige forskere og ivrige nysgjerrige med evnen til å spore hjernevolum over tid.

Trinn 1: Bruke Brain Box

Bruke Brain Box
Bruke Brain Box

For å bruke hjerneboks trenger man bare følgende:

  • MR -skanning av en hjerne og navn og format på slike filer (skal alle ha omtrent de samme dimensjonene)
  • Lengde på en skanning
  • Avstand mellom hvert lag (MR -skanning)
  • Pasientnavn (Ikke legg inn mellomrom ved innlegging, og bruk store og små bokstaver fornavn og etternavn, for eksempel: Fornavn Etternavn)

Og fra dette har man muligheten til å holde oversikt over individers trender i hjernevolum over tid. Dermed kan tall for Alzheimers trender spores av denne programvaren. Lengden vi brukte i forsøket var 180 mm for lengden på en skanning og 5 mm for avstanden mellom MR -skanninger, basert på gjennomsnittlige tall.

Imidlertid trenger applikasjonen av hjerneboks ikke å være begrenset til denne ene oppgaven. Hvis tverrsnittene av et gitt fast stoff er fotografier, som en svulst i seg selv, kan trendene i volumendringer for disse også spores i programvaren.

Trinn 2: Intro: Analysere tverrsnitt

Intro: Analysere tverrsnitt
Intro: Analysere tverrsnitt

I tredimensjonale strukturer vil de todimensjonale planene som slike består av bli kalt tverrsnitt. Tenk deg at en bunke papir utgjør et rektangulært prisme, så vil hvert stykke papir være et tverrsnitt av papiret. Ved å forestille oss hjernen bruker vi den samme tankegangen. MR (magnetisk resonansavbildning) (se informasjon om MR) fanger tverrsnittene i hjernen, og fra å bruke grensene definert i hvert "lag" i hjernen som tilbys, kan vi konstruere en struktur for å modellere og finne hjernens volum. Vi må imidlertid først bygge en funksjon for å gi informasjon om slike grenser.

Trinn 3: Konfigurere en funksjon: LevelCurveTracings.m

Sette opp en funksjon: LevelCurveTracings.m
Sette opp en funksjon: LevelCurveTracings.m
Sette opp en funksjon: LevelCurveTracings.m
Sette opp en funksjon: LevelCurveTracings.m
Sette opp en funksjon: LevelCurveTracings.m
Sette opp en funksjon: LevelCurveTracings.m
Sette opp en funksjon: LevelCurveTracings.m
Sette opp en funksjon: LevelCurveTracings.m

Først må du kontrollere at datamaskinen har MATLAB_R2017b lastet ned (last ned her) og åpne MATLAB. I MATLAB -grensesnittet klikker du på knappen i øvre venstre hjørne av vinduet som sier "nytt" med et sterkt gult pluss -tegn, og velger alternativet "funksjon" for å åpne et mellomrom i redigeringsvinduet som ligner det i tredje bildet. Vi vil fokusere på å endre den første linjen for å sette opp funksjonen. Der det står "outputArg1", erstatt det med "brain", "outputArg2" for å si "hull", "untitled2" til "exp2" og "inputArg1" til "image", og slett "inputArg2". Du har nå en funksjon som skal kalles ved å bruke "exp2", ta ett argument "image" og sette grensene for "hjerne" og "hull". Den første linjen i funksjonen skal ligne linjen som er avbildet i det fjerde bildet. Slett all koden under denne første linjen.

Trinn 4: Utvikle den bundne algoritmen: Finne grenser

Utvikling av den bundne algoritmen: Finne grenser
Utvikling av den bundne algoritmen: Finne grenser

Skriv inn koden som følger under linjen. Denne delen av funksjonen gjør følgende linje for linje.

  1. Last inn bildet "image" i variabelen "mri".
  2. Gjør "mri" til et bilde laget av verdier i en rekke tall til ener og nuller (aka binærisering) basert på en angitt terskelverdi. Hvis verdien i en piksel er lik eller større enn 0,1, er den satt til en, hvis ikke, er verdien på den pikslen satt til null.
  3. De følgende fire linjene gjør 10 kolonner og rader i kantene på MR -skannelaget til nuller, for å unngå å lese feil verdier som å gjøre grenser (som vi har lært ved å eksperimentere med koden).
  4. På den siste linjen sporer bwboundaries grensene for det binære bildet "mri" og setter det lik "b", en matrise med elementene hvis indekser tilsvarer grensene som er satt til ett.

Trinn 5: Utvikle den bundne algoritmen: Generere ytre bundet matrise

Utvikling av bundet algoritme: Generering av ytre bundet matrise
Utvikling av bundet algoritme: Generering av ytre bundet matrise

Følg med i redigeringsvinduet med følgende kode på bildet. Denne delen av koden gjør følgende linje for linje.

  1. Finn lengden på hver av radene i det binære bildet "b" (cellfun bruker funksjonslengden til hver rad).
  2. Sett "loc" for å lagre maksimal lengder.
  3. Finn indeksen for maksimal lengde, satt til å lagre i "LargestTrace".
  4. Finn størrelsen på bildet "mri", som består av samme størrelse som "b", og sett til "BWsize".
  5. Finn antall rader i bildens matrise, sett til "ysize".
  6. Finn antall kolonner i bildens matrise, satt til "xsize".
  7. Generer matrisen "grutsteTraceMat", en "ysize" av "xsize" matrise av nuller.
  8. Finn ekvivalentindeksen fra de abonnerte verdiene som tilsvarer der de størsteTrace x -verdiene og y -verdiene var, lagre i vektoren "lindex".
  9. I matrisen med nuller, "grutsteTraceMat", gjør du elementene ved indeksene som tilsvarer indeksverdier lagret som elementer i "lindex" til en.

Dermed har den logiske matrisen "LargestTraceMat" det største avgrensede området av det gitte hjerneskannertverrsnittet plottet som de med et bakteppe av nuller

Trinn 6: Utvikle den bundne algoritmen: Arbeide med senterpunkt

Utvikling av den bundne algoritmen: Arbeide med senterpunkt
Utvikling av den bundne algoritmen: Arbeide med senterpunkt

Deretter må vi teste for å se om tverrsnittet består av mer enn ett område (det største). Ved å teste justeringen av den største regionens sentroid, kan vi se om det er en sammenhengende region, som vil gi en mer sentrert sentroid, eller muligheten for flere regioner.

  1. Bruk "regionProps" for å finne informasjon om sentroidene som er tilstede, satt til strukturen "tempStruct"
  2. Form array "centroids" med data fra feltet "centroid" sammenkoblet vertikalt
  3. Ta den andre kolonneverdiene til "sentroider" (de horisontale dimensjonskoordinatene)
  4. Kjør et filter for å kontrollere justeringen av sentroiden til det horisontale senteret

Trinn 7: Utvikle den bundne algoritmen: Når en sentroid ikke er sentrert

Utvikling av den bundne algoritmen: Når en sentroid ikke er sentrert
Utvikling av den bundne algoritmen: Når en sentroid ikke er sentrert

I scenariet om at centroiden til den største sporregionen ikke er sentrert, går vi gjennom følgende trinn. Som vi hadde observert i MR -skanningene, var tendensen å ha hjernehalvdeler avbildet i tverrsnittet når de ikke var sammenhengende, så vi fortsetter nå å plotte det nest største sporet sammen med det største sporet i "grutsteTraceMat"

  1. Sett den spores matrisen til en ny variabel "b2"
  2. Initialiser tom matrise "b2", med et sett indeksert av "loc"
  3. Lag en betinget, for når en sentroid ikke er sentrert (dvs. et lag med flere regioner)
  4. Angi en ny sporestørrelse for hver rad (traceSize2)
  5. Sett "loc2" for å finne indeksene der grenser er tilstede
  6. La celler spesifisert med "loc2" i "b2" være lik "grutsteTrace2"
  7. Konverter abonnementene til indekser, satt til "lindex"
  8. Endre elementer som tilsvarer "lindex" i "LargestTraceMat" til 1
  9. Initialiser tom matrise "b2", med et sett indeksert av "loc2"

Trinn 8: Utvikle den bundne algoritmen: Interferens av hull

Utvikling av den bundne algoritmen: Interferens av hull
Utvikling av den bundne algoritmen: Interferens av hull

Ved håndtering av hull holdt verdiene lagret i "b2" oversikt over andre strukturer enn det største sporet, og plottingen av disse på en fylt form av "grutsteTraceMat" vil avsløre hvor det er hull i hjernegruppene.

  1. Lag matrise "filledMat", som er en fylt i form av "LargestTraceMat"
  2. Lag matrisen "interferenceMat", en "ysize" av "xsize" matrisen med nuller
  3. Lag matrise "interferenceloc", for å lagre verdiene fra "b2", sammenkoblet vertikalt
  4. Lag array "lindex" for å lagre indeksene som tilsvarer "interferenceloc"
  5. For indekser i "interferenceMat" som tilsvarer "lindex", sett verdien til 1, noe som gjør et annet avgrenset område

Trinn 9: Utvikle den bundne algoritmen: Finne hull, fullføre hjernegrenser og hullgrenser

Utvikling av den bundne algoritmen: Lokalisering av hull, fullføring av hjernegrenser og hullgrenser
Utvikling av den bundne algoritmen: Lokalisering av hull, fullføring av hjernegrenser og hullgrenser
  1. Sett matrisen "tempMat" lik "interferenceMat" pluss "filledMat", og legg dermed hver verdi i matrisen til hverandre
  2. Sett matrisen "holesLoc" lik indeksene der "interferenceMat" og "filledMat" begge var lik en
  3. Sett opp "holesMat" som en nullmatrise med dimensjonene "ysize" x "xsize"
  4. Sett indekser i "holesMat" som er lik "holesLoc" som de
  5. Sett "hjerne" til "grutsteTraceMat"
  6. Sett "hull" til "hullmat"

Med funnet hvor verdiene til de tilsatte matrisene var lik 2, ble hullplasseringene lett sikret og plottet på en tom matrise.

Trinn 10: Loggdata: Funksjon PatientFiles.m

Loggdata: Funksjon PatientFiles.m
Loggdata: Funksjon PatientFiles.m
Loggdata: Funksjon PatientFiles.m
Loggdata: Funksjon PatientFiles.m
Loggdata: Funksjon PatientFiles.m
Loggdata: Funksjon PatientFiles.m
Loggdata: Funksjon PatientFiles.m
Loggdata: Funksjon PatientFiles.m

I likhet med oppsettet av den siste funksjonen, klikker du på knappen i øvre venstre hjørne av vinduet som sier "Ny" med et sterkt gult pluss -tegn, og velger alternativet "funksjon" for å åpne et mellomrom i redigeringsvinduet ligner det på det tredje bildet. På den første linjen, slett utmatrisen og erstatt med bare "output", erstatt "untitled2" med "patientFiles", slett alle inputargumentene, og følg i stedet formateringen som er angitt i det fjerde bildet av kodelinjen. Den første linjen i denne funksjonen skal matche formateringen av bildet.

Trinn 11: Logge data i filer

Logge data i filer
Logge data i filer
Logge data i filer
Logge data i filer

For å sette opp en fil for å logge dataene som er funnet av hovedfunksjonen (som ikke skal beskrives), må vi følge disse trinnene (som foreskrevet av koden linje for linje).

  1. Sjekk om input for patientName er en streng.
  2. Hvis det ikke er en streng, må du vise at pasientnavn -input skal være en streng.
  3. Avslutt if -setningen (forhindre feil).
  4. Sett opp en strengsetning "DateandTime" som vil gi følgende format: time: minutter-måned/dag/år.
  5. Sett variabel filnavn til følgende: pasientnavn.m.

Nå til neste del av funksjonen: Finnes det allerede en fil med dette navnet?

1) Anta at filen med dette navnet allerede eksisterer:

  1. Kjør filen for å få verdiene fra tidligere i kø
  2. Legg til "DateandTime" -dataene for den gjeldende iterasjonen som en ny celle i cellearrayen med x -verdier (indeksenden+1)
  3. Legg til den nåværende "brainVolume" -verdien som en ny celle i cellearrayet med y -verdier (indeksenden+1)
  4. Lagre de nåværende variablene som er lastet inn i filen.

2) Anta at filen med dette navnet ikke eksisterer:

  1. Lag en ny fil med navnet lagret i variabelen "pasientnavn"
  2. Legg til gjeldende "DateandTime" -data som en celle i det tomme cellearrayet med x -verdier
  3. Legg til gjeldende "brainVolume" -data som en celle i det tomme cellearrayet med y -verdier
  4. Lagre de nåværende variablene som er lastet inn i filen.

Trinn 12: Loggdata: Visning av en plott av hjernevolum over tid

Loggingsdata: Viser en plott av hjernevolum over tid
Loggingsdata: Viser en plott av hjernevolum over tid
  1. Konverter x -verdier -arrayet (xVals) til et kategorisk array (xValsCategorical), for å tillate plotting
  2. Generer figurvindu 5
  3. Plott punktene angitt med "xValsCategorical" og "yVals" (som inneholder hjernevolum), ved hjelp av hule sirkler for å indikere punkter og for å være forbundet med stiplete linjer
  4. Tittel plottet som: patientName Brain Volume Data
  5. Merk x -aksen som vist på bildet
  6. Merk y -aksen som vist på bildet
  7. La figur 5 være lik utgang

Fra dette vil funksjonen pasientnavn som blir kalt, gi en fil med redigerte data som holder styr på hjernevolum over tid, og et plott som viser trender.

Trinn 13: Lukking av hull i delplott: Subplotclose.m

Lukking av hull i delplott: Subplotclose.m
Lukking av hull i delplott: Subplotclose.m

Funksjonen, tilpasset fra kode fra https://www.briandalessandro.com, fungerer for å lukke hullene mellom delplottfigurene til hovedkoden, når figurene som viser MR -bildene og hjernelagene opprettes. Subplot -funksjonen som brukes i subplotclose.m justerer posisjonen til de gitte subplotene slik at de passer godt til hverandre i aspektet av den lengre dimensjonen. For eksempel, hvis koden har til hensikt en 7 x 3 -matrise, vil radene passe godt ettersom raddimensjonen er lengre. Hvis koden har til hensikt en 3 x 7 matrise, vil kolonnene passe godt, med hull i radene, som vist i figurene i vår hovedkode.

Trinn 14: Hovedkoden: Fjern alle og be om innspill

Hovedkoden: Fjern alle og be om innspill
Hovedkoden: Fjern alle og be om innspill

For å starte hovedkoden, klikk på den samme knappen som sier "Ny" i øvre venstre hjørne av vinduet, og velg "Skript" i stedet for "Funksjon" fra de tidligere seksjonene. Skriv inn koden som vist på bildet i redigeringsvinduet. Kodelinjene gjør følgende oppgaver i rekkefølge:

  1. Lukk alle åpne filer unntatt 0, 1 og 2.
  2. Lukk alle figurvinduer.
  3. Fjern alle variabler i arbeidsområdet.
  4. Fjern kommandovinduet.
  5. Vis i kommandovinduet: Skriv inn følgende dimensjoner for MR -skanningene:
  6. På en ny linje i kommandovinduet, spør: Lengde på en skanning i milimeter:. Svaret som legges inn av brukeren vil bli satt til variabelen "lengthMM".
  7. På en ny linje, spør: Avstand mellom MR -skanninger i millimeter:. Svaret som legges inn av brukeren vil bli satt til variabelen "ZStacks".

Trinn 15: Hovedkoden: Batchbehandling av bildene

Hovedkoden: Batchbehandling av bildene
Hovedkoden: Batchbehandling av bildene
Hovedkoden: Batchbehandling av bildene
Hovedkoden: Batchbehandling av bildene

I denne delen vil koden laste opp bildene (bestående av MR -skanninger av tverrsnittene i hjernen) og lagre navnene på hver bildefil i variabelen "Base" og vise hver av MR -skanningene. Følg med koden på bildet, som gjør følgende:

  1. Lag strukturmatrise "BrainImages" som inneholder informasjon om alle filene i den nåværende mappen som passer til navneformatet til MRI _ (). Png
  2. Sett variabel "NumberofImages" lik antall elementer i strukturmatrisen "BrainImages"
  3. Åpne figurvindu 1
  4. Sett en for -løkke for å bla gjennom for antall bilder som telles i filen
  5. For hver sløyfe er "CurrentImage" det respektive navnet på hver fil MRI_i.png, med iterasjonsnummeret som 'i'
  6. Lag en tomt på 3 x 7 for å vise de 19 bildene som skal lastes inn av "imshow"
  7. Vis hvert bilde som et annet element i delplottfigurvinduet
  8. Tittel hvert delplot -element som Nivå_, der tomt er iterasjonstallet for for -løkken.
  9. Slutt for -løkken (unngå feil)

Dette vil vise i figurvindu 1 alle MR -skanningene i rå form i en 3 x 7 -konfigurasjon uten hull i x -retningen.

Trinn 16: Hovedkoden: Polstring

Hovedkoden: Polstring
Hovedkoden: Polstring

Med polstring unngår vi problemet med små avvik i bildestørrelsene som kan gi feil ved dimensjonsforskjell i tilfelle at ett bilde er litt større enn et annet.

  1. Åpne figurvindu 2
  2. Last inn bildematrisen fra MRI_1-p.webp" />
  3. Finn størrelsen på bildets matrise og sett til "OriginalXPixels" (for antall rader) og "OriginalYPixels" (for antall kolonner)
  4. Sett opp matrisen "BrainMat" for å bestå av alle nuller med 20 flere rader og 20 flere kolonner for hvert plan, og 19 totale tverrsnitt, en per plan.
  5. Sett opp "HolesMat" for å bestå av den samme tredimensjonale gruppen med nuller for å legge inn hullkoordinater senere
  6. Lag "zeroMat" til størrelsen på puten pluss tjue rader og tjue kolonner, et todimensjonalt utvalg av nuller.

Trinn 17: Hovedkoden: Bestemmelse av grenser

Hovedkoden: Bestemmelse av grenser
Hovedkoden: Bestemmelse av grenser
Hovedkoden: Bestemmelse av grenser
Hovedkoden: Bestemmelse av grenser
  1. Sett en for loop for å gå gjennom dataene fra hvert bilde som er lastet inn tidligere
  2. På samme måte som batchbehandling tidligere, laster "CurrentImage" opp filer med "MRI_i.png", hvor i er iterasjonstallet
  3. Kjør hvert bilde gjennom behandlingsfunksjonen "LevelCurveTracings2.m" som du har laget tidligere
  4. Finn størrelsen på utgangen "Brain", sett antall rader til "Currentrow" og antall kolonner til "Currentcolumns"
  5. Sett "CurrentMat" til en matrise med nuller med dimensjonene angitt av "Currentrow" og "Currentcolumns"
  6. Sentrer dataene fra "Brain" i "CurrentMat", med en margin på 10 rader på alle sider
  7. Lag en delplott med dimensjoner 3 x 7, for å vise grensene for bildene
  8. Tittel på hvert av delplotelementene i figurvinduet
  9. Generer tredimensjonal matrise "BrainMat" som består av hvert grenselag "CurrentMat"
  10. Avslutt for -løkken (for å unngå feil)

Delen nedenfor fyller hullene igjen øverst og nederst i den foreslåtte tredimensjonale formen

  1. Sett "LevelCurve1" lik det første laget av "BrainMat" (bunnen av solid)
  2. Sett "LevelCurveEnd" lik det siste laget av "BrainMat" (toppen av solid)
  3. Overskrive "LevelCurve1" med et fylt lag
  4. Overskrive "LevelCurveEnd" med et fylt lag
  5. Sett det utfylte laget som det nederste laget av "BrainMat"
  6. Sett det utfylte laget som det øverste laget av "BrainMat"

Trinn 18: Hovedkoden: Bestemmelse av riktig Z -dimensjon

Hovedkoden: Bestemmelse av riktig Z -dimensjon
Hovedkoden: Bestemmelse av riktig Z -dimensjon

De tre første linjene består av å sette opp et tomt array "z", og gjøre enkle konverteringsoperasjoner (dele piksler med lengde) for å få en riktig avlesning av volum i mm^3

  1. Lag en for -løkke for å bla gjennom hvert lag
  2. Finn antall en i et gitt lag
  3. Konverter z -koordinatene for de til verdier som skaleres til riktig forhold, satt til "tempz", en kolonnevektor
  4. Legg til z -verdi for nivåkurven til vektoren z

Med dette er z -koordinatene justert riktig.

Trinn 19: Hovedkoden: Bestemmelse av X- og Y -koordinater

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

Nå for å bestemme x- og y -posisjonene til hvert av punktene i grensene.

  1. Initialiser "xBrain" som en tom matrise
  2. Initialiser "yBrain" som en tom matrise
  3. Sett opp en for loop for å gå gjennom hvert bilde som er lastet inn
  4. Kompiler en to -kolonne matrise for å lagre de plane koordinatene til hvert punkt i grensen, representert med kolonnevektorene "RowBrain" og "ColumnBrain"
  5. Legg til "xBrain" med de nåværende "RowBrain" -koordinatene
  6. Legg til "yBrain" med de nåværende "ColumnBrain" -koordinatene
  7. Avslutt for -løkken (for å unngå feil)

Trinn 20: Hovedkoden: Plotte en tredimensjonal struktur, finne volum og loggdata

Hovedkoden: Plotte en tredimensjonal struktur, finne volum og loggdata
Hovedkoden: Plotte en tredimensjonal struktur, finne volum og loggdata
Hovedkoden: Plotte en tredimensjonal struktur, finne volum og loggdata
Hovedkoden: Plotte en tredimensjonal struktur, finne volum og loggdata
Hovedkoden: Plotte en tredimensjonal struktur, finne volum og loggdata
Hovedkoden: Plotte en tredimensjonal struktur, finne volum og loggdata
Hovedkoden: Plotte en tredimensjonal struktur, finne volum og loggdata
Hovedkoden: Plotte en tredimensjonal struktur, finne volum og loggdata

Ved å bruke funksjonen alphaShape, vil vi lage en tredimensjonal struktur som vi kan beregne volumet av hjernen fra.

  1. Bruk funksjonen alphaShape, plugg inn vektorene "xBrain", "yBrain" og "z" for x-, y- og z -koordinatene, og sett lik "BrainPolyhedron"
  2. Åpne figurvindu 3
  3. Plott den beregnede alfa -formen "BrainPolyhedron", som vises i figurvinduet
  4. Beregn volumet til alfa -formen ved å bruke en funksjon "volum" som fungerer for alfa -former
  5. Konverter volumet til mm^3
  6. Skriv ut volumet på det faste stoffet i kommandovinduet
  7. Be om at et pasientnavn skal angis som inndata
  8. Få gjeldende dato og klokkeslett med klokken, og sett til "DateandTime"
  9. Ring funksjonen "patientFiles" for å logge og plotte dataene som er beregnet

Herfra skal det andre og tredje bildet vise figurene som dukker opp, og det fjerde bildet det som skal vises i kommandovinduet.

Anbefalt: