สารบัญ:

Brain Box: การติดตามปริมาณประสาทเมื่อเวลาผ่านไป: 20 ขั้นตอน
Brain Box: การติดตามปริมาณประสาทเมื่อเวลาผ่านไป: 20 ขั้นตอน

วีดีโอ: Brain Box: การติดตามปริมาณประสาทเมื่อเวลาผ่านไป: 20 ขั้นตอน

วีดีโอ: Brain Box: การติดตามปริมาณประสาทเมื่อเวลาผ่านไป: 20 ขั้นตอน
วีดีโอ: อะไรเอ่ย #สิว #สิวอุดตัน #สิวอักเสบ #สิวเห่อ #รอยสิว #รักษาสิว #เล็บเท้า #satisfying 2024, พฤศจิกายน
Anonim
Brain Box: การติดตามปริมาณประสาทเมื่อเวลาผ่านไป
Brain Box: การติดตามปริมาณประสาทเมื่อเวลาผ่านไป

การก้าวเข้าสู่พรมแดนของชีวิตมนุษย์ที่ยืนยาวได้ก่อให้เกิดโรคภัยไข้เจ็บที่อารยธรรมของเราไม่เคยเห็นมาก่อน ในจำนวนนี้ โรคอัลไซเมอร์ส่งผลกระทบต่อผู้สูงอายุชาวอเมริกันประมาณ 5.3 ล้านคนในปี 2560 หรือประมาณ 1 ใน 10 คนสูงอายุชาวอเมริกัน (https://www.alz.org/facts/) และผู้ป่วยโรคสมองเสื่อมอีกนับไม่ถ้วน เพื่อช่วยในการต่อสู้เพื่อทำความเข้าใจว่าอะไรคือความทุกข์ของผู้เฒ่าผู้แก่ของเรา รหัสนี้จะช่วยให้นักวิจัยในอนาคตและอยากรู้อยากเห็นด้วยความสามารถในการติดตามปริมาณสมองเมื่อเวลาผ่านไป

ขั้นตอนที่ 1: การใช้ Brain Box

การใช้ Brain Box
การใช้ Brain Box

ในการใช้กล่องสมอง ต้องการสิ่งต่อไปนี้เท่านั้น:

  • MRI สแกนสมองและชื่อและรูปแบบของไฟล์ดังกล่าว (ควรมีขนาดใกล้เคียงกันทั้งหมด)
  • ความยาวของการสแกนหนึ่งครั้ง
  • ระยะห่างระหว่างแต่ละชั้น (MRI scan)
  • ชื่อผู้ป่วย (เมื่อป้อนข้อมูล ห้ามเว้นวรรค และโปรดใช้ชื่อและนามสกุล เช่น: FirstnameLastname)

และจากนี้ บุคคลหนึ่งมีความสามารถในการติดตามแนวโน้มของบุคคลในปริมาตรของสมองเมื่อเวลาผ่านไป ดังนั้นซอฟต์แวร์นี้จึงสามารถติดตามตัวเลขแนวโน้มของโรคอัลไซเมอร์ได้ ความยาวที่เราใช้ในการทดลองคือ 180 มม. สำหรับความยาวของการสแกนหนึ่งครั้ง และ 5 มม. สำหรับระยะห่างระหว่างการสแกนด้วย MRI โดยอิงจากตัวเลขเฉลี่ย

อย่างไรก็ตาม การประยุกต์ใช้ Brain Box ไม่จำเป็นต้องจำกัดอยู่เพียงงานเดียว หากภาพตัดขวางของของแข็งที่กำหนดเป็นภาพถ่าย เช่น เนื้องอก แนวโน้มของการเปลี่ยนแปลงของปริมาตรสำหรับสิ่งเหล่านี้ก็สามารถติดตามได้ในซอฟต์แวร์เช่นกัน

ขั้นตอนที่ 2: บทนำ: การวิเคราะห์ข้ามส่วน

บทนำ: การวิเคราะห์ภาคตัดขวาง
บทนำ: การวิเคราะห์ภาคตัดขวาง

ในโครงสร้างสามมิติ ระนาบสองมิติที่ประกอบขึ้นด้วยนั้นจะเรียกว่าภาคตัดขวาง ลองนึกภาพว่ากองกระดาษเป็นปริซึมสี่เหลี่ยม จากนั้นกระดาษแต่ละแผ่นจะเป็นหน้าตัดของกระดาษ ในการจินตนาการถึงสมอง เราใช้แนวความคิดเดียวกัน MRI (การถ่ายภาพด้วยคลื่นสนามแม่เหล็ก) (ดูข้อมูลเกี่ยวกับ MRI) จับภาพตัดขวางของสมอง และจากการใช้ขอบเขตที่กำหนดไว้ในแต่ละ "ชั้น" ของสมองที่จัดเตรียมไว้ เราสามารถสร้างโครงสร้างเพื่อสร้างแบบจำลองและหาปริมาตรของสมองได้. เราต้องสร้างฟังก์ชันเพื่อให้ข้อมูลเกี่ยวกับขอบเขตดังกล่าวก่อน

ขั้นตอนที่ 3: การตั้งค่าฟังก์ชัน: LevelCurveTracings.m

การตั้งค่าฟังก์ชัน: LevelCurveTracings.m
การตั้งค่าฟังก์ชัน: LevelCurveTracings.m
การตั้งค่าฟังก์ชัน: LevelCurveTracings.m
การตั้งค่าฟังก์ชัน: LevelCurveTracings.m
การตั้งค่าฟังก์ชัน: LevelCurveTracings.m
การตั้งค่าฟังก์ชัน: LevelCurveTracings.m
การตั้งค่าฟังก์ชัน: LevelCurveTracings.m
การตั้งค่าฟังก์ชัน: LevelCurveTracings.m

ขั้นแรก ตรวจสอบให้แน่ใจว่าคอมพิวเตอร์ของคุณดาวน์โหลด MATLAB_R2017b แล้ว (ดาวน์โหลดที่นี่) และเปิด MATLAB ในอินเทอร์เฟซ MATLAB คลิกที่ปุ่มที่มุมซ้ายบนของหน้าต่างที่ระบุว่า "ใหม่" พร้อมเครื่องหมายบวกสีเหลืองตัวหนา และเลือกตัวเลือก "ฟังก์ชัน" เพื่อเปิดช่องว่างในหน้าต่างตัวแก้ไขที่คล้ายกับใน ภาพที่สาม เราจะเน้นที่การเปลี่ยนบรรทัดแรกเพื่อตั้งค่าฟังก์ชัน ตำแหน่งที่ระบุว่า "outputArg1" ให้แทนที่ด้วย "brain", "outputArg2" เพื่อพูดว่า "holes", "untitled2" เป็น "exp2" และ "inputArg1" เป็น "image" และลบ "inputArg2" ตอนนี้คุณมีฟังก์ชันที่จะเรียกใช้โดยใช้ "exp2" โดยใช้อาร์กิวเมนต์ "image" หนึ่งอาร์กิวเมนต์ และแสดงขอบเขตของ "สมอง" และ "รู" บรรทัดแรกของฟังก์ชันควรคล้ายกับเส้นที่แสดงในภาพที่สี่ ลบโค้ดทั้งหมดด้านล่างบรรทัดเริ่มต้นนี้

ขั้นตอนที่ 4: การพัฒนา Bound Algorithm: Finding Bounds

การพัฒนา Bound Algorithm: Finding Bounds
การพัฒนา Bound Algorithm: Finding Bounds

พิมพ์รหัสตามด้านล่างบรรทัด ส่วนนี้ของฟังก์ชันทำหน้าที่ต่อไปนี้ทีละบรรทัด

  1. โหลดรูปภาพ "image" ลงในตัวแปร "mri"
  2. เปลี่ยน "mri" ให้เป็นรูปภาพที่สร้างจากค่าต่างๆ ในช่วงตัวเลขเป็นหนึ่งและศูนย์ (aka binarizing) ตามค่าเกณฑ์ที่ตั้งไว้ หากค่าในพิกเซลเท่ากับหรือมากกว่า 0.1 ค่านั้นจะถูกตั้งค่าเป็นหนึ่ง หากไม่มี ค่าที่พิกเซลนั้นจะถูกตั้งค่าเป็นศูนย์
  3. สี่บรรทัดต่อไปนี้จะเปลี่ยน 10 คอลัมน์และแถวที่ขอบของเลเยอร์การสแกน MRI ให้เป็นศูนย์ เพื่อหลีกเลี่ยงการอ่านค่าที่ไม่เหมาะสมเป็นการสร้างขอบเขต (ตามที่เรียนรู้จากการทดลองกับโค้ด)
  4. ในบรรทัดสุดท้าย bwboundaries ติดตามขอบเขตของภาพไบนารี "mri" และตั้งค่าให้เท่ากับ "b" ซึ่งเป็นอาร์เรย์ที่มีองค์ประกอบซึ่งดัชนีตรงกับขอบเขตที่กำหนดเป็นหนึ่ง

ขั้นตอนที่ 5: การพัฒนา Bound Algorithm: การสร้าง Outer Bound Array

การพัฒนา Bound Algorithm: การสร้าง Outer Bound Array
การพัฒนา Bound Algorithm: การสร้าง Outer Bound Array

ทำตามในหน้าต่างตัวแก้ไขด้วยรหัสต่อไปนี้ในรูปภาพ โค้ดส่วนนี้ใช้บรรทัดต่อบรรทัดต่อไปนี้

  1. ค้นหาความยาวของแต่ละแถวของภาพไบนารี "b" (cellfun ใช้ความยาวของฟังก์ชันกับแต่ละแถว)
  2. ตั้งค่า "loc" เพื่อจัดเก็บความยาวสูงสุด
  3. ค้นหาดัชนีความยาวสูงสุด ตั้งค่าให้จัดเก็บใน "largestTrace"
  4. ค้นหาขนาดของรูปภาพ "mri" ซึ่งประกอบด้วยขนาดเดียวกับ "b" และตั้งค่าเป็น "BWsize"
  5. ค้นหาจำนวนแถวในอาร์เรย์ของรูปภาพ ตั้งค่าเป็น "ysize"
  6. ค้นหาจำนวนคอลัมน์ในอาร์เรย์ของรูปภาพ ตั้งค่าเป็น "xsize"
  7. สร้างอาร์เรย์ "largestTraceMat" ซึ่งเป็นเมทริกซ์ "ysize" โดย "xsize" เป็นศูนย์
  8. ค้นหาดัชนีที่เทียบเท่าจากค่าที่ห้อยลงมาซึ่งสอดคล้องกับตำแหน่งที่ใหญ่ที่สุดของค่า x และค่า y จัดเก็บในเวกเตอร์ "lindex"
  9. ในเมทริกซ์ของศูนย์ "largestTraceMat" ให้เปลี่ยนองค์ประกอบที่ดัชนีที่สอดคล้องกับค่าดัชนีที่เก็บไว้เป็นองค์ประกอบใน "lindex" เป็นองค์ประกอบ

ดังนั้น อาร์เรย์แบบลอจิคัล "largestTraceMat" จึงมีขอบเขตขอบเขตที่ใหญ่ที่สุดของส่วนตัดขวางของการสแกนสมองที่กำหนดซึ่งถูกพล็อตเป็นพื้นที่ที่มีฉากหลังเป็นศูนย์

ขั้นตอนที่ 6: การพัฒนา Bound Algorithm: การทำงานกับ Center Point

การพัฒนา Bound Algorithm: การทำงานกับ Center Point
การพัฒนา Bound Algorithm: การทำงานกับ Center Point

ต่อไปเราต้องทดสอบเพื่อดูว่าภาคตัดขวางประกอบด้วยมากกว่าหนึ่งภูมิภาคหรือไม่ (ที่ใหญ่ที่สุด) โดยการทดสอบการจัดตำแหน่งของเซนทรอยด์ที่ใหญ่ที่สุดของภูมิภาค เราจะเห็นได้ว่ามีพื้นที่ต่อเนื่องกันหรือไม่ ซึ่งจะทำให้ได้เซนทรอยด์ที่มีศูนย์กลางมากกว่า หรือความเป็นไปได้ของภูมิภาคต่างๆ

  1. ใช้ "regionProps" เพื่อค้นหาข้อมูลเกี่ยวกับเซนทรอยด์ที่มีอยู่ ตั้งค่าให้เท่ากับอาร์เรย์โครงสร้าง "tempStruct"
  2. จัดรูปแบบอาร์เรย์ "centroids" ด้วยข้อมูลจากฟิลด์ "centroid" ที่ต่อกันในแนวตั้ง
  3. รับค่าคอลัมน์ที่สองของ "centroids" (พิกัดมิติแนวนอน)
  4. เรียกใช้ตัวกรองเพื่อตรวจสอบการจัดตำแหน่งของเซนทรอยด์กับศูนย์กลางแนวนอน

ขั้นตอนที่ 7: การพัฒนาอัลกอริธึมที่ถูกผูกไว้: เมื่อ Centroid ไม่อยู่ตรงกลาง

การพัฒนา Bound Algorithm: เมื่อ Centroid ไม่อยู่ตรงกลาง
การพัฒนา Bound Algorithm: เมื่อ Centroid ไม่อยู่ตรงกลาง

ในสถานการณ์สมมติที่เซนทรอยด์ของขอบเขตการติดตามที่ใหญ่ที่สุดไม่ได้อยู่ตรงกลาง เราทำตามขั้นตอนต่อไปนี้ ดังที่เราสังเกตได้จากการสแกนด้วย MRI แนวโน้มที่จะมีซีกโลกของสมองแสดงเป็นภาพตัดขวางเมื่อไม่อยู่ติดกัน ดังนั้นตอนนี้เราจึงยังคงวางแผนการติดตามที่ใหญ่เป็นอันดับสองพร้อมกับร่องรอยที่ใหญ่ที่สุดใน "largestTraceMat"

  1. ตั้งค่าเมทริกซ์ที่ติดตามเป็นตัวแปรใหม่ "b2"
  2. เริ่มต้นเมทริกซ์ว่าง "b2" ด้วยชุดที่จัดทำดัชนีโดย "loc"
  3. สร้างเงื่อนไข สำหรับเมื่อเซนทรอยด์ไม่อยู่ตรงกลาง (เช่น เลเยอร์หลายขอบเขต)
  4. กำหนดขนาดการติดตามใหม่ที่จะพบสำหรับแต่ละแถว (traceSize2)
  5. ตั้งค่า "loc2" เพื่อค้นหาดัชนีที่มีขอบเขต
  6. ให้เซลล์ที่ระบุโดย "loc2" ใน "b2" เท่ากับ "largestTrace2"
  7. แปลงตัวห้อยเป็นดัชนี ตั้งค่าเป็น "lindex"
  8. เปลี่ยนองค์ประกอบที่สอดคล้องกับ "lindex" ใน "largestTraceMat" เป็น 1
  9. เริ่มต้นเมทริกซ์ว่าง "b2" ด้วยชุดที่จัดทำดัชนีโดย "loc2"

ขั้นตอนที่ 8: การพัฒนา Bound Algorithm: Interference of Holes

การพัฒนา Bound Algorithm: Interference of Holes
การพัฒนา Bound Algorithm: Interference of Holes

ในการจัดการกับรู ค่าที่เก็บไว้ใน "b2" จะคอยติดตามโครงสร้างอื่นที่ไม่ใช่ร่องรอยที่ใหญ่ที่สุด และการวางแผนสิ่งเหล่านี้ลงบนรูปแบบ "largestTraceMat" ที่เติมเต็มจะเผยให้เห็นว่ามีรูในบริเวณใดในสมอง

  1. สร้างอาร์เรย์ "filledMat" ซึ่งเป็นรูปแบบ "largestTraceMat"
  2. สร้างอาร์เรย์ "interferenceMat" ซึ่งเป็นอาร์เรย์ "ysize" โดย "xsize" เป็นศูนย์
  3. สร้างอาร์เรย์ "interferenceloc" เพื่อเก็บค่าจาก "b2" ต่อกันในแนวตั้ง
  4. สร้างอาร์เรย์ "lindex" เพื่อเก็บดัชนีที่สอดคล้องกับ "interferenceloc"
  5. สำหรับดัชนีใน "interferenceMat" ที่ตรงกับ "lindex" ให้ตั้งค่าเป็น 1 ทำให้ขอบเขตขอบเขตต่างกัน

ขั้นตอนที่ 9: การพัฒนาอัลกอริธึมขอบเขต: การค้นหารู การสรุปขอบเขตของสมอง และขอบเขตของรู

การพัฒนาอัลกอริธึมขอบเขต: การระบุตำแหน่งรู การสรุปขอบเขตของสมอง และขอบเขตของรู
การพัฒนาอัลกอริธึมขอบเขต: การระบุตำแหน่งรู การสรุปขอบเขตของสมอง และขอบเขตของรู
  1. ตั้งค่าอาร์เรย์ "tempMat" เท่ากับ "interferenceMat" บวก "filledMat" เพื่อเพิ่มแต่ละค่าในเมทริกซ์ให้กันและกัน
  2. ตั้งค่าอาร์เรย์ "holesLoc" ให้เท่ากับดัชนีที่ "interferenceMat" และ "filledMat" ทั้งคู่มีค่าเท่ากับหนึ่ง
  3. ตั้งค่า "holesMat" เป็นเมทริกซ์ศูนย์ของมิติ "ysize" x "xsize"
  4. ตั้งค่าดัชนีใน "holesMat" ที่เท่ากับ "holesLoc" เป็นหน่วย
  5. ตั้งค่า "สมอง" เป็น "ที่ใหญ่ที่สุดTraceMat"
  6. ตั้งค่า "รู" เป็น "holesMat"

ด้วยการค้นหาว่าค่าของเมทริกซ์ที่เพิ่มเข้ามามีค่าเท่ากับ 2 ตำแหน่งใด ตำแหน่งของรูจึงปลอดภัยและพล็อตบนเมทริกซ์ว่าง

ขั้นตอนที่ 10: การบันทึกข้อมูล: ฟังก์ชัน PatientFiles.m

บันทึกข้อมูล: ฟังก์ชัน PatientFiles.m
บันทึกข้อมูล: ฟังก์ชัน PatientFiles.m
บันทึกข้อมูล: ฟังก์ชัน PatientFiles.m
บันทึกข้อมูล: ฟังก์ชัน PatientFiles.m
บันทึกข้อมูล: ฟังก์ชัน PatientFiles.m
บันทึกข้อมูล: ฟังก์ชัน PatientFiles.m
บันทึกข้อมูล: ฟังก์ชัน PatientFiles.m
บันทึกข้อมูล: ฟังก์ชัน PatientFiles.m

เช่นเดียวกับการตั้งค่าของฟังก์ชันสุดท้าย คลิกที่ปุ่มที่มุมซ้ายบนของหน้าต่างที่ระบุว่า "ใหม่" พร้อมเครื่องหมายบวกสีเหลืองหนา และเลือกตัวเลือก "ฟังก์ชัน" เพื่อเปิดช่องว่างในหน้าต่างตัวแก้ไข คล้ายกับในรูปที่สาม ในบรรทัดแรก ให้ลบเมทริกซ์เอาต์พุตและแทนที่ด้วย "เอาต์พุต" เท่านั้น แทนที่ "untitled2" ด้วย "patientFiles" ลบอาร์กิวเมนต์อินพุตทั้งหมด และทำตามการจัดรูปแบบที่ระบุในภาพที่สี่ของบรรทัดโค้ดแทน บรรทัดแรกของฟังก์ชันนี้ควรตรงกับการจัดรูปแบบของรูปภาพ

ขั้นตอนที่ 11: การบันทึกข้อมูลลงในไฟล์

การบันทึกข้อมูลลงในไฟล์
การบันทึกข้อมูลลงในไฟล์
การบันทึกข้อมูลลงในไฟล์
การบันทึกข้อมูลลงในไฟล์

ในการตั้งค่าไฟล์เพื่อบันทึกข้อมูลที่พบโดยฟังก์ชันหลัก (ยังไม่ได้อธิบาย) เราต้องทำตามขั้นตอนเหล่านี้ (ตามที่กำหนดโดยโค้ดทีละบรรทัด)

  1. ตรวจสอบว่าอินพุตสำหรับ patientName เป็นสตริงหรือไม่
  2. หากไม่ใช่สตริง ให้แสดงว่าอินพุต PatientName ควรเป็นสตริง
  3. จบคำสั่ง if (ป้องกันข้อผิดพลาด)
  4. ตั้งค่าสตริงคำสั่ง "DateandTime" ที่จะให้รูปแบบต่อไปนี้: hour:minutes--month/day/year
  5. ตั้งค่าตัวแปร fileName เป็นค่าต่อไปนี้: patientName.m.

ไปที่ส่วนถัดไปของฟังก์ชัน: มีไฟล์ชื่อนี้อยู่แล้วหรือไม่?

1) สมมติว่าไฟล์ของชื่อนี้มีอยู่แล้ว:

  1. เรียกใช้ไฟล์เพื่อรับค่าจากคิวที่ผ่านมา
  2. เพิ่มข้อมูล "DateandTime" ของการวนซ้ำปัจจุบันเป็นเซลล์ใหม่ในอาร์เรย์เซลล์ของค่า x (ดัชนี end+1)
  3. เพิ่มค่า "brainVolume" ปัจจุบันเป็นเซลล์ใหม่ในอาร์เรย์เซลล์ของค่า y (ดัชนี end+1)
  4. บันทึกตัวแปรปัจจุบันที่โหลดในไฟล์

