Innehållsförteckning:

Brain Box: Spårning av neural volym över tid: 20 steg
Brain Box: Spårning av neural volym över tid: 20 steg

Video: Brain Box: Spårning av neural volym över tid: 20 steg

Video: Brain Box: Spårning av neural volym över tid: 20 steg
Video: Joscha Bach Λ John Vervaeke: Sinne, idealism, beräkning 2024, Juli
Anonim
Brain Box: Spårning av neural volym över tid
Brain Box: Spårning av neural volym över tid

Framsteget till gränsen för ett längre mänskligt liv har lett till ökningen av sjukdomar som civilisationer inte sett före vårt. Bland dessa drabbade Alzheimers cirka 5,3 miljoner levande äldre amerikaner 2017, eller cirka 1 av 10 äldre amerikaner (https://www.alz.org/facts/) och otaliga andra med demens. För att hjälpa till i kampen för att förstå vad som drabbar våra äldste, kommer denna kod att utrusta framtida forskare och ivriga nyfikna med förmågan att spåra hjärnvolym över tid.

Steg 1: Använda Brain Box

Använda Brain Box
Använda Brain Box

För att använda hjärnbox behöver man bara följande:

  • MR -skanningar av en hjärna och namn och format på sådana filer (bör alla ha ungefär samma dimensioner)
  • Längd på en skanning
  • Avstånd mellan varje lager (MR -skanning)
  • Patientnamn (inkludera inte mellanslag när du matar in. Var vänlig och versera förnamn och efternamn, till exempel: Förnamn Efternamn)

Och från detta har man förmågan att hålla reda på individers trender i hjärnvolym över tid. Således kan siffror för Alzheimers trender spåras av denna programvara. Längden vi använde i försöket var 180 mm för längden på en skanning och 5 mm för avståndet mellan MR -skanningar, baserat på genomsnittliga siffror.

Tillämpningen av hjärnbox behöver dock inte begränsas till denna enda uppgift. Om tvärsnittet av ett givet fast ämne är fotografi, som en tumör i sig, kan trenderna i volymförändringar för dessa också spåras i programvaran.

Steg 2: Intro: Analysera tvärsnitt

Introduktion: Analysera tvärsnitt
Introduktion: Analysera tvärsnitt

I tredimensionella strukturer skulle de tvådimensionella planen som sådana består av kallas tvärsnitt. Tänk dig att en bunt med papper utgör ett rektangulärt prisma, då skulle varje pappersbit vara ett tvärsnitt av papperet. När vi föreställer oss hjärnan tillämpar vi samma tankesätt. MR (magnetisk resonansavbildning) (se information om MR) fångar hjärnans tvärsnitt och från att använda gränserna definierade i varje "lager" i hjärnan som tillhandahålls kan vi konstruera en struktur för att modellera och hitta hjärnans volym. Vi måste dock först bygga en funktion för att ge information om sådana gränser.

Steg 3: Konfigurera en funktion: LevelCurveTracings.m

Konfigurera en funktion: LevelCurveTracings.m
Konfigurera en funktion: LevelCurveTracings.m
Konfigurera en funktion: LevelCurveTracings.m
Konfigurera en funktion: LevelCurveTracings.m
Konfigurera en funktion: LevelCurveTracings.m
Konfigurera en funktion: LevelCurveTracings.m
Konfigurera en funktion: LevelCurveTracings.m
Konfigurera en funktion: LevelCurveTracings.m

Kontrollera först att din dator har MATLAB_R2017b nedladdad (ladda ner här) och öppna MATLAB. I MATLAB -gränssnittet klickar du på knappen i det övre vänstra hörnet av fönstret där det står "Nytt" med ett fet gult plustecken, och väljer alternativet "funktion" för att öppna ett utrymme i editorfönstret som liknar det i tredje bilden. Vi kommer att fokusera på att ändra den första raden för att konfigurera funktionen. Där det står "outputArg1", ersätt det med "brain", "outputArg2" för att säga "hole", "untitled2" till "exp2" och "inputArg1" till "image" och radera "inputArg2". Du har nu en funktion som ska kallas med hjälp av "exp2", ta ett argument "bild" och sätta gränserna för "hjärna" och "hål". Den första raden i funktionen ska likna linjen som visas på den fjärde bilden. Radera all kod nedanför denna första rad.

Steg 4: Utveckla den bundna algoritmen: Hitta gränser

Utveckla den bundna algoritmen: Hitta gränser
Utveckla den bundna algoritmen: Hitta gränser

Skriv in koden enligt följande under raden. Den här delen av funktionen gör följande rad-för-rad.

  1. Ladda in bilden "bild" i variabeln "mri".
  2. Förvandla "mri" till en bild gjord av värden i ett antal nummer till ettor och nollor (aka binärisering) baserat på ett inställt tröskelvärde. Om värdet i en pixel är lika med eller större än 0,1, sätts det till en, om inte, sätts värdet vid den pixeln till noll.
  3. Följande fyra rader förvandlar 10 kolumner och rader vid kanterna på MR -skanningsskiktet till nollor, för att undvika att läsa felaktiga värden som att göra gränser (som vi lärde oss av att experimentera med koden).
  4. På den sista raden spårar bwboundaries gränserna för den binära bilden "mri" och sätter den lika med "b", en matris med elementen vars index motsvarar gränsvärdena som är inställda på en.

Steg 5: Utveckla den bundna algoritmen: Generera yttre bunden matris

Utveckla den bundna algoritmen: Generera yttre bunden matris
Utveckla den bundna algoritmen: Generera yttre bunden matris

Följ med i redigeringsfönstret med följande kod på bilden. Denna del av koden gör följande rad-för-rad.

  1. Hitta längden på var och en av raderna i den binära bilden "b" (cellfun tillämpar funktionslängden på varje rad).
  2. Ställ in "loc" för att lagra maximala längder.
  3. Hitta indexet för den maximala längden, inställd på att lagra i "grutsteTrace".
  4. Hitta storleken på bilden "mri", som består av samma storlek som "b", och ställ in på "BWsize".
  5. Hitta antalet rader i bildens array, ställ in på "ysize".
  6. Hitta antalet kolumner i bildens array, inställt på "xsize".
  7. Generera matris "grootsteTraceMat", en "ysize" med "xsize" -matris med nollor.
  8. Hitta det ekvivalenta indexet från de subskriberade värdena som motsvarar där de störstaTrace x -värdena och y -värdena var, lagra i vektorn "lindex".
  9. I matrisen med nollor, "grutsteTraceMat", gör elementen vid indexen som motsvarar indexvärden lagrade som element i "lindex" till ettor.

Således har den logiska matrisen "LargestTraceMat" den största avgränsade regionen av det givna hjärnskannatvärsnittet ritat som de med en bakgrund av nollor

Steg 6: Utveckla den bundna algoritmen: Arbeta med mittpunkt

Utveckla den bundna algoritmen: Arbeta med Center Point
Utveckla den bundna algoritmen: Arbeta med Center Point

Därefter måste vi testa om tvärsnittet består av mer än en region (den största). Genom att testa inriktningen av den största regionens centroid kan vi se om det finns en sammanhängande region, vilket skulle ge en mer centrerad centroid eller möjligheten för flera regioner.

  1. Använd "regionProps" för att hitta information om centroiderna som finns, lika med strukturmatrisen "tempStruct"
  2. Formera "centroids" med data från fältet "centroid" sammanfogade vertikalt
  3. Ta de andra kolumnvärdena för "centroids" (de horisontella dimensionskoordinaterna)
  4. Kör ett filter för att kontrollera centroidens inriktning mot den horisontella mitten

Steg 7: Utveckla den bundna algoritmen: När en Centroid inte är centrerad

Utveckla den bundna algoritmen: När en Centroid inte är centrerad
Utveckla den bundna algoritmen: När en Centroid inte är centrerad

I scenariot att centroiden för den största spårregionen inte är centrerad går vi igenom följande steg. Som vi hade observerat i MR -skanningarna var tendensen att få hjärnhalvorna avbildade i tvärsnittet när de inte var sammanhängande, så vi fortsätter nu att plotta det näst största spåret tillsammans med det största spåret i "grutsteTraceMat"

  1. Ställ in den spårade matrisen till en ny variabel "b2"
  2. Initiera tom matris "b2", med en uppsättning indexerad av "loc"
  3. Skapa en villkorlig, för när en centroid inte är centrerad (dvs. ett lager med flera regioner)
  4. Ange en ny spårningsstorlek för varje rad (traceSize2)
  5. Ställ in "loc2" för att hitta index där gränser finns
  6. Låt celler som anges med "loc2" i "b2" vara lika med "grutsteTrace2"
  7. Konvertera prenumerationer till index, inställt på "lindex"
  8. Ändra element som motsvarar "lindex" i "grutsteTraceMat" till 1
  9. Initiera tom matris "b2", med en uppsättning indexerad av "loc2"

Steg 8: Utveckla den bundna algoritmen: störningar av hål

Utveckla den bundna algoritmen: Störningar i hål
Utveckla den bundna algoritmen: Störningar i hål

Vid hantering av hål, de värden som lagras i "b2" höll koll på andra strukturer än det största spåret, och plotta dessa på en fylld form av "grutsteTraceMat" kommer att avslöja var det finns hål i hjärnregionerna.

  1. Skapa matris "filledMat", som är en fylld i form av "LargestTraceMat"
  2. Skapa matris "interferenceMat", en "ysize" med "xsize" array med nollor
  3. Skapa matris "interferenceloc" för att lagra värdena från "b2", sammankopplade vertikalt
  4. Skapa array "lindex" för att lagra index som motsvarar "interferenceloc"
  5. För index i "interferenceMat" som motsvarar "lindex", sätt värdet till 1, vilket gör en annan avgränsad region

Steg 9: Utveckla den bundna algoritmen: lokalisera hål, slutföra hjärngränser och hålgränser

Utveckla den bundna algoritmen: lokalisera hål, slutföra hjärngränser och hålgränser
Utveckla den bundna algoritmen: lokalisera hål, slutföra hjärngränser och hålgränser
  1. Ställ in matris "tempMat" lika med "interferenceMat" plus "filledMat" och lägg till varje värde i matrisen till varandra
  2. Ange array "holesLoc" lika med index där "interferenceMat" och "filledMat" båda var lika med en
  3. Konfigurera "holesMat" som en nollmatris med dimensioner "ysize" x "xsize"
  4. Ange index i "holesMat" som är lika med "holesLoc" som sådana
  5. Ställ in "hjärna" till "grutsteTraceMat"
  6. Ställ in "hål" på "holeMat"

Med fyndet där värdena för de tillsatta matriserna var lika med 2, var hålplatserna enkelt säkrade och ritade på en tom matris.

Steg 10: Loggningsdata: Funktion PatientFiles.m

Loggningsdata: Funktion PatientFiler.m
Loggningsdata: Funktion PatientFiler.m
Loggningsdata: Funktion PatientFiler.m
Loggningsdata: Funktion PatientFiler.m
Loggningsdata: Funktion PatientFiler.m
Loggningsdata: Funktion PatientFiler.m
Loggningsdata: Funktion PatientFiler.m
Loggningsdata: Funktion PatientFiler.m

Ungefär som installationen av den senaste funktionen, klicka på knappen i det övre vänstra hörnet av fönstret där det står "Nytt" med ett fet gult plustecken och välj alternativet "funktion" för att öppna ett utrymme i redigeringsfönstret liknar det på den tredje bilden. På den första raden, ta bort utmatrisen och ersätt med bara "output", ersätt "untitled2" med "patientFiles", ta bort alla inmatningsargument och följ istället den formatering som anges i den fjärde bilden av kodraden. Den första raden i den här funktionen ska matcha bildens formatering.

Steg 11: Logga in data i filer

Logga in data i filer
Logga in data i filer
Logga in data i filer
Logga in data i filer

För att ställa in en fil för att logga data som hittats av huvudfunktionen (som ännu inte ska beskrivas) måste vi följa dessa steg (enligt koden rad för rad).

  1. Kontrollera om input för patientName är en sträng.
  2. Om det inte är en sträng, visa att patientName -ingången ska vara en sträng.
  3. Avsluta if -satsen (förhindra fel).
  4. Skapa ett stränguttalande "DateandTime" som ger följande format: timme: minuter-månad/dag/år.
  5. Ställ in variabel filnamn på följande: patientName.m.

Nu till nästa avsnitt i funktionen: Finns det redan en fil med detta namn?

1) Anta att filen med detta namn redan finns:

  1. Kör filen för att få värdena från det förra köat
  2. Lägg till "DateandTime" -data för den aktuella iterationen som en ny cell i cellmatrisen med x -värden (indexänd+1)
  3. Lägg till det aktuella värdet "brainVolume" som en ny cell i cellmatrisen med y -värden (indexänd+1)
  4. Spara de aktuella variablerna som laddats i filen.

