
สารบัญ:
- ขั้นตอนที่ 1: การใช้ Brain Box
- ขั้นตอนที่ 2: บทนำ: การวิเคราะห์ข้ามส่วน
- ขั้นตอนที่ 3: การตั้งค่าฟังก์ชัน: LevelCurveTracings.m
- ขั้นตอนที่ 4: การพัฒนา Bound Algorithm: Finding Bounds
- ขั้นตอนที่ 5: การพัฒนา Bound Algorithm: การสร้าง Outer Bound Array
- ขั้นตอนที่ 6: การพัฒนา Bound Algorithm: การทำงานกับ Center Point
- ขั้นตอนที่ 7: การพัฒนาอัลกอริธึมที่ถูกผูกไว้: เมื่อ Centroid ไม่อยู่ตรงกลาง
- ขั้นตอนที่ 8: การพัฒนา Bound Algorithm: Interference of Holes
- ขั้นตอนที่ 9: การพัฒนาอัลกอริธึมขอบเขต: การค้นหารู การสรุปขอบเขตของสมอง และขอบเขตของรู
- ขั้นตอนที่ 10: การบันทึกข้อมูล: ฟังก์ชัน PatientFiles.m
- ขั้นตอนที่ 11: การบันทึกข้อมูลลงในไฟล์
- ขั้นตอนที่ 12: การบันทึกข้อมูล: การแสดงพล็อตปริมาณสมองเมื่อเวลาผ่านไป
- ขั้นตอนที่ 13: การปิดช่องว่างในแผนย่อย: Subplotclose.m
- ขั้นตอนที่ 14: รหัสหลัก: การล้างทั้งหมดและพร้อมท์สำหรับอินพุต
- ขั้นตอนที่ 15: รหัสหลัก: การประมวลผลภาพเป็นชุด
- ขั้นตอนที่ 16: รหัสหลัก: การเติม
- ขั้นตอนที่ 17: รหัสหลัก: การกำหนดขอบเขต
- ขั้นตอนที่ 18: รหัสหลัก: การกำหนดมิติ Z ที่เหมาะสม
- ขั้นตอนที่ 19: รหัสหลัก: การกำหนดพิกัด X และ Y
- ขั้นตอนที่ 20: รหัสหลัก: การพล็อตโครงสร้างสามมิติ การค้นหาปริมาณ และการบันทึกข้อมูล
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-23 15:12

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

ในการใช้กล่องสมอง ต้องการสิ่งต่อไปนี้เท่านั้น:
- MRI สแกนสมองและชื่อและรูปแบบของไฟล์ดังกล่าว (ควรมีขนาดใกล้เคียงกันทั้งหมด)
- ความยาวของการสแกนหนึ่งครั้ง
- ระยะห่างระหว่างแต่ละชั้น (MRI scan)
- ชื่อผู้ป่วย (เมื่อป้อนข้อมูล ห้ามเว้นวรรค และโปรดใช้ชื่อและนามสกุล เช่น: FirstnameLastname)
และจากนี้ บุคคลหนึ่งมีความสามารถในการติดตามแนวโน้มของบุคคลในปริมาตรของสมองเมื่อเวลาผ่านไป ดังนั้นซอฟต์แวร์นี้จึงสามารถติดตามตัวเลขแนวโน้มของโรคอัลไซเมอร์ได้ ความยาวที่เราใช้ในการทดลองคือ 180 มม. สำหรับความยาวของการสแกนหนึ่งครั้ง และ 5 มม. สำหรับระยะห่างระหว่างการสแกนด้วย MRI โดยอิงจากตัวเลขเฉลี่ย
อย่างไรก็ตาม การประยุกต์ใช้ Brain Box ไม่จำเป็นต้องจำกัดอยู่เพียงงานเดียว หากภาพตัดขวางของของแข็งที่กำหนดเป็นภาพถ่าย เช่น เนื้องอก แนวโน้มของการเปลี่ยนแปลงของปริมาตรสำหรับสิ่งเหล่านี้ก็สามารถติดตามได้ในซอฟต์แวร์เช่นกัน
ขั้นตอนที่ 2: บทนำ: การวิเคราะห์ข้ามส่วน

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




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

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

