INHOUDSOPGAWE:
- Stap 1: Gebruik Brain Box
- Stap 2: Inleiding: Ontleding van dwarssnitte
- Stap 3: Die opstel van 'n funksie: LevelCurveTracings.m
- Stap 4: Ontwikkel die gebonde algoritme: vind grense
- Stap 5: Ontwikkel die gebonde algoritme: die opbou van 'n buitenste gebind reeks
- Stap 6: Ontwikkel die gebonde algoritme: werk met middelpunt
- Stap 7: Ontwikkel die gebonde algoritme: as 'n sentroïed nie gesentreer is nie
- Stap 8: Ontwikkel die gebonde algoritme: inmenging van gate
- Stap 9: Die ontwikkeling van die gebonde algoritme: die opspoor van gate, die afronding van breingrense en gatgrense
- Stap 10: Teken data: Funksie PatientFiles.m
- Stap 11: Teken data in lêers aan
- Stap 12: Logboekdata: vertoon 'n stuk breinvolume oor tyd
- Stap 13: Maak gapings in subplotte toe: Subplotclose.m
- Stap 14: die hoofkode: alles uitvee en vra vir insette
- Stap 15: Die hoofkode: bondelverwerking van die beelde
- Stap 16: Die hoofkode: opvulling
- Stap 17: Die hoofkode: Bepaling van grense
- Stap 18: Die hoofkode: Bepaling van die korrekte Z -dimensie
- Stap 19: Die Hoofkode: Bepaling van X- en Y -koördinate
- Stap 20: Die hoofkode: 'n driedimensionele struktuur opstel, volume vind en logboekdata vind
2025 Outeur: John Day | [email protected]. Laas verander: 2025-01-23 12:53
Die opmars na die grens van 'n langer menselewe het die opkoms van siektes na vore gebring wat nie deur die beskawings voor ons gesien is nie. Onder hierdie het Alzheimer in 2017 ongeveer 5,3 miljoen lewende bejaarde Amerikaners geraak, of ongeveer 1 uit 10 bejaarde Amerikaners (https://www.alz.org/facts/) en talle ander met demensie. Om te help in die stryd om te verstaan wat ons ouere manne teister, sal hierdie kode toekomstige navorsers en nuuskieriges toerus met die vermoë om die volume van die brein mettertyd op te spoor.
Stap 1: Gebruik Brain Box
Om 'n breinkas te gebruik, benodig u slegs die volgende:
- MRI -skanderings van 'n brein en die naam en formaat van sulke lêers (moet almal ongeveer dieselfde afmetings hê)
- Lengte van een skandering
- Afstand tussen elke laag (MRI -skandering)
- Pasiëntnaam (moenie spasies by die invoer insluit nie, en gebruik hoof- en vannaam in hoofletters, soos volg: Voornaam Achternaam)
En hieruit het u die vermoë om mettertyd tred te hou met die neigings van individue in die breinvolume. Dus kan syfers vir Alzheimer -neigings deur hierdie sagteware opgespoor word. Die lengte wat ons in die proef gebruik het, was 180 mm vir die lengte van een skandering en 5 mm vir die afstand tussen MRI -skanderings, gebaseer op die gemiddelde syfers.
Die toepassing van breinkas hoef egter nie tot hierdie een taak beperk te word nie. As die deursnee van 'n gegewe vaste stof 'n foto is, soos 'n tumor op sigself, kan die neigings in volumeveranderinge ook in die sagteware opgespoor word.
Stap 2: Inleiding: Ontleding van dwarssnitte
In driedimensionele strukture word die tweedimensionele vlakke waaruit sulke bestaan, deursnee genoem. Stel jou voor dat 'n stapel papier 'n reghoekige prisma uitmaak, dan is elke stuk papier 'n deursnit van die papier. By die verbeelding van die brein pas ons dieselfde denkwyse toe. MRI (magnetiese resonansie beelding) (sien inligting oor MRI) vang die dwarssnit van die brein vas, en deur die grense wat in elke 'laag' van die brein verskaf word, te gebruik, kan ons 'n struktuur bou om die volume van die brein te modelleer en te vind. Ons moet egter eers 'n funksie bou om inligting oor sulke grense te verskaf.
Stap 3: Die opstel van 'n funksie: LevelCurveTracings.m
Maak eers seker dat u rekenaar MATLAB_R2017b afgelaai het (laai hier af) en maak MATLAB oop. Klik in die MATLAB -koppelvlak op die knoppie in die linker boonste hoek van die venster met die naam "nuut" met 'n vet geel plusteken, en kies die opsie "funksie" om in die redakteurvenster 'n spasie oop te maak wat in die venster lyk. derde prentjie. Ons sal fokus op die verandering van die eerste reël om die funksie op te stel. Waar dit sê "outputArg1", vervang dit met "brain", "outputArg2" om "gate", "untitled2" tot "exp2" en "inputArg1" na "image" te sê, en verwyder "inputArg2". U het nou 'n funksie om genoem te word met behulp van 'exp2', met een argument 'beeld' en die grense van 'brein' en 'gate' uiteengesit word. Die eerste reël van die funksie moet lyk soos die lyn in die vierde prentjie. Vee al die kode onder hierdie aanvanklike reël uit.
Stap 4: Ontwikkel die gebonde algoritme: vind grense
Tik die kode soos volg onder die reël in. Hierdie afdeling van die funksie doen die volgende reël vir reël.
- Laai die beeld "beeld" in die veranderlike "mri".
- Verander "mri" in 'n beeld wat bestaan uit waardes in 'n reeks getalle na eenhede en nulle (aka binariserend) gebaseer op 'n vasgestelde drempelwaarde. As die waarde in 'n pixel gelyk is aan of groter as 0,1, word dit op een gestel, indien nie, word die waarde op die pixel op nul gestel.
- Die volgende vier reëls verander 10 kolomme en rye aan die kante van die MRI -skanderinglaag in nulle, om te voorkom dat onbehoorlike waardes as perke geplaas word (soos geleer deur te eksperimenteer met die kode).
- In die laaste reël volg bwgrense die grense van die binarized beeld "mri" en stel dit gelyk aan "b", 'n skikking met die elemente waarvan die indekse ooreenstem met die van die grense wat op een gestel is.
Stap 5: Ontwikkel die gebonde algoritme: die opbou van 'n buitenste gebind reeks
Volg in die redakteurvenster met die volgende kode op die foto. Hierdie afdeling van die kode doen die volgende reël vir reël.
- Vind die lengte van elk van die rye van die binarized beeld "b" (cellfun pas die funksielengte toe op elke ry).
- Stel "loc" in om die maksimum lengtes op te slaan.
- Vind die indeks van die maksimum lengte, gestoor om op te slaan in "LargestTrace".
- Vind die grootte van die beeld "mri", wat uit dieselfde grootte as "b" bestaan, en stel dit op "BWsize".
- Vind die aantal rye in die skikking van die prent, gestel op "ysize".
- Vind die aantal kolomme in die skikking van die prent, ingestel op "xsize".
- Genereer skikking "grootsteTraceMat", 'n "ysize" by "xsize" matriks van nulle.
- Soek die ekwivalente indeks uit die onderskrewe waardes wat ooreenstem met waar die grootste Trace x -waardes en y -waardes was, stoor in die vektor "lindex".
- In die matriks van nulle, "LargestTraceMat", verander die elemente by die indekse wat ooreenstem met indekswaardes wat as elemente in "lindex" gestoor is, in eenhede.
So het die logiese skikking "grootsteTraceMat" die grootste begrensde gebied van die gegewe breinskandering -deursnit wat as 'n agtergrond van nulle geteken is
Stap 6: Ontwikkel die gebonde algoritme: werk met middelpunt
Vervolgens moet ons toets of die deursnit uit meer as een gebied (die grootste) bestaan. Deur die belyning van die sentroïde van die grootste streek te toets, kan ons sien of daar een aangrensende gebied is, wat 'n meer gesentreerde sentroïde kan oplewer, of die moontlikheid van meerdere streke.
- Gebruik "regionProps" om inligting te vind oor die teenwoordige sentroïede, gelyk aan die struktuurreeks "tempStruct"
- Vorm skikking "centroids" met data uit die veld "centroid" vertikaal saamgevoeg
- Neem die tweede kolomwaardes van "centroids" (die horisontale afmetings koördinate)
- Begin 'n filter om die belyning van die sentroïed na die horisontale middelpunt te kontroleer
Stap 7: Ontwikkel die gebonde algoritme: as 'n sentroïed nie gesentreer is nie
In die scenario dat die sentroïde van die grootste spoorgebied nie gesentreer is nie, gaan ons deur die volgende stappe. Soos ons in die MRI -skanderings waargeneem het, was die neiging om hemisfere van die brein in die dwarssnit te laat verskyn as dit nie aaneenlopend was nie, dus gaan ons nou voort om die tweede grootste spoor saam met die grootste spoor in "grootsteTraceMat" te teken
- Stel die opgespoorde matriks op 'n nuwe veranderlike "b2"
- Initialiseer leë matriks "b2", met 'n stel geïndekseer deur "loc"
- Skep 'n voorwaardelike, vir wanneer 'n sentroïde nie gesentreer is nie (dit wil sê 'n veelvoudige streeklaag)
- Stel 'n nuwe spoorgrootte in vir elke ry (traceSize2)
- Stel "loc2" in om die indekse te vind waar grense voorkom
- Laat selle gespesifiseer deur "loc2" in "b2" gelyk wees aan "grootsteTrace2"
- Skakel die onderskrifte om in indekse, ingestel op "lindex"
- Verander elemente wat ooreenstem met "lindex" in "LargestTraceMat" na 1
- Initialiseer leë matriks "b2", met 'n stel geïndekseer deur "loc2"
Stap 8: Ontwikkel die gebonde algoritme: inmenging van gate
By die hantering van gate hou die waardes wat in "b2" gestoor is, tred met ander strukture as die grootste spoor, en om dit op 'n gevulde vorm van "grutsteTraceMat" in te teken, sal onthul waar daar gate in die breinstreke is.
- Skep 'n skikking "gevulde mat", wat in die vorm van "grootsteTraceMat" is
- Skep skikking "interferenceMat", 'n "ysize" deur "xsize" skikking van nulle
- Skep skikking "interferenceloc" om die waardes van "b2" op te slaan, vertikaal saamgevoeg
- Skep skikking "lindex" om die indekse wat ooreenstem met "interferenceloc" te stoor
- Stel vir waarde in "interferenceMat" wat ooreenstem met "lindex" waarde op 1 en maak 'n ander begrensde gebied
Stap 9: Die ontwikkeling van die gebonde algoritme: die opspoor van gate, die afronding van breingrense en gatgrense
- Stel skikking "tempMat" gelyk aan "interferenceMat" plus "filledMat", en voeg dus elke waarde in die matriks bymekaar
- Stel skikking "holesLoc" gelyk aan die indekse waar beide "interferenceMat" en "filledMat" gelyk is aan een
- Stel "holesMat" op as 'n nulmatriks van afmetings "ysize" x "xsize"
- Stel indekse in "holesMat" wat gelyk is aan "holesLoc" as een
- Stel 'brein' op 'grootsteTraceMat'
- Stel "gate" op "holesMat"
Met die bevinding dat die waardes van die bygevoegde matrikse gelyk is aan 2, is die gate maklik vasgemaak en op 'n leë matriks geteken.
Stap 10: Teken data: Funksie PatientFiles.m
Net soos die opstel van die laaste funksie, klik op die knoppie in die linker boonste hoek van die venster met die naam "Nuut" met 'n vet geel plusteken, en kies die opsie "funksie" om 'n spasie in die redakteurvenster oop te maak lyk soos in die derde prentjie. In die eerste reël, verwyder die uitsetmatriks en vervang met slegs "uitvoer", vervang "ontiteld2" met "patientFiles", verwyder alle invoerargumente en volg in plaas daarvan die opmaak wat in die vierde prentjie van die kodereël gespesifiseer is. Die eerste reël van hierdie funksie moet ooreenstem met die opmaak van die prent.
Stap 11: Teken data in lêers aan
Om 'n lêer op te stel om die data wat deur die hooffunksie gevind word, aan te meld (moet nog beskryf word), moet ons hierdie stappe volg (soos voorgeskryf deur die kode reël-vir-reël).
- Kontroleer of die invoer vir patientName 'n string is.
- As dit nie 'n string is nie, vertoon dat die pasiëntnaam -invoer 'n string moet wees.
- Beëindig die if -stelling (voorkom fout).
- Stel 'n stringverklaring "DateandTime" op wat die volgende formaat sal gee: uur: minute-maand/dag/jaar.
- Stel veranderlike lêernaam op die volgende: patientName.m.
Nou na die volgende afdeling van die funksie: Bestaan daar al 'n lêer met hierdie naam?
1) Gestel die lêer met hierdie naam bestaan reeds:
- Begin die lêer om die waardes uit die verlede in die ry te kry
- Voeg die "DateandTime" -data van die huidige iterasie by as 'n nuwe sel in die selreeks van x -waardes (indeks -einde+1)
- Voeg die huidige "brainVolume" waarde by as 'n nuwe sel in die selreeks van y waardes (indeks einde+1)
- Stoor die huidige veranderlikes wat in die lêer gelaai is.
2) Gestel die lêer met hierdie naam bestaan nie:
- Skep 'n nuwe lêer met die naam wat in die veranderlike 'patientName' gestoor is
- Voeg die huidige "DateandTime" -data as 'n sel by die leë selreeks met x -waardes
- Voeg die huidige "brainVolume" -data as 'n sel by die leë selreeks van y -waardes
- Stoor die huidige veranderlikes wat in die lêer gelaai is.
Stap 12: Logboekdata: vertoon 'n stuk breinvolume oor tyd
- Skakel die x -waardes -skikking (xVals) om in 'n kategoriese skikking (xValsCategorical) om plotte moontlik te maak
- Genereer figuurvenster 5
- Teken die punte aangedui deur "xValsCategorical" en "yVals" (wat breinvolume bevat), met behulp van hol sirkels om punte aan te dui en met stippellyne verbind te word
- Titel die plot as: patientName Breinvolumegegevens
- Benoem die x -as soos in die prentjie getoon
- Benoem die y -as soos in die prent getoon
- Laat figuur 5 gelyk aan uitset
Hieruit sal die funksie patientName wat genoem word, 'n lêer oplewer met bewerkte data wat die breinvolume mettertyd byhou, en 'n plot met tendense.
Stap 13: Maak gapings in subplotte toe: Subplotclose.m
Die funksie, aangepas uit die kode van https://www.briandalessandro.com, funksioneer om die gapings tussen die subplotfigure van die hoofkode te sluit wanneer die figure wat die MRI -beelde en die breinlae vertoon, geskep word. Die subplotfunksie wat in subplotclose gebruik word.m pas die posisie van die gegewe subplotte aan om mekaar styf te pas in die aspek van die langer dimensie. Byvoorbeeld, as die kode 'n 7 x 3 -matriks bedoel, pas die rye styf, aangesien die riddimensie langer is. As die kode 'n 3 x 7 -matriks beoog, pas die kolomme styf, met gapings in die rye, soos in die figure van ons hoofkode vertoon.
Stap 14: die hoofkode: alles uitvee en vra vir insette
Om die hoofkode te begin, klik op dieselfde knoppie wat "Nuut" in die linker boonste hoek van die venster sê, en kies "Script" in plaas van "Funksie" uit die vorige afdelings. Tik die kode soos op die prentjie in die redakteurvenster. Die reëls kode doen die volgende take in volgorde:
- Sluit alle oop lêers behalwe 0, 1 en 2.
- Maak alle figuurvensters toe.
- Maak alle veranderlikes in die werkruimte skoon.
- Maak die opdragvenster skoon.
- Vertoon in die opdragvenster: Voer die volgende afmetings in vir die MRI -skanderings:
- Vra op 'n nuwe reël in die opdragvenster: Lengte van een skandering in milimeters:. Die antwoord wat die gebruiker ingedien het, sal ingestel word op die veranderlike "lengthMM".
- Vra op 'n nuwe reël: Afstand tussen MRI -skanderings in milimeters:. Die reaksie wat die gebruiker ingedien het, sal ingestel word op die veranderlike "ZStacks".
Stap 15: Die hoofkode: bondelverwerking van die beelde
In hierdie afdeling laai die kode die beelde (bestaande uit die MRI -skanderings van die deursnit van die brein) en stoor die name van elke beeldlêer in die veranderlike "Base" en vertoon elkeen van die MRI -skanderings. Volg die kode op die foto, wat die volgende doen:
- Skep struktuurskikking "BrainImages" wat inligting bevat oor alle lêers in die huidige vouer wat pas by die naamformaat van MRI _ (). Png
- Stel veranderlike "NumberofImages" gelyk aan die aantal elemente in die struktuur array "BrainImages"
- Maak figuurvenster 1 oop
- Stel 'n for -lus in om deur te loop vir die aantal beelde wat in die lêer getel word
- Vir elke lus is "CurrentImage" die onderskeie naam van elke lêer MRI_i.png, met die iterasie nommer as 'i'
- Genereer 'n a 3 x 7 subplot om die 19 beelde wat deur "imshow" gelaai moet word, te vertoon
- Vertoon elke prent as 'n ander element in die subplot -figuurvenster
- Benoem elke subplot -element as Vlak_, waar leeg die iterasiegetal van die for -lus is.
- Beëindig die for -lus (vermy fout)
Dit sal in figuurvenster 1 al die MRI -skanderings in rou vorm vertoon in 'n 3 x 7 -opset sonder gapings in die x -oriëntasie.
Stap 16: Die hoofkode: opvulling
Met opvulling vermy ons die geringe afwykings in die beeldgroottes wat foute kan veroorsaak as die afmetings nie ooreenstem nie, in die geval dat die een prentjie effens groter is as die ander.
- Oop figuur venster 2
- Laai die beeldmatriks van MRI_1-p.webp" />
- Vind die grootte van die prent se matriks en stel dit in "OriginalXPixels" (vir aantal rye) en "OriginalYPixels" (vir aantal kolomme)
- Stel die matriks "BrainMat" op om te bestaan uit alle nulle met nog 20 rye en nog 20 kolomme vir elke vlak, en 19 totale deursnee, een per vlak.
- Stel 'HolesMat' op om uit dieselfde driedimensionele reeks nulle te bestaan om later koördinate in te voer
- Skep "zeroMat" in grootte van die pad plus twintig rye en twintig kolomme, 'n tweedimensionele reeks nulle.
Stap 17: Die hoofkode: Bepaling van grense
- Stel 'n for -lus in om deur die data van elke prent wat vroeër gelaai is, te gaan
- Op dieselfde wyse as vroeë groepverwerking, laai "CurrentImage" lêers met "MRI_i.png", waar i die iterasie nommer is
- Begin elke prent deur die verwerkingsfunksie "LevelCurveTracings2.m" wat u vroeër gemaak het
- Vind die grootte van die uitvoer "Brein", stel die aantal rye op "Currentrow" en die aantal kolomme na "Current columns"
- Stel "CurrentMat" op 'n matriks van nulle met die afmetings gespesifiseer deur "Currentrow" en "Current columns"
- Sentreer die data van "Brein" in "CurrentMat", met 'n marge van 10 rye aan alle kante
- Genereer 'n subplot van afmetings 3 x 7 om die grense van die beelde te vertoon
- Titel elk van die subplot -elemente in die figuurvenster
- Genereer driedimensionele matriks "BrainMat" wat bestaan uit elke grenslaag "CurrentMat"
- Beëindig die for -lus (om foute te vermy)
Die onderafdeling vul die gate aan die bokant en onderkant van die voorgestelde driedimensionele vorm in
- Stel 'LevelCurve1' gelyk aan die eerste laag 'BrainMat' (onderkant van vaste stof)
- Stel "LevelCurveEnd" gelyk aan die finale laag van "BrainMat" (bokant van soliede)
- Oerskryf "LevelCurve1" met 'n ingevulde laag
- Oerskryf "LevelCurveEnd" met 'n ingevulde laag
- Stel die ingevulde laag in as die onderste laag van "BrainMat"
- Stel die ingevulde laag as die boonste laag van "BrainMat"
Stap 18: Die hoofkode: Bepaling van die korrekte Z -dimensie
Die eerste drie reëls bestaan uit die opstel van 'n leë skikking "z", en eenvoudige omskakelingsbewerkings (verdeel pixels deur lengte) om 'n behoorlike meting van volume in mm^3 te kry
- Skep 'n for -lus om deur elke laag te blaai
- Vind die aantal in 'n gegewe laag
- Skakel die z -koördinate vir die ene om in waardes wat na die regte verhouding geskaal word, ingestel op "tempz", 'n kolomvektor
- Voeg z -waarde vir die vlakkromme by die vektor z
Hiermee word z -koördinate behoorlik aangepas.
Stap 19: Die Hoofkode: Bepaling van X- en Y -koördinate
Nou om die x- en y -posisies van elk van die punte in die grense te bepaal.
- Initialiseer "xBrain" as 'n leë skikking
- Begin "yBrain" as 'n leë skikking
- Stel 'n for -lus op om deur elke gelaaide prent te loop
- Stel 'n matriks van twee kolomme saam om die vlak koördinate van elke punt in die grens op te slaan, voorgestel deur die kolomvektore "RowBrain" en "ColumnBrain"
- Voeg 'xBrain' by met die koördinate wat tans 'RowBrain' gevind word
- Voeg "yBrain" by met die koördinate van die "ColumnBrain" wat tans gevind word
- Beëindig die for -lus (om foute te vermy)
Stap 20: Die hoofkode: 'n driedimensionele struktuur opstel, volume vind en logboekdata vind
Deur die funksie alphaShape te gebruik, sal ons 'n driedimensionele struktuur skep waaruit ons die volume van die brein kan bereken.
- Gebruik funksie alphaShape, steek die vektore "xBrain", "yBrain" en "z" in vir die x-, y- en z -koördinate en stel gelyk aan "BrainPolyhedron"
- Oop figuur venster 3
- Teken die berekende alfa -vorm "BrainPolyhedron", vertoon in die figuurvenster
- Bereken die volume van die alfa -vorm met behulp van 'n funksie "volume" wat vir alfa -vorms werk
- Skakel die volume om na mm^3
- Druk die volume van die vaste stof in die opdragvenster af
- Vra dat 'n pasiëntnaam as invoer ingestel moet word
- Kry die huidige datum en tyd met die klok en stel dit in op "DateandTime"
- Bel funksie "patientFiles" om die berekende data aan te teken en te teken
Van hier af moet die tweede en derde prentjie die figure wys wat verskyn, en die vierde prentjie wat in die opdragvenster vertoon moet word.
Aanbeveel:
RGB -klok om kinders te leer oor tyd: 4 stappe
RGB -klok om kinders oor tyd te leer: Gisteraand het ek 'n idee gekry hoe ek my vyfjarige kan help om 'n tydsberekening te kry. is gewoonlik 'n bietjie gemors en amper nooit in orde nie
MicroPython-program: Werk data oor koronavirussiekte (COVID-19) in reële tyd op: 10 stappe (met foto's)
MicroPython-program: Werk data oor koronavirussiekte (COVID-19) in real-time op: Die afgelope paar weke het die aantal bevestigde gevalle van koronavirussiekte (COVID 19) wêreldwyd meer as 100,000 oorskry, en die wêreldgesondheidsorganisasie (WGO) het verklaar dat 'n nuwe uitbraak van koronavirus -longontsteking is 'n wêreldwye pandemie. Ek was baie
Neurale netwerk -aangedrewe planetarium met behulp van Python, elektron en Keras: 8 stappe
Neurale netwerk -aangedrewe planetarium met behulp van Python, elektron en Keras: In hierdie instruksies sal ek u wys hoe ek 'n outomatiese 3D -planetariumopwekker met behulp van Python en elektron geskryf het. Die video hierbo toon een van die ewekansige planetariums wat die program gegenereer het. ** Let op: Hierdie program is geensins perfek nie en op een of ander plek
Dra geluid oor op 'n laser oor: 8 stappe
Oordrag van klank op 'n laser: Dit is 'n netjiese projek wat ek ongeveer 'n maand gelede opgetel het. Dit is 'n eenvoudige projek waarmee u klank kan oordra oor 'n ruimte op lig met min kwaliteitverlies. Die krediet van hierdie projek gaan hier
Omskep (net oor) enige mediabestand gratis (net oor) enige ander medialêer !: 4 stappe
Skakel (net oor) enige mediabestand gratis na (net oor) enige ander medialêer !: My eerste instruksie, juig! Ek was in elk geval op Google op soek na 'n gratis program wat my Youtube.flv -lêers kon omskakel na 'n formaat wat is meer universeel, soos.wmv of.mov.Ek het ontelbare forums en webwerwe gesoek en toe 'n program gekry met die naam