2) Anta att filen med detta namn inte finns:

  1. Skapa en ny fil med namnet lagrat i variabeln "patientnamn"
  2. Lägg till den aktuella "DateandTime" -datan som en cell i den tomma cellmatrisen med x -värden
  3. Lägg till nuvarande "brainVolume" -data som en cell i den tomma cellmatrisen med y -värden
  4. Spara de aktuella variablerna som laddats i filen.

Steg 12: Loggningsdata: Visning av en del hjärnvolym över tid

Loggningsdata: Visar en del hjärnvolym över tid
Loggningsdata: Visar en del hjärnvolym över tid
  1. Konvertera x -värden array (xVals) till en kategorisk array (xValsCategorical), för att tillåta plottning
  2. Skapa figurfönster 5
  3. Plotta punkterna som anges med "xValsCategorical" och "yVals" (innehållande hjärnvolym), använd ihåliga cirklar för att indikera punkter och anslutas med streckade linjer
  4. Titla tomten som: patientName Brain Volume Data
  5. Märk x -axeln enligt bilden
  6. Märk y -axeln enligt bilden
  7. Låt figur 5 vara lika med output

Från detta kommer funktionen patientnamn som anropas att ge en fil med redigerade data som håller koll på hjärnvolymen över tid och en plot som visar trender.