2) สมมติว่าไฟล์ของชื่อนี้ไม่มีอยู่:

  1. สร้างไฟล์ใหม่ด้วยชื่อที่เก็บไว้ในตัวแปร "patientName"
  2. เพิ่มข้อมูล "DateandTime" ปัจจุบันเป็นเซลล์ลงในอาร์เรย์เซลล์ว่างของค่า x
  3. เพิ่มข้อมูล "brainVolume" ปัจจุบันเป็นเซลล์ลงในอาร์เรย์เซลล์ว่างของค่า y
  4. บันทึกตัวแปรปัจจุบันที่โหลดในไฟล์

ขั้นตอนที่ 12: การบันทึกข้อมูล: การแสดงพล็อตปริมาณสมองเมื่อเวลาผ่านไป

บันทึกข้อมูล: การแสดงพล็อตของปริมาณสมองเมื่อเวลาผ่านไป
บันทึกข้อมูล: การแสดงพล็อตของปริมาณสมองเมื่อเวลาผ่านไป
  1. แปลงอาร์เรย์ค่า x (xVals) เป็นอาร์เรย์หมวดหมู่ (xValsCategorical) เพื่ออนุญาตการพล็อต
  2. สร้างหน้าต่างรูป 5
  3. พล็อตจุดที่กำหนดโดย "xValsCategorical" และ "yVals" (มีปริมาตรสมอง) โดยใช้วงกลมกลวงเพื่อระบุจุดและเชื่อมต่อด้วยเส้นประ
  4. ตั้งชื่อโครงเรื่องเป็น: patientName Brain Volume Data
  5. ป้ายแกน x ตามที่แสดงในภาพ
  6. ติดป้ายแกน y ตามที่แสดงในภาพ
  7. ให้รูปที่ 5 เท่ากับเอาท์พุต