ทำตามในหน้าต่างตัวแก้ไขด้วยรหัสต่อไปนี้ในรูปภาพ โค้ดส่วนนี้ใช้บรรทัดต่อบรรทัดต่อไปนี้
- ค้นหาความยาวของแต่ละแถวของภาพไบนารี "b" (cellfun ใช้ความยาวของฟังก์ชันกับแต่ละแถว)
- ตั้งค่า "loc" เพื่อจัดเก็บความยาวสูงสุด
- ค้นหาดัชนีความยาวสูงสุด ตั้งค่าให้จัดเก็บใน "largestTrace"
- ค้นหาขนาดของรูปภาพ "mri" ซึ่งประกอบด้วยขนาดเดียวกับ "b" และตั้งค่าเป็น "BWsize"
- ค้นหาจำนวนแถวในอาร์เรย์ของรูปภาพ ตั้งค่าเป็น "ysize"
- ค้นหาจำนวนคอลัมน์ในอาร์เรย์ของรูปภาพ ตั้งค่าเป็น "xsize"
- สร้างอาร์เรย์ "largestTraceMat" ซึ่งเป็นเมทริกซ์ "ysize" โดย "xsize" เป็นศูนย์
- ค้นหาดัชนีที่เทียบเท่าจากค่าที่ห้อยลงมาซึ่งสอดคล้องกับตำแหน่งที่ใหญ่ที่สุดของค่า x และค่า y จัดเก็บในเวกเตอร์ "lindex"
- ในเมทริกซ์ของศูนย์ "largestTraceMat" ให้เปลี่ยนองค์ประกอบที่ดัชนีที่สอดคล้องกับค่าดัชนีที่เก็บไว้เป็นองค์ประกอบใน "lindex" เป็นองค์ประกอบ
ดังนั้น อาร์เรย์แบบลอจิคัล "largestTraceMat" จึงมีขอบเขตขอบเขตที่ใหญ่ที่สุดของส่วนตัดขวางของการสแกนสมองที่กำหนดซึ่งถูกพล็อตเป็นพื้นที่ที่มีฉากหลังเป็นศูนย์
ขั้นตอนที่ 6: การพัฒนา Bound Algorithm: การทำงานกับ Center Point

ต่อไปเราต้องทดสอบเพื่อดูว่าภาคตัดขวางประกอบด้วยมากกว่าหนึ่งภูมิภาคหรือไม่ (ที่ใหญ่ที่สุด) โดยการทดสอบการจัดตำแหน่งของเซนทรอยด์ที่ใหญ่ที่สุดของภูมิภาค เราจะเห็นได้ว่ามีพื้นที่ต่อเนื่องกันหรือไม่ ซึ่งจะทำให้ได้เซนทรอยด์ที่มีศูนย์กลางมากกว่า หรือความเป็นไปได้ของภูมิภาคต่างๆ
- ใช้ "regionProps" เพื่อค้นหาข้อมูลเกี่ยวกับเซนทรอยด์ที่มีอยู่ ตั้งค่าให้เท่ากับอาร์เรย์โครงสร้าง "tempStruct"
- จัดรูปแบบอาร์เรย์ "centroids" ด้วยข้อมูลจากฟิลด์ "centroid" ที่ต่อกันในแนวตั้ง
- รับค่าคอลัมน์ที่สองของ "centroids" (พิกัดมิติแนวนอน)
- เรียกใช้ตัวกรองเพื่อตรวจสอบการจัดตำแหน่งของเซนทรอยด์กับศูนย์กลางแนวนอน
ขั้นตอนที่ 7: การพัฒนาอัลกอริธึมที่ถูกผูกไว้: เมื่อ Centroid ไม่อยู่ตรงกลาง