Steg 13: Stänga luckor i delplaner: Subplotclose.m

Stänga luckor i delplaner: Subplotclose.m
Stänga luckor i delplaner: Subplotclose.m

Funktionen, anpassad från kod från https://www.briandalessandro.com, fungerar för att stänga luckorna mellan huvudplottens siffror när figurerna som visar MR -bilderna och hjärnlagren skapas. Delplotfunktionen som används inom subplotclose.m justerar positionen för de givna delplanerna för att passa tätt mot varandra i aspekten av den längre dimensionen. Till exempel, om koden avser en 7 x 3 -matris, passar raderna tätt eftersom raddimensionen är längre. Om koden avser en 3 x 7 matris, passar kolumnerna tätt, med luckor i raderna, som visas i figurerna i vår huvudkod.

Steg 14: Huvudkoden: Rensa allt och be om inmatningar

Huvudkoden: Rensa allt och uppmana till inmatningar
Huvudkoden: Rensa allt och uppmana till inmatningar

För att starta huvudkoden, klicka på samma knapp som säger "Nytt" i det övre vänstra hörnet av fönstret och välj "Skript" istället för "Funktion" från de tidigare avsnitten. Skriv koden som visas på bilden i redigeringsfönstret. Kodraderna utför följande uppgifter i ordning:

  1. Stäng alla öppna filer utom 0, 1 och 2.
  2. Stäng alla figurfönster.
  3. Rensa alla variabler i arbetsytan.
  4. Rensa kommandofönstret.
  5. Visning i kommandofönstret: Ange följande dimensioner för MR -skanningarna:
  6. På en ny rad i kommandofönstret, fråga: Längd på en skanning i milimeter:. Svaret från användaren kommer att ställas in på variabeln "lengthMM".
  7. På en ny rad, fråga: Avståndet mellan MR -skanningar i millimeter:. Svaret från användaren kommer att ställas in på variabeln "ZStacks".