จากนี้ ฟังก์ชัน PatientName ที่ถูกเรียกจะสร้างไฟล์ที่มีข้อมูลที่แก้ไขแล้วซึ่งติดตามปริมาตรของสมองเมื่อเวลาผ่านไป และพล็อตที่แสดงแนวโน้ม

ขั้นตอนที่ 13: การปิดช่องว่างในแผนย่อย: Subplotclose.m

การปิดช่องว่างในแผนย่อย: Subplotclose.m
การปิดช่องว่างในแผนย่อย: Subplotclose.m

ฟังก์ชันนี้ดัดแปลงมาจากโค้ดจาก https://www.briandalessandro.com ทำหน้าที่ปิดช่องว่างระหว่างแผนภาพย่อยของโค้ดหลัก เมื่อมีการสร้างตัวเลขที่แสดงภาพ MRI และเลเยอร์สมอง ฟังก์ชันแผนย่อยที่ใช้ภายในแผนย่อยclose.m จะปรับตำแหน่งของแผนย่อยที่กำหนดให้พอดีกันในแง่ของมิติที่ยาวขึ้น ตัวอย่างเช่น หากโค้ดกำหนดให้เป็นเมทริกซ์ขนาด 7 x 3 แถวจะพอดีพอดีเมื่อมิติของแถวยาวขึ้น หากโค้ดกำหนดให้เป็นเมทริกซ์ขนาด 3 x 7 คอลัมน์จะพอดีพอดี โดยมีช่องว่างในแถวดังที่แสดงในรูปของโค้ดหลักของเรา

