תוכן עניינים:
2025 מְחַבֵּר: John Day | [email protected]. שונה לאחרונה: 2025-01-13 06:57
מטרת פרויקט זה הייתה לזהות ולהשתמש בפרמטר לעיבוד תמונות ממוגרפיה בגווני אפור של סיווגי רקמות רקע שונות: שומנים, בלוטות שומניות ורקמות צפופות. סיווג זה משמש כאשר רדיולוגים מנתחים ממוגרפיה וצריכים לשקול אם צפיפות הרקמות תעיב על הפרעות כלשהן כגון נגעים או גידולים. הסיבה לכך היא שמבנים פיזיולוגיים תקינים כמו רקמת הבלוטה ורקמת חיבור סיבית. ומורפולוגיות חריגות כגון הסתיידויות וגידולים יופיעו בהירים מאוד בממוגרפיה בעוד שרקמת שומן פחות צפופה תיראה שחורה. לכן, היה ראוי לתכנת מסווג שיכול לתמרן את רמות עוצמת הפיקסלים כדי להמחיש ולזהות המונים בצורה הטובה ביותר.
שלב 1: ארגון נתוני ממוגרפיה
אחד הדברים הראשונים שהבנתי שאני צריך לטפל בהם הוא ארגון הנתונים בצורה מאוד ברורה, תמציתית ונגישה. אלה המשתנים שחילצתי ממאגר המיני-MIAS של ממוגרפיה. יצרתי שני מערכים. אחד המכיל 4 עמודות:
- מספר תמונה:
- x קואורדינטת מסה
- קואורדינטת המסה y
- רדיוס מסה: (זה הגדיר גודל משוער למסה
המערך השני הכיל מידע סיווג:
- סוג רקמת רקע: שומני (F), בלוטות שומניות (G), צפופות (D)
- תיאור מסה: מוגדר היטב (CIRC), מנוקד (SPIC), עיוות אדריכלי אחר (MISC) לא תקין (ARCH), אסימטריה (ASYM), רגיל (NORM)
- מאבחן: שפיר (B), ממאיר (M)
מכיוון שמטרתו של פרויקט זה הייתה לקבוע את הסף הטוב ביותר עבור כל סוג של רקמת רקע לא כל המידע היה נחוץ. עם זאת, תוכל להרחיב את הפרויקט שלך ולכלול ניתוח מרקם ולבדוק את המסווג שלך מול תיאורי ההמונים המוכרים.
הערת צד: מסד הנתונים שממנו קיבלתי את תמונות הממוגרפיה המאובחנות ארגן את המידע אודות כל ממוגרפיה בקובץ טקסט נפרד מהתמונות. היה לי מעט קשה לחלץ את הנתונים מקובץ טקסט ולארגן לצורות מערך, אבל הקישור הבא עזר מאוד להבין את כל זה. לחלופין, פשוט התאם את הקוד שהדבקתי למעלה למטרות שלך.
פורמט קובץ ממוגרפיה: mdb001 G CIRC B 535 425 197
mdb002 G CIRC B 522 280 69
עזרה של TextScan: https://www.mathworks.com/help/matlab/ref/textsca… מסד הנתונים של הממוגרפיה:
שלב 2: עיבוד תמונה
ובכן, הדבר השני שעלה כשגיליתי כיצד לזהות המונים הוא שעבור ממוגרפיה לא נורמלית רבות לא יכולתי לדעת מבחינה ויזואלית היכן החריגה או כמה היא גדולה. ברור, מכיוון שאני לא רדיולוג מנוסה, זה היה צפוי. עם זאת, הדרך הפשוטה ביותר למצוא הפרעות (על פי חיפושים ארוכים שלי בגוגל) הייתה להסתכל על ריכוזים של אזורים בהירים וכהים. השתמשתי בעיקר בפונקציית adapthisteq כדי לשפר את ניגודיות התמונה ולאחר מכן לדמיין אותה כדי להפוך את התמונה לתמונה בינארית כדי להתנסות ברמות סף שונות.
- adapthisteq: פונקציה זו משנה את ערכי העוצמה של תמונות בגווני אפור ותמונות rgb באמצעות השוואת היסטוגרמה הסתגלותית מוגבלת בניגודיות. במילים אחרות, הוא מתאים את ההיסטוגרמה של ערכי העוצמה לסוג הפצה מוגדר. הקישור למתמטיקה לפונקציה זו מצורף למטה להמשך קריאה.
- imbinarize: יוצר תמונה בינארית מתמונה בקנה מידה אפור על ידי הקצאת כל הפיקסלים מעל אינטנסיסטיות מסוימת ל- 1s והפיקסלים מתחת לערך זה 0. השתמשתי בפונקציה זו כדי לבדוק את הסף האופטימלי להפחתת רעשי רקמה ברקע.
שלב 3: קוד סף
לולאה משמשת לבינאריז של הממוגרפיה עם ספים משתנים. כדי לתת תצוגת תמונה גדולה יותר, לולאת ה- for מכילה את הקוד משלב 3 עד שלב 7. כך שכל תמונה בינארית תנותח לאיתור חריגות. בנוסף, לולאה זו עטופה בלולאה אחרת המייבאת תמונת ממוגרפיה חדשה ממאגר הנתונים בכל איטרציה.
שלב 4: מציאת חריגות לכל תמונה בינארית
עוד עיבדתי את התמונות הבינאריות באמצעות הפונקציה strel יחד עם imopen להסרת רעשי רקע. התמונה הבינארית מהשלב הקודם הופכת ומסוננת באמצעות השכונה שהוגדרה על ידי SE. לאחר מכן השתמשתי ב- bwlabel כדי לתייג כל אזור שבו יש לפחות 8 פיקסלים מחוברים.
פונקציית האביזרים לאזור שימשה למציאת מאפייני הצנטרואיד והאזור של כל נקודה שזוהתה על ידי bwlabel.
אז זוהו כל הנקודות הגדולות מ -500 פיקסלים באמצעות ismember. הצנטרואידים של הנקודות המזוהות שורטטו בתמונה שהציגה רק את הנקודות הגדולות בשטח מ -500. שטח מזוהה = ismember (מסומן, מעיד (sortedAreas> 500)); כתמים = מזוהים> 0;
שלב 5: שרטוט מיקום וגודל המסה המאובחנת להשוואה חזותית
רציתי לבדוק אם הכתמים שנמצאו על ידי bwlabel נכונים. עשיתי זאת בשתי דרכים. ראשית ניתחתי את הדיוק של המסווג שלי על ידי ביצוע השוואה חזותית. פשוט שרטטתי את הגודל והמיקום בפועל של החריגות (עיגול אדום) ואת המיקום שנקבע על ידי הקוד (x הכחול) בתמונת הממוגרפיה המעובדת מראש. שש התמונות שלמעלה מראות את ההשפעות של הגדלת ערך הסף בגווני אפור.
שלב 6: יישום שיטת ההשוואה השנייה
הדרך השנייה בה בדקתי את המסווג וערכי הסף הייתה על ידי קביעה אם המיקומים שמצפה המסווג נמצאים במרחק מסוים מקואורדינטות החריגות המאובחנות. שמרתי את הספים שעבורם לפחות אחת מהנקודות שזוהו נמצאות בטווח של 1.5*r מהחריגה הידועה לקובץ טקסט נפרד בשם Mammogram Data. המטרה לכך הייתה למצוא את הסף המינימלי הדרוש עבור המסווג שלי לזהות את החריגות.
שלב 7: ניתוח נתונים שנאספו
הפעלתי את התוכנית על כל תמונות הממוגרפיה הלא תקינות ונשארתי עם קובץ טקסט ענק של נתונים. על מנת למצוא את הסף הטוב ביותר עבור כל סוג של רקמות ארגנתי את הנתונים לפי סוג רקמות ושרטטתי היסטוגרמה של ערכי הסף לכל סוג רקמה. ערך הסף הנכון הוחלט על איזה סף מספק את התוצאות המדויקות ביותר עבור כל סוג רקמה. שמרתי את הנתונים האלה כדי להעלות אותם למסווג שלי.
שלב 8: הכנת מסווג משלך
לאחר שמצאתי את ערכי הסף המתאימים ביותר לכל סוג רקמה, ערכתי את הקוד המקורי שלי כדי שמשתמש יזין את מספר התמונה וסוג הרקמה כדי לבחור את הסף של תמונת הממוגרפיה. לאחר מכן שרטטתי את מיקום הממוגרפיה המאובחן עם המיקומים שנמצאו בתמונות הממוגרפיה המקוריות. רציתי להפוך את זה למהנה יותר ולכן תיכננתי פונקציה לחיתוך אזור עגול המקיף את ההחזר על ההשקעה. המשתמש יונחה לבחור נקודת מרכז וכמה נקודות המקיפות ביותר את ההחזר על ההשקעה. צירפתי כאן את שני קבצי matlab.
שלב 9: שיפורים? יש מחשבות?
בזמן שכתבתי את ההוראה הזו, אני מתחיל לראות שיפורים רבים שיכולתי לבצע במסווג, כגון מציאת דרכים להבחין בין סוגים שונים של מסות שזוהו על סמך ניתוח מרקם או שיפור הבדיקות שלי לדיוק של SandBoxProject. קוֹבֶץ. מכיוון שזה היה פרוייקט עם מועד אחרון הייתי חייב לעצור איפשהו, אבל אני מקווה שאצליח להשתמש בכישורי עיבוד התמונה שלמדתי ביישומים אחרים. כמו כן, צירפתי את הקובץ ששימש לעיבוד אצווה של כל תמונות הממוגרפיה הלא תקינות.