ในสถานการณ์สมมติที่เซนทรอยด์ของขอบเขตการติดตามที่ใหญ่ที่สุดไม่ได้อยู่ตรงกลาง เราทำตามขั้นตอนต่อไปนี้ ดังที่เราสังเกตได้จากการสแกนด้วย MRI แนวโน้มที่จะมีซีกโลกของสมองแสดงเป็นภาพตัดขวางเมื่อไม่อยู่ติดกัน ดังนั้นตอนนี้เราจึงยังคงวางแผนการติดตามที่ใหญ่เป็นอันดับสองพร้อมกับร่องรอยที่ใหญ่ที่สุดใน "largestTraceMat"
- ตั้งค่าเมทริกซ์ที่ติดตามเป็นตัวแปรใหม่ "b2"
- เริ่มต้นเมทริกซ์ว่าง "b2" ด้วยชุดที่จัดทำดัชนีโดย "loc"
- สร้างเงื่อนไข สำหรับเมื่อเซนทรอยด์ไม่อยู่ตรงกลาง (เช่น เลเยอร์หลายขอบเขต)
- กำหนดขนาดการติดตามใหม่ที่จะพบสำหรับแต่ละแถว (traceSize2)
- ตั้งค่า "loc2" เพื่อค้นหาดัชนีที่มีขอบเขต
- ให้เซลล์ที่ระบุโดย "loc2" ใน "b2" เท่ากับ "largestTrace2"
- แปลงตัวห้อยเป็นดัชนี ตั้งค่าเป็น "lindex"
- เปลี่ยนองค์ประกอบที่สอดคล้องกับ "lindex" ใน "largestTraceMat" เป็น 1
- เริ่มต้นเมทริกซ์ว่าง "b2" ด้วยชุดที่จัดทำดัชนีโดย "loc2"
ขั้นตอนที่ 8: การพัฒนา Bound Algorithm: Interference of Holes

ในการจัดการกับรู ค่าที่เก็บไว้ใน "b2" จะคอยติดตามโครงสร้างอื่นที่ไม่ใช่ร่องรอยที่ใหญ่ที่สุด และการวางแผนสิ่งเหล่านี้ลงบนรูปแบบ "largestTraceMat" ที่เติมเต็มจะเผยให้เห็นว่ามีรูในบริเวณใดในสมอง
- สร้างอาร์เรย์ "filledMat" ซึ่งเป็นรูปแบบ "largestTraceMat"
- สร้างอาร์เรย์ "interferenceMat" ซึ่งเป็นอาร์เรย์ "ysize" โดย "xsize" เป็นศูนย์
- สร้างอาร์เรย์ "interferenceloc" เพื่อเก็บค่าจาก "b2" ต่อกันในแนวตั้ง
- สร้างอาร์เรย์ "lindex" เพื่อเก็บดัชนีที่สอดคล้องกับ "interferenceloc"
- สำหรับดัชนีใน "interferenceMat" ที่ตรงกับ "lindex" ให้ตั้งค่าเป็น 1 ทำให้ขอบเขตขอบเขตต่างกัน
ขั้นตอนที่ 9: การพัฒนาอัลกอริธึมขอบเขต: การค้นหารู การสรุปขอบเขตของสมอง และขอบเขตของรู