ขั้นตอนที่ 14: รหัสหลัก: การล้างทั้งหมดและพร้อมท์สำหรับอินพุต

รหัสหลัก: การล้างทั้งหมดและพร้อมท์สำหรับอินพุต
รหัสหลัก: การล้างทั้งหมดและพร้อมท์สำหรับอินพุต

ในการเริ่มต้นรหัสหลัก ให้คลิกที่ปุ่มเดียวกันกับที่ระบุว่า "ใหม่" ที่มุมซ้ายบนของหน้าต่าง แล้วเลือก "สคริปต์" แทน "ฟังก์ชัน" จากส่วนก่อนหน้า พิมพ์รหัสตามที่แสดงในภาพภายในหน้าต่างตัวแก้ไข บรรทัดของรหัสทำงานต่อไปนี้ตามลำดับ:

  1. ปิดไฟล์ทั้งหมดที่เปิดอยู่ ยกเว้น 0, 1 และ 2
  2. ปิดหน้าต่างรูปทั้งหมด
  3. ล้างตัวแปรทั้งหมดในพื้นที่ทำงาน
  4. ล้างหน้าต่างคำสั่ง
  5. แสดงในหน้าต่างคำสั่ง: โปรดป้อนขนาดต่อไปนี้สำหรับการสแกน MRI:
  6. ในบรรทัดใหม่ในหน้าต่างคำสั่ง ให้ถาม: ความยาวของการสแกนหนึ่งครั้งในหน่วยมิลลิเมตร:. การตอบสนองที่ใส่โดยผู้ใช้จะถูกตั้งค่าเป็นตัวแปร "lengthMM"
  7. ในบรรทัดใหม่ ให้ถาม: ระยะห่างระหว่างการสแกน MRI หน่วยเป็นมิลลิเมตร:. การตอบสนองที่ป้อนโดยผู้ใช้จะถูกตั้งค่าเป็นตัวแปร "ZStacks"

