Съдържание:
- Стъпка 1: Използване на Brain Box
- Стъпка 2: Въведение: Анализ на напречните сечения
- Стъпка 3: Настройване на функция: LevelCurveTracings.m
- Стъпка 4: Разработване на обвързан алгоритъм: Намиране на граници
- Стъпка 5: Разработване на обвързан алгоритъм: Генериране на външен свързан масив
- Стъпка 6: Разработване на обвързан алгоритъм: Работа с Center Point
- Стъпка 7: Разработване на обвързан алгоритъм: Когато центроидът не е центриран
- Стъпка 8: Разработване на обвързан алгоритъм: Интерференция на дупки
- Стъпка 9: Разработване на обвързан алгоритъм: Намиране на дупки, финализиране на мозъчни връзки и дупки
- Стъпка 10: Регистриране на данни: Функция PatientFiles.m
- Стъпка 11: Регистриране на данни във файлове
- Стъпка 12: Регистриране на данни: Показване на график за обем на мозъка във времето
- Стъпка 13: Премахване на пропуските в подсхемите: Subplotclose.m
- Стъпка 14: Основният код: Изчистване на всички и подкана за входове
- Стъпка 15: Основният код: Пакетна обработка на изображенията
- Стъпка 16: Основният код: Подплата
- Стъпка 17: Основният код: Определяне на граници
- Стъпка 18: Основният код: Определяне на правилния Z размер
- Стъпка 19: Основният код: Определяне на X и Y координати
- Стъпка 20: Основният код: Начертаване на триизмерна структура, Намиране на обем и регистриране на данни
Видео: Мозъчна кутия: Проследяване на невронния обем във времето: 20 стъпки
2024 Автор: John Day | [email protected]. Последно модифициран: 2024-01-31 10:17
Напредъкът в границите на по -дългия човешки живот доведе до нарастването на болести, които не са били забелязани от цивилизациите преди нашата. Сред тях болестта на Алцхаймер е засегнала приблизително 5,3 милиона живи възрастни американци през 2017 г. или приблизително 1 на 10 възрастни американци (https://www.alz.org/facts/) и безброй други с деменция. За да помогне в борбата за разбиране на това, което измъчва нашите старейшини, този код ще оборудва бъдещите изследователи и нетърпеливите любопитни с възможността да проследяват обема на мозъка във времето.
Стъпка 1: Използване на Brain Box
За да използвате мозъчната кутия, трябва само следното:
- ЯМР сканиране на мозъка и името и формата на такива файлове (всички трябва да имат приблизително еднакви размери)
- Дължина на едно сканиране
- Разстояние между всеки слой (MRI сканиране)
- Име на пациента (Когато въвеждате, не включвайте интервали и моля, пишете с главни букви името и фамилията, като например: FirstnameLastname)
И от това човек има способността да следи индивидуалните тенденции в обема на мозъка във времето. По този начин цифрите за тенденциите на Алцхаймер могат да бъдат проследени от този софтуер. Дължината, която използвахме в проучването, беше 180 мм за дължина на едно сканиране и 5 мм за разстояние между сканирането с ЯМР, на базата на средните цифри.
Приложението на мозъчната кутия обаче не трябва да се ограничава до тази една задача. Ако напречните сечения на дадено твърдо вещество са фотографирани, като тумор сам по себе си, тенденциите в промените в обема за тях също могат да бъдат проследени в софтуера.
Стъпка 2: Въведение: Анализ на напречните сечения
В триизмерните структури двуизмерните равнини, от които се състоят такива, биха се нарекли напречни сечения. Представете си, че купчина хартии образуват правоъгълна призма, тогава всеки лист хартия би бил напречно сечение на хартията. Когато си представяме мозъка, ние прилагаме същия начин на мислене. ЯМР (магнитен резонанс) (вижте информацията за ЯМР) улавя напречните сечения на мозъка и от използването на границите, определени във всеки "слой" на мозъка, можем да конструираме структура за моделиране и намиране на обема на мозъка. Първо обаче трябва да изградим функция за предоставяне на информация за такива граници.
Стъпка 3: Настройване на функция: LevelCurveTracings.m
Първо се уверете, че на вашия компютър е изтеглен MATLAB_R2017b (изтеглете тук) и отворете MATLAB. В интерфейса на MATLAB щракнете върху бутона в горния ляв ъгъл на прозореца, който казва „Ново“със удебелен жълт знак плюс, и изберете опцията „функция“, за да отворите в прозореца на редактора пространство, което прилича на това в трета снимка. Ще се съсредоточим върху промяната на първия ред, за да настроим функцията. Там, където пише "outputArg1", заменете го с "brain", "outputArg2", за да кажете "дупки", "untitled2" до "exp2" и "inputArg1" към "изображение" и изтрийте "inputArg2". Вече имате функция, която трябва да бъде извикана с помощта на "exp2", като вземете един аргумент "изображение" и изведете границите на "мозъка" и "дупките". Първият ред на функцията трябва да прилича на линията, изобразена на четвъртата картина. Изтрийте целия код под този начален ред.
Стъпка 4: Разработване на обвързан алгоритъм: Намиране на граници
Въведете кода, както следва, под реда. Този раздел на функцията прави следното ред по ред.
- Заредете изображението „image“в променливата „mri“.
- Превърнете "mri" в изображение, направено от стойности в диапазон от числа до единици и нули (известен също като бинаризиране) въз основа на зададена прагова стойност. Ако стойността в пиксел е равна на или по -голяма от 0,1, тя се задава на единица, ако не, стойността в този пиксел е нулева.
- Следващите четири реда превръщат 10 колони и редове по краищата на слоя за сканиране с ЯМР в нули, за да се избегне четенето на неправилни стойности като граници (както е научено от експериментирането с кода).
- В последния ред bwboundaries проследява границите на двоичното изображение "mri" и го задава равно на "b", масив с елементите, чиито индекси съответстват на тези на границите, зададени на единица.
Стъпка 5: Разработване на обвързан алгоритъм: Генериране на външен свързан масив
Следвайте в прозореца на редактора със следния код на снимката. Този раздел на кода прави следното ред по ред.
- Намерете дължината на всеки от редовете на двоичното изображение "b" (cellfun прилага дължината на функцията към всеки ред).
- Задайте "loc", за да съхранявате максималните дължини.
- Намерете индекса на максималната дължина, настроен да се съхранява в "najvećiTrace".
- Намерете размера на изображението „mri“, което се състои от същия размер като „b“, и задайте „BWsize“.
- Намерете броя редове в масива на изображението, зададен на "ysize".
- Намерете броя колони в масива на изображението, зададен на „xsize“.
- Генерирайте масив "najvećiTraceMat", "ysize" от "xsize" матрица от нули.
- Намерете еквивалентния индекс от записаните стойности, съответстващи на мястото, където са били най -големите стойности на Trace x и y, съхранявайте във вектор "lindex".
- В матрицата от нули, "najvećiTraceMat", превърнете елементите в индексите, които съответстват на стойностите на индекса, съхранявани като елементи в "lindex", в единици.
По този начин логическият масив "najvećiTraceMat" има най -голямата ограничена област от даденото напречно сечение на сканиране на мозъка, нанесена като такива с фона на нули
Стъпка 6: Разработване на обвързан алгоритъм: Работа с Center Point
След това трябва да проверим дали напречното сечение се състои от повече от една област (най -голямата). Като тестваме подравняването на центроида на най -големия регион, можем да видим дали има един съседен регион, който би дал по -центриран центроид, или възможността за множество региони.
- Използвайте „regionProps“, за да намерите информация за присъстващите центроиди, зададена равна на структурния масив „tempStruct“
- Формирайте масив "центроиди" с данни от полето "центроид", конкатенирани вертикално
- Вземете стойностите на втората колона на "центроиди" (хоризонталните координати на измерението)
- Пуснете филтър, за да проверите подравняването на центроида към хоризонталния център
Стъпка 7: Разработване на обвързан алгоритъм: Когато центроидът не е центриран
В сценария, че центроидът на най -големия регион на проследяване не е центриран, преминаваме през следните стъпки. Както наблюдавахме при ядрено -магнитен резонанс, тенденцията беше полукълбите на мозъка да бъдат изобразени в напречното сечение, когато не са съседни, така че сега продължаваме да начертаваме втората по големина следа, заедно с най -голямата следа в "najvećiTraceMat"
- Задайте проследената матрица на нова променлива "b2"
- Инициализирайте празна матрица "b2", с набор, индексиран от "loc"
- Създайте условно условие, когато центроидът не е центриран (т.е. слой с множество региони)
- Задайте нов размер на проследяване, който да бъде намерен за всеки ред (traceSize2)
- Задайте "loc2", за да намерите индексите, където има граници
- Нека клетките, посочени от „loc2“в „b2“, да бъдат равни на „najvećiTrace2“
- Преобразувайте индексите в индекси, зададени на "lindex"
- Променете елементите, съответстващи на "lindex" в "najvećiTraceMat" на 1
- Инициализирайте празна матрица "b2", с набор, индексиран от "loc2"
Стъпка 8: Разработване на обвързан алгоритъм: Интерференция на дупки
При справяне с дупки, стойностите, съхранявани в "b2", проследяват структури, различни от най -голямата следа, и нанасянето им върху запълнена форма на "najvećiTraceMat" ще разкрие къде има дупки в мозъчните области.
- Създайте масив „fillMat“, който е попълнен под формата на „najvećiTraceMat“
- Създайте масив "interferenceMat", "ysize" от "xsize" масив от нули
- Създайте масив "interferenceloc", за да съхранявате стойностите от "b2", конкатенирани вертикално
- Създайте масив "lindex", за да съхранявате индексите, които съответстват на "interferenceloc"
- За индекси в "interferenceMat", които съответстват на "lindex", задайте стойност на 1, като направите различна ограничена област
Стъпка 9: Разработване на обвързан алгоритъм: Намиране на дупки, финализиране на мозъчни връзки и дупки
- Задайте масив „tempMat“равен на „interferenceMat“плюс „fillMat“, като по този начин добавите всяка стойност в матрицата един към друг
- Задайте масив "holesLoc" равен на индексите, където "interferenceMat" и "fillMat" и двете са равни на едно
- Настройте „holesMat“като нулева матрица с размери „ysize“x „xsize“
- Задайте индекси в „holesMat“, които са равни на „holesLoc“като единици
- Задайте „мозък“на „най -голямTraceMat“
- Задайте „дупки“на „дупкиMat“
С констатацията, при която стойностите на добавените матрици са равни на 2, местата на отворите лесно се фиксират и се нанасят върху празна матрица.
Стъпка 10: Регистриране на данни: Функция PatientFiles.m
Подобно на настройката на последната функция, щракнете върху бутона в горния ляв ъгъл на прозореца, който казва „Ново“с удебелен жълт знак плюс, и изберете опцията „функция“, за да отворите в прозореца на редактора пространство, което прилича на това на третата снимка. В първия ред изтрийте изходната матрица и я заменете само с „output“, заменете „untitled2“с „пациентски файлове“, изтрийте всички входни аргументи и вместо това следвайте форматирането, посочено в четвъртата картина на реда на кода. Първият ред на тази функция трябва да съответства на форматирането на картината.
Стъпка 11: Регистриране на данни във файлове
За да настроим файл за регистриране на данните, открити от основната функция (тепърва ще бъдат описани), трябва да следваме тези стъпки (както е предписано от кода ред по ред).
- Проверете дали входът за пациент е име на низ.
- Ако това не е низ, покажете, че пациентското име трябва да бъде низ.
- Прекратете оператора if (предотвратяване на грешка).
- Настройте низов израз "DateandTime", който ще даде следния формат: час: минути-месец/ден/година.
- Задайте променлива fileName на следното: пациентName.m.
Сега към следващия раздел на функцията: Съществува ли вече файл с това име?
1) Да предположим, че файлът с това име вече съществува:
- Стартирайте файла, за да получите стойностите от миналото в опашката
- Добавете данните „DateandTime“на текущата итерация като нова клетка в клетъчния масив от x стойности (индекс край+1)
- Добавете текущата стойност "brainVolume" като нова клетка в клетъчния масив от y стойности (индекс край+1)
- Запазете текущите променливи, заредени във файла.
2) Да предположим, че файлът с това име не съществува:
- Създайте нов файл с името, съхранено в променливата "пациент"
- Добавете текущите данни „DateandTime“като клетка в масив от празни клетки от x стойности
- Добавете текущите данни "brainVolume" като клетка в празния масив от стойности на y
- Запазете текущите променливи, заредени във файла.
Стъпка 12: Регистриране на данни: Показване на график за обем на мозъка във времето
- Конвертирайте масива от x стойности (xVals) в категоричен масив (xValsCategorical), за да позволите начертаване
- Генериране на прозорец с фигури 5
- Начертайте точките, обозначени с "xValsCategorical" и "yVals" (съдържащи мозъчен обем), като използвате кухи кръгове, за да посочите точки и да бъдете свързани с пунктирани линии
- Озаглавете сюжета като: пациентНазва Данни за обема на мозъка
- Обозначете оста x, както е показано на снимката
- Маркирайте оста y, както е показано на снимката
- Нека фигура 5 е равна на продукцията
От това извикваната функция пациентName ще даде файл с редактирани данни, проследяващи обема на мозъка във времето, и график, показващ тенденциите.
Стъпка 13: Премахване на пропуските в подсхемите: Subplotclose.m
Функцията, адаптирана от код от https://www.briandalessandro.com, функционира за затваряне на празнините между фигурите на подплота на основния код, когато се създават фигурите, показващи изображенията на ЯМР и слоевете на мозъка. Функцията subplot, използвана в subplotclose.m, коригира позицията на дадените подплоти, така че да се вписват плътно един в друг в аспекта на по -дългото измерение. Например, ако кодът има матрица 7 x 3, редовете ще се поберат плътно, тъй като размерът на реда е по -дълъг. Ако кодът има матрица 3 x 7, колоните ще се поберат плътно, с пропуски в редовете, както е показано на фигурите в нашия основен код.
Стъпка 14: Основният код: Изчистване на всички и подкана за входове
За да стартирате основния код, щракнете върху същия бутон с надпис „Ново“в горния ляв ъгъл на прозореца и изберете „Скрипт“вместо „Функция“от по -ранните раздели. Въведете кода, както е показано на снимката в прозореца на редактора. Редовете на кода изпълняват следните задачи по ред:
- Затворете всички отворени файлове с изключение на 0, 1 и 2.
- Затворете всички прозорци с фигури.
- Изчистете всички променливи в работното пространство.
- Изчистете командния прозорец.
- Показване в командния прозорец: Моля, въведете следните размери за ЯМР сканирането:
- На нов ред в командния прозорец попитайте: Дължина на едно сканиране в милиметри:. Отговорът, зададен от потребителя, ще бъде зададен на променливата "lengthMM".
- На нов ред попитайте: Разстояние между ЯМР сканирането в милиметри:. Отговорът, зададен от потребителя, ще бъде зададен на променливата "ZStacks".
Стъпка 15: Основният код: Пакетна обработка на изображенията
В този раздел кодът ще зареди изображенията (състоящи се от ЯМР сканиране на напречните сечения на мозъка) и ще съхрани имената на всеки файл с изображение в променливата "База" и ще покаже всяко от ЯМР сканирането. Моля, следвайте кода на снимката, който прави следното:
- Създайте структурен масив "BrainImages", който съдържа информация за всички файлове в текущата папка, които отговарят на формата на името на MRI _ (). Png
- Задайте променлива "NumberofImages" равна на броя на елементите в структурния масив "BrainImages"
- Отворете прозорец с фигури 1
- Задайте цикъл for за цикъл за броя на изображенията, преброени във файла
- За всеки цикъл "CurrentImage" е съответното име на всеки файл MRI_i.png, с номера на итерацията като "i"
- Генерирайте подплота 3 x 7, за да покажете 19 -те изображения, които трябва да се заредят от „imshow“
- Показвайте всяко изображение като друг елемент в прозореца на фигурата на подплота
- Озаглавете всеки елемент на подплота като Ниво_, където празно е итерационният номер на цикъла for.
- Прекратете цикъла for (избягване на грешка)
Това ще покаже във прозорец 1 на фигурата всички MRI сканирания в необработен вид в конфигурация 3 x 7 без пропуски в ориентацията x.
Стъпка 16: Основният код: Подплата
С подложката избягваме проблема с леки несъответствия в размерите на изображението, които могат да доведат до грешка при несъответствие на размерите, в случай че една картина е малко по -голяма от друга.
- Отворете прозорец с фигури 2
- Заредете матрицата на изображението от MRI_1-p.webp" />
- Намерете размера на матрицата на изображението и задайте „OriginalXPixels“(за брой редове) и „OriginalYPixels“(за брой колони)
- Настройте матрицата „BrainMat“да се състои от всички нули с още 20 реда и още 20 колони за всяка равнина и 19 общи напречни сечения, по един на равнина.
- Настройте "HolesMat" да се състои от един и същ триизмерен масив от нули за въвеждане на координати на отвора по -късно
- Създайте "zeroMat", за да бъде размерът на подложка плюс двадесет реда и двадесет колони, двуизмерен масив от нули.
Стъпка 17: Основният код: Определяне на граници
- Задайте цикъл for за преминаване през данните от всяко изображение, заредено по -рано
- По същия начин на пакетна обработка по -рано, "CurrentImage" зарежда файлове с "MRI_i.png", където i е номерът на итерацията
- Изпълнете всяко изображение чрез функцията за обработка "LevelCurveTracings2.m", която сте направили по -рано
- Намерете размера на изхода "Brain", задайте броя редове на "Currentrow" и броя на колоните на "Currentcolumns"
- Задайте "CurrentMat" на матрица от нули с размерите, определени от "Currentrow" и "Currentcolumns"
- Центрирайте данните от „Brain“в „CurrentMat“, с поле от 10 реда от всички страни
- Генерирайте подплот с размери 3 x 7, за да покажете границите на изображенията
- Заглавете всеки от елементите на подплота в прозореца на фигурата
- Генерирайте триизмерна матрица "BrainMat", състояща се от всеки граничен слой "CurrentMat"
- Прекратете цикъла for (за избягване на грешки)
Следващият подраздел запълва дупките, оставени в горната и долната част на предложената триизмерна форма
- Задайте "LevelCurve1" равен на първия слой от "BrainMat" (дъното на плътното)
- Задайте „LevelCurveEnd“равен на последния слой на „BrainMat“(отгоре на твърдото тяло)
- Презапишете „LevelCurve1“с попълнен слой
- Презапишете „LevelCurveEnd“с попълнен слой
- Задайте попълнения слой като долния слой на "BrainMat"
- Задайте попълнения слой като най -горния слой на "BrainMat"
Стъпка 18: Основният код: Определяне на правилния Z размер
Първите три реда се състоят от създаване на празен масив "z" и извършване на прости операции за преобразуване (разделяне на пиксели по дължина), за да се получи правилно отчитане на обема в mm^3
- Създайте цикъл for, за да преминете през всеки слой
- Намерете броя на тези в даден слой
- Преобразувайте координатите z за тези в стойности, които са мащабирани до правилното съотношение, зададено на "tempz", вектор на колона
- Добавете z стойност за кривата на нивото към вектора z
С това координатите z се регулират правилно.
Стъпка 19: Основният код: Определяне на X и Y координати
Сега да определим позициите x и y на всяка от точките в границите.
- Инициализирайте "xBrain" като празен масив
- Инициализирайте "yBrain" като празен масив
- Настройте цикъл за цикъл през всяко заредено изображение
- Компилирайте матрица с две колони, за да съхранявате равнинните координати на всяка точка в границата, представена от векторите на колоните "RowBrain" и "ColumnBrain"
- Добавете „xBrain“с текущо намерените координати „RowBrain“
- Добавете „yBrain“с текущо намерените координати „ColumnBrain“
- Прекратете цикъла for (за да избегнете грешка)
Стъпка 20: Основният код: Начертаване на триизмерна структура, Намиране на обем и регистриране на данни
Използвайки функцията alphaShape, ще създадем триизмерна структура, от която можем да изчислим обема на мозъка.
- Използвайте функцията alphaShape, включете векторите "xBrain", "yBrain" и "z" за координатите x, y и z и задайте равни на "BrainPolyhedron"
- Отворете прозорец с фигури 3
- Начертайте изчислената алфа форма "BrainPolyhedron", показана в прозореца на фигурата
- Изчислете обема на алфа формата, като използвате функция "том", която работи за алфа форми
- Преобразувайте силата на звука в mm^3
- Отпечатайте обема на твърдото тяло в командния прозорец
- Поискайте името на пациента да бъде зададено като вход
- Вземете текущата дата и час с часовник и задайте „DateandTime“
- Извикайте функцията „пациентски файлове“, за да регистрирате и начертаете изчислените данни
Оттук втората и третата картина трябва да показват изскачащите цифри, а четвъртата картина тази, която трябва да се покаже в командния прозорец.
Препоръчано:
Превърнете ротационен телефон в радио и пътувайте във времето: 5 стъпки (със снимки)
Превърнете ротационен телефон в радио и пътувайте във времето: Хакнах ротационен телефон в радио! Вземете телефона, изберете държава и десетилетие и слушайте страхотна музика! Как работи Този ротационен телефон има вграден микрокомпютър (Raspberry Pi), който комуникира с radiooooo.com, уеб радио
UWaiPi - Автоматична система за поливане на растенията във времето: 11 стъпки (със снимки)
UWaiPi - Автоматична система за поливане на растения, управлявана във времето: Здравейте! Забравихте ли да поливате вашите растения днес сутринта? Планирате ли ваканция, но мислите кой ще полива растенията? Е, ако отговорите ви са „Да“, тогава имам решение за вашия проблем. Наистина се радвам да ви представя uWaiPi
Показване на влака и времето във Великобритания: 5 стъпки
Показване на влак и прогноза за времето в Обединеното кралство: Тази инструкция е предназначена за излитане на влакове във Великобритания с батерии и дисплей за времето. Той използва базата данни National Rail OpenLDBWS, за да получи информация за отпътуване на влак в реално време за определена местна жп гара и да я покаже. Използва отворена време
Time Cube - Притурка за проследяване на времето на Arduino: 6 стъпки
Time Cube - Притурка за проследяване на времето на Arduino: Бих искал да ви предложа прост, но наистина полезен проект arduino за проследяване на събития във времето, като обърнете някоя интелигентна джаджа с куб. Обърнете го на " Работа " > " Научете " > " Домашни работи " > " Почивка " страна и ще отчита
Показване на времето и времето на Arduino 3 в 1: 11 стъпки
Arduino 3-в-1 дисплей за времето и времето: Харесвам PIC микроконтролерите и харесвам програмирането на асемблер. Всъщност през последните няколко години публикувах около 40 проекта на моя уебсайт въз основа на тази комбинация. Наскоро поръчах някои части от един от любимите ми американски