Steg 15: Huvudkoden: Batchbehandling av bilderna

Huvudkoden: Batchbehandling av bilderna
Huvudkoden: Batchbehandling av bilderna
Huvudkoden: Batchbehandling av bilderna
Huvudkoden: Batchbehandling av bilderna

I detta avsnitt kommer koden att ladda upp bilderna (bestående av MR -skanningar av hjärnans tvärsnitt) och lagra namnen på varje bildfil i variabeln "Base" och visa var och en av MR -skanningarna. Följ koden på bilden, som gör följande:

  1. Skapa strukturmatris "BrainImages" som innehåller information om alla filer i den aktuella mappen som passar namnformatet för MRI _ (). Png
  2. Ange variabel "NumberofImages" lika med antalet element i strukturmatrisen "BrainImages"
  3. Öppna figurfönster 1
  4. Ställ in en for loop för att bläddra igenom för antalet bilder som räknas i filen
  5. För varje slinga är "CurrentImage" respektive namn på varje fil MRI_i.png, med iterationsnumret som 'i'
  6. Generera en 3 x 7 delplan för att visa de 19 bilder som ska laddas med "imshow"
  7. Visa varje bild som ett annat element i fönstret för delplottfigur
  8. Benämna varje delplotelement som Level_, där tomt är iterationsnumret för for -slingan.
  9. Avsluta for -loop (undvik fel)