ขั้นตอนที่ 15: รหัสหลัก: การประมวลผลภาพเป็นชุด

รหัสหลัก: การประมวลผลภาพเป็นชุด
รหัสหลัก: การประมวลผลภาพเป็นชุด
รหัสหลัก: การประมวลผลภาพเป็นชุด
รหัสหลัก: การประมวลผลภาพเป็นชุด

ในส่วนนี้ โค้ดจะโหลดรูปภาพ (ประกอบด้วยการสแกน MRI ของส่วนตัดขวางของสมอง) และจัดเก็บชื่อไฟล์รูปภาพแต่ละไฟล์ในตัวแปร "Base" และแสดงการสแกน MRI แต่ละรายการ โปรดปฏิบัติตามรหัสในภาพซึ่งทำดังต่อไปนี้:

  1. สร้างอาร์เรย์โครงสร้าง "BrainImages" ที่มีข้อมูลเกี่ยวกับไฟล์ทั้งหมดภายในโฟลเดอร์ปัจจุบันที่พอดีกับรูปแบบชื่อของ MRI_().png
  2. ตั้งค่าตัวแปร "NumberofImages" ให้เท่ากับจำนวนองค์ประกอบในอาร์เรย์โครงสร้าง "BrainImages"
  3. เปิดหน้าต่างรูป 1
  4. ตั้งค่าการวนซ้ำเพื่อวนซ้ำสำหรับจำนวนภาพที่นับในไฟล์
  5. สำหรับแต่ละลูป "CurrentImage" เป็นชื่อของแต่ละไฟล์ MRI_i-p.webp" />
  6. สร้างพล็อตย่อยขนาด 3 x 7 เพื่อแสดงรูปภาพ 19 รูปที่จะโหลดโดย "imshow"
  7. แสดงภาพแต่ละภาพเป็นองค์ประกอบอื่นในหน้าต่างรูปพล็อตย่อย
  8. ตั้งชื่อองค์ประกอบแต่ละองค์ประกอบย่อยเป็น Level_ โดยที่ว่างคือหมายเลขการวนซ้ำของ for loop
  9. สิ้นสุด for loop (หลีกเลี่ยงข้อผิดพลาด)