- ตั้งค่าอาร์เรย์ "tempMat" เท่ากับ "interferenceMat" บวก "filledMat" เพื่อเพิ่มแต่ละค่าในเมทริกซ์ให้กันและกัน
- ตั้งค่าอาร์เรย์ "holesLoc" ให้เท่ากับดัชนีที่ "interferenceMat" และ "filledMat" ทั้งคู่มีค่าเท่ากับหนึ่ง
- ตั้งค่า "holesMat" เป็นเมทริกซ์ศูนย์ของมิติ "ysize" x "xsize"
- ตั้งค่าดัชนีใน "holesMat" ที่เท่ากับ "holesLoc" เป็นหน่วย
- ตั้งค่า "สมอง" เป็น "ที่ใหญ่ที่สุดTraceMat"
- ตั้งค่า "รู" เป็น "holesMat"
ด้วยการค้นหาว่าค่าของเมทริกซ์ที่เพิ่มเข้ามามีค่าเท่ากับ 2 ตำแหน่งใด ตำแหน่งของรูจึงปลอดภัยและพล็อตบนเมทริกซ์ว่าง
ขั้นตอนที่ 10: การบันทึกข้อมูล: ฟังก์ชัน PatientFiles.m




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


ในการตั้งค่าไฟล์เพื่อบันทึกข้อมูลที่พบโดยฟังก์ชันหลัก (ยังไม่ได้อธิบาย) เราต้องทำตามขั้นตอนเหล่านี้ (ตามที่กำหนดโดยโค้ดทีละบรรทัด)
- ตรวจสอบว่าอินพุตสำหรับ patientName เป็นสตริงหรือไม่
- หากไม่ใช่สตริง ให้แสดงว่าอินพุต PatientName ควรเป็นสตริง
- จบคำสั่ง if (ป้องกันข้อผิดพลาด)
- ตั้งค่าสตริงคำสั่ง "DateandTime" ที่จะให้รูปแบบต่อไปนี้: hour:minutes--month/day/year
- ตั้งค่าตัวแปร fileName เป็นค่าต่อไปนี้: patientName.m.
ไปที่ส่วนถัดไปของฟังก์ชัน: มีไฟล์ชื่อนี้อยู่แล้วหรือไม่?
1) สมมติว่าไฟล์ของชื่อนี้มีอยู่แล้ว:
- เรียกใช้ไฟล์เพื่อรับค่าจากคิวที่ผ่านมา
- เพิ่มข้อมูล "DateandTime" ของการวนซ้ำปัจจุบันเป็นเซลล์ใหม่ในอาร์เรย์เซลล์ของค่า x (ดัชนี end+1)
- เพิ่มค่า "brainVolume" ปัจจุบันเป็นเซลล์ใหม่ในอาร์เรย์เซลล์ของค่า y (ดัชนี end+1)
- บันทึกตัวแปรปัจจุบันที่โหลดในไฟล์
2) สมมติว่าไฟล์ของชื่อนี้ไม่มีอยู่:
- สร้างไฟล์ใหม่ด้วยชื่อที่เก็บไว้ในตัวแปร "patientName"
- เพิ่มข้อมูล "DateandTime" ปัจจุบันเป็นเซลล์ลงในอาร์เรย์เซลล์ว่างของค่า x
- เพิ่มข้อมูล "brainVolume" ปัจจุบันเป็นเซลล์ลงในอาร์เรย์เซลล์ว่างของค่า y
- บันทึกตัวแปรปัจจุบันที่โหลดในไฟล์
ขั้นตอนที่ 12: การบันทึกข้อมูล: การแสดงพล็อตปริมาณสมองเมื่อเวลาผ่านไป

- แปลงอาร์เรย์ค่า x (xVals) เป็นอาร์เรย์หมวดหมู่ (xValsCategorical) เพื่ออนุญาตการพล็อต
- สร้างหน้าต่างรูป 5
- พล็อตจุดที่กำหนดโดย "xValsCategorical" และ "yVals" (มีปริมาตรสมอง) โดยใช้วงกลมกลวงเพื่อระบุจุดและเชื่อมต่อด้วยเส้นประ
- ตั้งชื่อโครงเรื่องเป็น: patientName Brain Volume Data
- ป้ายแกน x ตามที่แสดงในภาพ
- ติดป้ายแกน y ตามที่แสดงในภาพ
- ให้รูปที่ 5 เท่ากับเอาท์พุต
จากนี้ ฟังก์ชัน PatientName ที่ถูกเรียกจะสร้างไฟล์ที่มีข้อมูลที่แก้ไขแล้วซึ่งติดตามปริมาตรของสมองเมื่อเวลาผ่านไป และพล็อตที่แสดงแนวโน้ม
ขั้นตอนที่ 13: การปิดช่องว่างในแผนย่อย: Subplotclose.m

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

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


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

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


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

สามบรรทัดแรกประกอบด้วยการตั้งค่าอาร์เรย์ว่าง "z" และดำเนินการแปลงอย่างง่าย (แบ่งพิกเซลตามความยาว) เพื่อให้อ่านปริมาตรได้อย่างเหมาะสมในหน่วย mm^3
- สร้าง for loop เพื่อวนรอบแต่ละเลเยอร์
- ค้นหาจำนวนหนึ่งในเลเยอร์ที่กำหนด
- แปลงพิกัด z ให้เป็นค่าที่ปรับขนาดเป็นอัตราส่วนที่เหมาะสม ตั้งค่าเป็น "tempz" ซึ่งเป็นเวกเตอร์คอลัมน์
- เพิ่มค่า z สำหรับเส้นโค้งระดับไปยังเวกเตอร์ z
ด้วยพิกัด z นี้จะถูกปรับอย่างเหมาะสม
ขั้นตอนที่ 19: รหัสหลัก: การกำหนดพิกัด X และ Y

ทีนี้มากำหนดตำแหน่ง x และ y ของแต่ละจุดในขอบเขต
- เริ่มต้น "xBrain" เป็นอาร์เรย์ว่าง
- เริ่มต้น "yBrain" เป็นอาร์เรย์ว่าง
- ตั้งค่า for loop เพื่อวนซ้ำแต่ละภาพที่โหลดไว้
- รวบรวมเมทริกซ์สองคอลัมน์เพื่อเก็บพิกัดระนาบของแต่ละจุดในขอบเขต ซึ่งแสดงโดยเวกเตอร์คอลัมน์ "RowBrain" และ "ColumnBrain"
- ต่อท้าย "xBrain" ด้วยพิกัด "RowBrain" ที่พบในปัจจุบัน
- ต่อท้าย "yBrain" ด้วยพิกัด "ColumnBrain" ที่พบในปัจจุบัน
- สิ้นสุด for loop (เพื่อหลีกเลี่ยงข้อผิดพลาด)
ขั้นตอนที่ 20: รหัสหลัก: การพล็อตโครงสร้างสามมิติ การค้นหาปริมาณ และการบันทึกข้อมูล




การใช้ฟังก์ชัน alphaShape เราจะสร้างโครงสร้างสามมิติซึ่งเราอาจคำนวณปริมาตรของสมอง
- ใช้ฟังก์ชัน alphaShape เสียบเวกเตอร์ "xBrain", "yBrain" และ "z" สำหรับพิกัด x, y และ z และตั้งค่าให้เท่ากับ "BrainPolyhedron"
- เปิดหน้าต่างรูป 3
- พล็อตรูปร่างอัลฟาที่คำนวณได้ "BrainPolyhedron" แสดงในหน้าต่างรูป
- คำนวณปริมาตรของรูปร่างอัลฟ่าโดยใช้ฟังก์ชัน "ปริมาตร" ที่ใช้ได้กับรูปร่างอัลฟา
- แปลงปริมาตรเป็น mm^3
- พิมพ์ปริมาตรของของแข็งในหน้าต่างคำสั่ง
- พร้อมท์ให้ตั้งชื่อผู้ป่วยเป็นอินพุต
- รับวันที่และเวลาปัจจุบันพร้อมนาฬิกา และตั้งค่าเป็น "DateandTime"
- เรียกใช้ฟังก์ชัน "patientFiles" เพื่อบันทึกและลงจุดข้อมูลที่คำนวณได้
จากที่นี่ รูปภาพที่สองและสามควรแสดงตัวเลขที่ปรากฏขึ้น และรูปภาพที่สี่ที่ควรแสดงในหน้าต่างคำสั่ง
แนะนำ:
Arduino Keyboard Joystick Extender Box และ Sound Controller Thing โดยใช้ Deej: 8 ขั้นตอน

Arduino Keyboard Joystick Extender Box และ Sound Controller Thing โดยใช้ Deej: ทำไมฉันจึงต้องการเพิ่มจอยสติ๊กขนาดเล็กลงในแป้นพิมพ์เพื่อควบคุมองค์ประกอบอินเทอร์เฟซหรืองานขนาดเล็กอื่นๆ ในเกมและเครื่องจำลอง (MS Flight Sim, Elite: Dangerous, Star Wars: ฝูงบิน ฯลฯ) สำหรับ Elite: Dangerous ฉันเคย
Pocket Useless Box (มีบุคลิก): 9 ขั้นตอน (พร้อมรูปภาพ)

Pocket Useless Box (พร้อมบุคลิกภาพ): แม้ว่าเราจะอยู่ห่างไกลจากการจลาจลของหุ่นยนต์ แต่ก็มีเครื่องหนึ่งที่ขัดแย้งกับมนุษย์อยู่แล้วแม้ว่าจะเป็นวิธีที่เล็กน้อยที่สุด ไม่ว่าคุณจะต้องการเรียกมันว่ากล่องไร้ประโยชน์หรือเครื่องจักรที่ไม่ต้องพึ่งพาใคร หุ่นยนต์หน้าด้านที่กล้าหาญตัวนี้คือ
The Barbie Box: a Camouflaged Case/ Boom Box สำหรับเครื่องเล่น MP3 ของคุณ: 4 ขั้นตอน (พร้อมรูปภาพ)

The Barbie Box: a Camouflaged Case/ Boom Box สำหรับเครื่องเล่น MP3 ของคุณ: นี่คือกระเป๋าพกพาที่หุ้มเบาะสำหรับเครื่องเล่น MP3 ของคุณ ซึ่งจะแปลงแจ็คหูฟังให้มีขนาดหนึ่งในสี่นิ้ว สามารถทำหน้าที่เป็นกล่องบูมที่พลิกสวิตช์ และ ปลอมแปลงเครื่องเล่น mp3 ของคุณเป็นเครื่องเล่นเทปในยุคต้นๆ หรือการโจรกรรมระดับต่ำที่คล้ายคลึงกัน i
Robot Brain: สร้างคอมพิวเตอร์บอร์ดเดียวในตอนเย็น: 11 ขั้นตอน

Robot Brain: สร้างคอมพิวเตอร์บอร์ดเดียวในตอนเย็น: หน่วยความจำไม่เพียงพอใน Picaxe หรือ Arduino ของคุณหรือไม่? แต่พีซีนั้นเกินความสามารถสำหรับงาน? ดูคอมพิวเตอร์บอร์ดเดี่ยวแบบโอเพนซอร์สที่สามารถตั้งโปรแกรมในภาษาต่างๆ เช่น C, Basic, Forth, Pascal หรือ Fortran บอร์ดนี้ใช้ไอซีและเดล
Cedar (ซิการ์?) Box Speaker Box: 8 Steps (พร้อมรูปภาพ)

Cedar (Cigar?) Box Speaker Box: แรงบันดาลใจจากลำโพง Munny แต่ไม่ต้องการจ่ายมากกว่า 10 เหรียญ นี่คือคำแนะนำของฉันโดยใช้ลำโพงคอมพิวเตอร์รุ่นเก่า กล่องไม้จากร้านขายของมือสอง และกาวร้อนจำนวนมาก