Detta kommer att visa i figurfönster 1 alla MR -skanningar i rå form i en 3 x 7 -konfiguration utan luckor i x -orienteringen.

Steg 16: Huvudkoden: Padding

Huvudkoden: vaddering
Huvudkoden: vaddering

Med vaddering undviker vi problemet med små avvikelser i bildstorlekarna som kan ge fel vid dimensionerande fel om en bild är något större än en annan.

  1. Öppna figurfönster 2
  2. Ladda bildmatrisen från MRI_1-p.webp" />
  3. Hitta storleken på bildens matris och ställ in "OriginalXPixels" (för antal rader) och "OriginalYPixels" (för antal kolumner)
  4. Ställ in matrisen "BrainMat" så att den består av alla nollor med ytterligare 20 rader och ytterligare 20 kolumner för varje plan och 19 totala tvärsnitt, en per plan.
  5. Ställ in "HolesMat" för att bestå av samma tredimensionella uppsättning nollor för att mata in hålkoordinater senare
  6. Skapa "zeroMat" till storleken på plattan plus tjugo rader och tjugo kolumner, en tvådimensionell uppsättning nollor.

Steg 17: Huvudkoden: Fastställande av gränser

Huvudkoden: Bestämma gränser
Huvudkoden: Bestämma gränser
Huvudkoden: Bestämma gränser
Huvudkoden: Bestämma gränser
  1. Ställ in en for loop för att gå igenom data från varje bild som laddades tidigare
  2. På samma sätt för batchbehandling tidigare laddar "CurrentImage" filer med "MRI_i.png", där i är iterationsnumret
  3. Kör varje bild genom bearbetningsfunktionen "LevelCurveTracings2.m" som du gjorde tidigare
  4. Hitta storleken på utgången "Brain", ställ in antalet rader till "Currentrow" och antalet kolumner till "Current columns"
  5. Ställ in "CurrentMat" till en matris med nollor med de dimensioner som anges av "Currentrow" och "Currentcolumns"
  6. Centrera data från "Brain" i "CurrentMat", med en marginal på 10 rader på alla sidor
  7. Generera en delplan med måtten 3 x 7, för att visa gränserna för bilderna
  8. Titelera vart och ett av delplotelementen i figurfönstret
  9. Generera tredimensionell matris "BrainMat" som består av varje gränslager "CurrentMat"
  10. Avsluta for -loop (för att undvika fel)