สิ่งนี้จะแสดงในหน้าต่างรูปที่ 1 การสแกน MRI ทั้งหมดในรูปแบบดิบในการกำหนดค่า 3 x 7 โดยไม่มีช่องว่างในการวางแนว x

ขั้นตอนที่ 16: รหัสหลัก: การเติม

รหัสหลัก: Padding
รหัสหลัก: Padding

ด้วยการเติมช่องว่าง เราหลีกเลี่ยงปัญหาความคลาดเคลื่อนเล็กน้อยในขนาดรูปภาพที่อาจทำให้เกิดข้อผิดพลาดสำหรับขนาดที่ไม่ตรงกัน ในกรณีที่ภาพหนึ่งมีขนาดใหญ่กว่าอีกภาพหนึ่งเล็กน้อย

  1. เปิดหน้าต่างรูปที่ 2
  2. โหลดเมทริกซ์รูปภาพจาก MRI_1-p.webp" />
  3. ค้นหาขนาดของเมทริกซ์ของรูปภาพและตั้งค่าเป็น "OriginalXPixels" (สำหรับจำนวนแถว) และ "OriginalYPixels" (สำหรับจำนวนคอลัมน์)
  4. ตั้งค่าเมทริกซ์ "BrainMat" ให้ประกอบด้วยศูนย์ทั้งหมดที่มีอีก 20 แถวและอีก 20 คอลัมน์สำหรับแต่ละระนาบ และส่วนตัดขวางทั้งหมด 19 ส่วน หนึ่งส่วนต่อระนาบ
  5. ตั้งค่า "HolesMat" ให้ประกอบด้วยอาร์เรย์สามมิติแบบเดียวกันของศูนย์เพื่อป้อนพิกัดของรูในภายหลัง
  6. สร้าง "zeroMat" ให้เป็นขนาดของแป้นบวกกับยี่สิบแถวและยี่สิบคอลัมน์ ซึ่งเป็นอาร์เรย์สองมิติของศูนย์

ขั้นตอนที่ 17: รหัสหลัก: การกำหนดขอบเขต

รหัสหลัก: การกำหนดขอบเขต
รหัสหลัก: การกำหนดขอบเขต
รหัสหลัก: การกำหนดขอบเขต
รหัสหลัก: การกำหนดขอบเขต
  1. ตั้งค่า for loop เพื่อดูข้อมูลจากแต่ละภาพที่โหลดไว้ก่อนหน้านี้
  2. ในลักษณะเดียวกันกับการประมวลผลแบบกลุ่มก่อนหน้านี้ "CurrentImage" โหลดไฟล์ด้วย "MRI_i.png" โดยที่ i คือหมายเลขการวนซ้ำ
  3. เรียกใช้แต่ละภาพผ่านฟังก์ชันการประมวลผล "LevelCurveTracings2.m" ที่คุณทำไว้ก่อนหน้านี้
  4. ค้นหาขนาดของผลลัพธ์ "สมอง" กำหนดจำนวนแถวเป็น "Currentrow" และจำนวนคอลัมน์เป็น "Currentcolumns"
  5. ตั้งค่า "CurrentMat" เป็นเมทริกซ์ของศูนย์ที่มีขนาดที่ระบุโดย "Currentrow" และ "Currentcolumns"
  6. ศูนย์กลางข้อมูลจาก "Brain" ใน "CurrentMat" โดยมีระยะขอบ 10 แถวทุกด้าน
  7. สร้างแผนผังย่อยขนาด 3 x 7 เพื่อแสดงขอบเขตของภาพ
  8. ตั้งชื่อองค์ประกอบแต่ละองค์ประกอบย่อยในหน้าต่างรูป
  9. สร้างเมทริกซ์สามมิติ "BrainMat" ที่ประกอบด้วยเลเยอร์ขอบเขตแต่ละชั้น "CurrentMat"
  10. สิ้นสุด for loop (เพื่อหลีกเลี่ยงข้อผิดพลาด)

ส่วนย่อยต่อไปนี้จะเติมในรูด้านซ้ายที่ด้านบนและด้านล่างของรูปร่างสามมิติที่เสนอ

  1. ตั้งค่า "LevelCurve1" ให้เท่ากับเลเยอร์แรกของ "BrainMat" (ด้านล่างของทึบ)
  2. ตั้งค่า "LevelCurveEnd" ให้เท่ากับเลเยอร์สุดท้ายของ "BrainMat" (ด้านบนของทึบ)
  3. เขียนทับ "LevelCurve1" ด้วยเลเยอร์ที่เติม
  4. เขียนทับ "LevelCurveEnd" ด้วยเลเยอร์ที่เติม
  5. กำหนดชั้นที่เติมเป็นชั้นล่างสุดของ "BrainMat"
  6. กำหนดชั้นที่เติมเป็นชั้นบนสุดของ "BrainMat"

ขั้นตอนที่ 18: รหัสหลัก: การกำหนดมิติ Z ที่เหมาะสม

รหัสหลัก: การกำหนดมิติ Z ที่เหมาะสม
รหัสหลัก: การกำหนดมิติ Z ที่เหมาะสม

สามบรรทัดแรกประกอบด้วยการตั้งค่าอาร์เรย์ว่าง "z" และดำเนินการแปลงอย่างง่าย (แบ่งพิกเซลตามความยาว) เพื่อให้อ่านปริมาตรได้อย่างเหมาะสมในหน่วย mm^3

  1. สร้าง for loop เพื่อวนรอบแต่ละเลเยอร์
  2. ค้นหาจำนวนหนึ่งในเลเยอร์ที่กำหนด
  3. แปลงพิกัด z ให้เป็นค่าที่ปรับขนาดเป็นอัตราส่วนที่เหมาะสม ตั้งค่าเป็น "tempz" ซึ่งเป็นเวกเตอร์คอลัมน์
  4. เพิ่มค่า z สำหรับเส้นโค้งระดับไปยังเวกเตอร์ z

ด้วยพิกัด z นี้จะถูกปรับอย่างเหมาะสม

ขั้นตอนที่ 19: รหัสหลัก: การกำหนดพิกัด X และ Y

รหัสหลัก: การกำหนดพิกัด X และ Y
รหัสหลัก: การกำหนดพิกัด X และ Y

ทีนี้มากำหนดตำแหน่ง x และ y ของแต่ละจุดในขอบเขต

  1. เริ่มต้น "xBrain" เป็นอาร์เรย์ว่าง
  2. เริ่มต้น "yBrain" เป็นอาร์เรย์ว่าง
  3. ตั้งค่า for loop เพื่อวนซ้ำแต่ละภาพที่โหลดไว้
  4. รวบรวมเมทริกซ์สองคอลัมน์เพื่อเก็บพิกัดระนาบของแต่ละจุดในขอบเขต ซึ่งแสดงโดยเวกเตอร์คอลัมน์ "RowBrain" และ "ColumnBrain"
  5. ต่อท้าย "xBrain" ด้วยพิกัด "RowBrain" ที่พบในปัจจุบัน
  6. ต่อท้าย "yBrain" ด้วยพิกัด "ColumnBrain" ที่พบในปัจจุบัน
  7. สิ้นสุด for loop (เพื่อหลีกเลี่ยงข้อผิดพลาด)

ขั้นตอนที่ 20: รหัสหลัก: การพล็อตโครงสร้างสามมิติ การค้นหาปริมาณ และการบันทึกข้อมูล

รหัสหลัก: การพล็อตโครงสร้างสามมิติ การหาปริมาตร และการบันทึกข้อมูล
รหัสหลัก: การพล็อตโครงสร้างสามมิติ การหาปริมาตร และการบันทึกข้อมูล
รหัสหลัก: การพล็อตโครงสร้างสามมิติ การค้นหาปริมาตร และการบันทึกข้อมูล
รหัสหลัก: การพล็อตโครงสร้างสามมิติ การค้นหาปริมาตร และการบันทึกข้อมูล
รหัสหลัก: การพล็อตโครงสร้างสามมิติ การหาปริมาตร และการบันทึกข้อมูล
รหัสหลัก: การพล็อตโครงสร้างสามมิติ การหาปริมาตร และการบันทึกข้อมูล
รหัสหลัก: การพล็อตโครงสร้างสามมิติ การค้นหาปริมาตร และการบันทึกข้อมูล
รหัสหลัก: การพล็อตโครงสร้างสามมิติ การค้นหาปริมาตร และการบันทึกข้อมูล

การใช้ฟังก์ชัน alphaShape เราจะสร้างโครงสร้างสามมิติซึ่งเราอาจคำนวณปริมาตรของสมอง

  1. ใช้ฟังก์ชัน alphaShape เสียบเวกเตอร์ "xBrain", "yBrain" และ "z" สำหรับพิกัด x, y และ z และตั้งค่าให้เท่ากับ "BrainPolyhedron"
  2. เปิดหน้าต่างรูป 3
  3. พล็อตรูปร่างอัลฟาที่คำนวณได้ "BrainPolyhedron" แสดงในหน้าต่างรูป
  4. คำนวณปริมาตรของรูปร่างอัลฟ่าโดยใช้ฟังก์ชัน "ปริมาตร" ที่ใช้ได้กับรูปร่างอัลฟา
  5. แปลงปริมาตรเป็น mm^3
  6. พิมพ์ปริมาตรของของแข็งในหน้าต่างคำสั่ง
  7. พร้อมท์ให้ตั้งชื่อผู้ป่วยเป็นอินพุต
  8. รับวันที่และเวลาปัจจุบันพร้อมนาฬิกา และตั้งค่าเป็น "DateandTime"
  9. เรียกใช้ฟังก์ชัน "patientFiles" เพื่อบันทึกและลงจุดข้อมูลที่คำนวณได้

จากที่นี่ รูปภาพที่สองและสามควรแสดงตัวเลขที่ปรากฏขึ้น และรูปภาพที่สี่ที่ควรแสดงในหน้าต่างคำสั่ง

แนะนำ: