הבהרת תמונות

  • פותח הנושא it-I
  • פורסם בתאריך

it-I

New member
הבהרת תמונות

ברצוני להבהיר תמונה בגווני אפור (grayscale). אני יודע כיצד לגשת למידע, וכיצד לשנות אותו. השאלה היא כיצד, מתמטית, ניתן לבצע את הפעולה? 0 מייצג שחור, ו-255 - לבן. ניסיתי לחלק ב-2, ולהוסיף 127. זה לא עבד טוב. למישהו יש רעיון אחר? תודה מראש.
 

ChipsMan

New member
הממ...

ניסית פשוט להכפיל את כל המספרים בפקטור קבוע? לדוגמא, להכפיל את כולם ב- 1.3. לכל מספר שחורד מהתחום, תקבע שערכו יהיה 255
 

it-I

New member
בוודאי, זה היה נסיון ראשון

אבל זה הופך את הבהירים - ללבנים (כי הם במספרים הגבוהים), ואת הכהים משאיר כהים (כי זה במספרים הנמוכים). חשוב למשל על שחור - 0. הכפלה ב-1.3 משאירה אותו ב-0. רעיון אחר?
 

עידו123456

New member
נסה דבר כזה:

כעת יש לך פונקציה לינארית שעל ציר ה-X נעה בין שחור ללבן (סה"כ 255 גוונים שונים) ובציר Y יש לך את הערך המספרי של כל אחד מהגוונים (שוב 0-255) הפונקציה היא y=x. מה שאני מציע זה תבחר את הגוון שאותו אתה רוצה להעביר את השחור אליו (נגיד מגוון 0 - שחור לגוון 25) וחשב את משוואת הישר שעוברת מהנקודה (25,0) לנקודה ( (255,255
y=(230x/255)+25​
כעת יש לך משוואה ליניארית שנותנת לך את הערך החדש של כל גוון. אתה יכול גם לסבך את זה על-ידי פונקציה ממעלה גדולה מ1- שתיצור עקום ולא קו ישר.
 

ChipsMan

New member
במילים אחרות..

בלי יותר מדי מספרים.. יש לך פונקציה שמעבירה צבעים מתמונת המקור לתמונת היעד, והיא הפונקציה הלינארית
y=ax+b​
בחר צבע שאליו תרצה להעביר את השחור, בחר צבע שתרצה להעביר ללבן, וקיבלת שתי משוואות בשני נעלמים. תמצא את a ואת b ותקבל את הפונקציה שאתה מחפש.
 

voguemaster

New member
אולי נירמול מחדש ?

הנה רעיון. קח כל עוצמה של פיקסל ותבצע את החישוב הבא עבורו:
const int MAX = 255; // intensity ranges int nMax; // before normalization compute the most intense pixel // place the value in nMax // renormalize pixel_intensity = round( pixel_intensity * MAX / nMax);​
מה שאתה עושה פה בעצם זה שאתה מחשב פקטור הכפלה לכל פיקסל. פקטור ההכפלה הזה מתאים כך שאחרי החישוב הפיקסל עם העוצמה הכי חזקה יהפוך לעוצמה מלאה (255) וכל השאר יקבלו scaling מתאים. מעבר לכך, אם אתה משנה את MAX כך שיהיה 64 נניח אתה גורם לפקטור גדול יותר. המשמעות היא כאילו הקטנת פי 4 את כמות הגוונים האפשריים בתמונת ה-grayscale שלך, מה שבתורו יביא לכך שהגוונים יהיו קרובים יותר אחד לשני. תשחק עם זה קצת
 

רועי י

New member
אתה צריך לבצע

מה שנקרא מתיחת היסטוגרמה, או יותר טוב איזון היסטוגרמה. מתיחת ההיסטוגרמה מבוצעת על ידי מתיחה של התחום [a,b] לתחום [0,255]. מבחינה מתמטית זה נראה ככה: לכל פיקסל עם רמת אפור X, רמת האפור החדשה שלו Y תהיה: (Y = 255*(X-a)/(b-a איזון היסוגרמה הוא משהו טיפה יותר מורכב שכולל קצת הסתברות. אם אתה מעוניין אני ארחיב בשבילך בנושא. רועי.
 

it-I

New member
תודה רבה לכולכם על ההתייחסות

אשמח לשמוע ממך, רועי, עוד בענין איזון ההיסטוגרמה. תודה!
 

רועי י

New member
איזון היסטוגרמה

בגדול הרעיון הוא כזה: אנחנו רוצים שפונקציית הפילוג של ההיסטוגרמה תומר להיות פונקצית פילוג אחידה. אם אתה מכיר קצת הסתברות, אז אנחנו בעצם מתייחסים למשתנה אקראי שיכול לקבל את ערכי רמות האפור בתחום ואנו רוציה להעביר את התמונה טרנספורמציה על מנת שהפונקציה תהפוך להיות פונקציית הסתברות אחידה. בכל מקרה, גם אם לא ברור לך לגמרי מה שהתכוונתי אליו, אתה צריך לבצע: עבור רמת אפור X, רמת האפור החדשה תהיה: (Y = F(X כאשר (F(X היא סכימה על ההסתברויות של ערכי רמת האפור מ-0 ועד X, כלומר, סכימה של כל רמות האפור הנ"ל כשעבור כל רמת אפור אתה צריך לחלק את מספר הפיקסלים שהיא הופיעה בהן במספר הפיקסלים הכללי בתמונה. לפעמים התוצאות טובות יותר אם קודם מבצעים מתיחה ואז איזון של ההיסטוגרמה. מקווה שהבנת כל מה שכתבתי, ואם לא אתה מוזמן לשאול. רועי.
 
למעלה