Delen nedan fyller i hålen kvar på toppen och botten av den föreslagna tredimensionella formen

  1. Ställ in "LevelCurve1" lika med det första lagret av "BrainMat" (botten av solid)
  2. Ställ in "LevelCurveEnd" lika med det sista lagret av "BrainMat" (toppen av solid)
  3. Skriv över "LevelCurve1" med ett ifyllt lager
  4. Skriv över "LevelCurveEnd" med ett fyllt lager
  5. Ställ in det ifyllda lagret som det nedre lagret i "BrainMat"
  6. Ange det ifyllda lagret som det översta lagret av "BrainMat"

Steg 18: Huvudkoden: Bestämning av korrekt Z -dimension

Huvudkoden: Bestämning av korrekt Z -dimension
Huvudkoden: Bestämning av korrekt Z -dimension

De tre första raderna består av att ställa in en tom array "z" och göra enkla konverteringsoperationer (dela pixlar med längd) för att få en korrekt avläsning av volymen i mm^3

  1. Skapa en for -loop för att bläddra igenom varje lager
  2. Hitta antalet enor i ett visst lager
  3. Konvertera z -koordinaterna för dem till värden som skalas till rätt förhållande, inställt på "tempz", en kolumnvektor
  4. Lägg till z -värde för nivåkurvan till vektorn z

Med detta justeras z -koordinaterna ordentligt.

Steg 19: Huvudkoden: Bestämning av X- och Y -koordinater

Huvudkoden: Bestämning av X- och Y -koordinater
Huvudkoden: Bestämning av X- och Y -koordinater

Nu för att bestämma x- och y -positionerna för var och en av punkterna i gränserna.

  1. Initiera "xBrain" som en tom array
  2. Initiera "yBrain" som en tom array
  3. Ställ in en for loop för att gå igenom varje bild som laddas
  4. Kompilera en tvåkolumnmatris för att lagra de plana koordinaterna för varje punkt i gränsen, representerad av kolumnvektorerna "RowBrain" och "ColumnBrain"
  5. Lägg till "xBrain" med de nuvarande "RowBrain" -koordinaterna
  6. Lägg till "yBrain" med de nuvarande "ColumnBrain" -koordinaterna
  7. Avsluta for -slingan (för att undvika fel)

Steg 20: Huvudkoden: Plotta en tredimensionell struktur, hitta volym och logga data

Huvudkoden: Plotta en tredimensionell struktur, hitta volym och logga data
Huvudkoden: Plotta en tredimensionell struktur, hitta volym och logga data
Huvudkoden: Plotta en tredimensionell struktur, hitta volym och logga data
Huvudkoden: Plotta en tredimensionell struktur, hitta volym och logga data
Huvudkoden: Plotta en tredimensionell struktur, hitta volym och logga data
Huvudkoden: Plotta en tredimensionell struktur, hitta volym och logga data
Huvudkoden: Plotta en tredimensionell struktur, hitta volym och logga data
Huvudkoden: Plotta en tredimensionell struktur, hitta volym och logga data

Med funktionen alphaShape kommer vi att skapa en tredimensionell struktur från vilken vi kan beräkna hjärnans volym.

  1. Använd funktionen alphaShape, koppla in vektorerna "xBrain", "yBrain" och "z" för x-, y- och z -koordinaterna och ställ in lika med "BrainPolyhedron"
  2. Öppna figurfönster 3
  3. Plotta den beräknade alfa -formen "BrainPolyhedron", visas i figurfönstret
  4. Beräkna volymen på alfa -formen med en funktion "volym" som fungerar för alfa -former
  5. Konvertera volymen till mm^3
  6. Skriv ut volymen för det fasta i kommandofönstret
  7. Fråga om att ett patientnamn ska anges som en ingång
  8. Få aktuellt datum och tid med klockan och ställ in på "DateandTime"
  9. Anropsfunktionen "patientFiles" för att logga och plotta de beräknade data

Härifrån ska den andra och tredje bilden visa siffrorna som dyker upp, och den fjärde bilden den som ska visas i kommandofönstret.

Rekommenderad: