זיהוי תווים אופטי (באנגלית: Optical Character Recognition; בראשי תיבות: OCR) היא טכנולוגיה להמרת תמונה, טקסט מודפס וכתב יד שנסרקו על ידי סורק, למסמך תמלילממוחשב.
תוכנות לזיהוי תווים אופטי, מתמודדות על פי רוב בהצלחה עם המרה של תמונה בה מצולם או סרוק מסמך מודפס אך רק לעיתים נדירות גם בכתב יד. התהליך כרוך בזיהוי תו אחרי תו מבין התווים השונים המרכיבים את הטקסט. אולם, שיפור הברירה בין תווים שונים נעשה לרוב גם בעזרת שני כללים הקשורים להקשר התווים: הגבלת קטעי תמליל שונים לכאלה הכוללים רק תווים מקבוצה מסוימת (אותיות עבריות, אותיות לטיניות, אותיות ערביות וכיוצא בזה) והגדרת מילים ושפה לשם העדפת תווים היוצרים מילים בעלות כתיב מוכר (למשל, בקטע תמליל המוגדר ככתוב אנגלית יועדפו תווים היוצרים מילים עם כתיב אנגלי תקין אך בקטע תמליל המוגדר ככתוב בספרדית יועדפו תווים היוצרים מילים בעלות כתיב ספרדי תקין).
את הזיהוי ניתן לבצע בצורות שונות:
התאמה תבניתית – בשיטה זו שומרים על תבניות שונות של האותיות, ומנסים לבדוק איזו מהאותיות היא הדומה ביותר לתבנית.
תיאור מבני – בשיטה זו מחלקים את האות לחלקים שונים ויוצרים תיאור של חלקיה השונים של האות והיחסים שביניהם.
שימוש בלמידת מכונה או רשת עצבית מלאכותית – החל מ־2016 לערך, פתרונות ה־OCR המובילים בעולם נשענים על רשתות נוירונים מלאכותיות או למידה עמוקה. בגישה זו המכונה לומדת לזהות את התווים על ידי "לימוד" על בסיס התבוננות במיליוני תווים. יתרונה הגדול של השיטה הוא ביכולת להתאים אותה לכל שפה ולכל "סגנון כתב", כולל כתב יד. הביצועים של מערכות OCR הפועלות בגישה זו עולים על כל דרך פתרון מסורתית.
כדי למזער את כמות התווים השגויים שנוצרים בתהליך, מפעילה התוכנה לפעמים בדיקה מול מילון. במקרה זה התוכנה מכילה רובד נוסף שמרכיב את התווים המזוהים למילים שלמות, מחפש כל מילה במילון, ובמקרה שאינו מוצא אותה, מנסה לשנות תווים מסוימים (אלה שבהם ודאות הזיהוי נמוכה) עד שהמילה המזוהה נמצאת באוצר המילים של המילון.
שימוש בטכנולוגיה של זיהוי תווים אופטי, והמרת קובץ גרפי טקסטואלי לקובץ המורכב מתווים, נעשים בדרך כלל לשם המטרות הבאות:
עיבוד מחדש וסידור של התמליל, שילובו בתמליל מודפס עתידי, או הדפסתו מחדש בעיצוב אחר
אחסון נתונים טקסטואליים במחשב, תוך הנגשת האפשרות של חיפוש תוכנם לחיפוש, למשל בתוכנת החיפוש הפנימית או במנועי חיפוש כדוגמת גוגל
שינוי עיצוב התמליל לשם הפיכתו לנגיש עבור אנשים עם לקויות:
הדפסת התמליל או הצגתו על מרקע המחשב עבור אנשים עם לקות ראייה באותיות גדולות על דף צר, בצבעים בעלי ניגודיות חזקה (למשל צהוב על שחור), תוך הגדלת הרווחים בין המילים או בין השורות ביחס לגודל המילים, תוך ניקוי כתמים מהדף המקורי וכיוצא בזה.
דגימת התמונה כדי למצוא איזה גוון מבדיל בין הטקסט לרקע התמונה.
חיפוש כל הצורות הכהות (או הבהירות) בתמונה ושמירתן במבנה נתונים נניח: רשימה מקושרת. צורה הנשמרת ברשימה היא רשימה מקושרת המכילה מיקום נקודות מגבול הצורה שנמצאה בתמונה.
זיהוי שורות הטקסט ויישור השורה כך שהאותיות יהיו אופקיות. שלב זה פותר בעיות של דפים שסריקתם נעשתה בזווית, מה שמקשה על התוכנה לזהות את צורת האותיות בצורה נכונה.
ניקוי של הרקע מלכלוך. במקרה של טקסט עברי מנוקד מאותר גם הניקוד ונמחק, כדי להקל על זיהוי האותיות עצמן.
הפרדת השורות השלמות לאותיות ומילים על פי מרווחים.
זיהוי הגופן (פונט) שבו הודפס הטקסט, על ידי הפעלת אלגוריתם (איטי) המזהה מאפיינים של גופנים שונים, ובוחר את הגופן הקרוב ביותר.
זיהוי האותיות הבודדות לפי המאפיינים המפרידים בין האותיות בהתאם לגופן הנבחר (זהו שלב מהיר).
חיפוש המילים המזוהות במילון (אופציונלי). בכל מקרה של מילה שאיננה במילון, מבוצע ניסיון להחליף אותיות באותיות קרובות מבחינת מאפיינים, עד הגעה למילה שנמצאת במילון.
במקרה של מקור שמכיל גם תמונות, יצירת קובץ שבו משולב הטקסט עם התמונות הסרוקות.
חלק ממאפייני האותיות הם פשוטים, כדוגמת מיקומי קווים אופקיים ואנכיים, או משקל השחור בתתי האזורים השונים בתוך הריבוע המכיל את האות, רוחב האות וגובהה, חריגה מעל או מתחת לקו השורה וכדומה. במקרים בהם המרחק בין מאפייני אותיות דומות הוא גדול יחסית, ההפרדה היא אופטימלית.
במקרים בהם התוכנה היא כזו שמזהה מילים, ניתן להקטין את כמות השגיאות בתהליך אם ניתן לבדוק האם המילה הנבחרת מתאימה לתוכן, כלומר האם במיקום בו היא זוהתה, היא בהקשר סביר לטקסט. הבנת ההקשר היא מורכבת ונעשית על ידי בדיקה האם המילה ממלאת תפקיד חיבורי הגיוני במשפט, או בשיטות סטטיסטיות – האם המילים בקרבתה מופיעות במקום אחר או במסמכים אחרים ובאיזו הסתברות.
תוכנות זיהוי מתוחכמות בנויות כרשת עצבית, שהיא תהליך תכנותי המבוסס על התנסות ולמידה. תוכנה כזו מציגה את הטקסט המזוהה למשתמש, שמתקן שגיאות בזיהוי, והתוכנה לומדת את השגיאות ומנסה להקטין את הסיכוי שתחזורנה בעתיד. ליכולת זו שימוש רק אם סוג הטקסטים שעוברים זיהוי הם דומים מבחינות שונות – גופן הדפסה, גודל אות, אוצר מילים ועוד.
בזיהוי כתב יד אי אפשר להשתמש באלגוריתם המשווה את מאפייני האות לגופן ולכן משתמשים בשיטות זיהוי אחרות. אחת מהשיטות היא יצירת תמונה בצורת מלבן (בשחור לבן) של מופעים שונים של אותה אות כתב, לדוגמה: כל שורה מכילה 10 מופעים שונים (תמונות) של אותה אות, וכל שורה מתאימה לאות שונה. כל מופע של אות חסום במלבן (או במעגל),ומתוח לגובה ולרוחב כך שהוא יתאים בדיוק לגודל מלבן המופע. כל המלבנים בשורה גודלם קבוע, והם נמצאים במקום קבוע בתמונה. צבע מופע האות במלבן: שחור, צבע המלבן: לבן, וצבע הרקע: שחור. כדי למצוא מה מאפיין כל אות, התוכנה מחשבת בזמן הלימוד (השלב האיטי), כמה פעמים נחתכת האות על ידי קו ישר העובר בין שתי נקודות על מלבן החוסם את האות. התוכנה בונה קובץ של מספרים שלמים, המכיל את התכונות הטובות ביותר להבדלה בין אות אחת לשנייה. לדוגמה: תכונה מספר 1234 הוא קו החותך את כל מופעי האות שמספרה 15, 3 פעמים, ואת מופעי האות שמספרה 7, 0 פעמים. בזמן הזיהוי (השלב המהיר) התוכנה יוצרת מלבן חוסם סביב תמונת אות המיועדת לזיהוי, קוראת את קובץ התכונות הטובות ביותר, טוענת את תוכנו במערך, ובודקת כמה פעמים נחתכת האות על ידי הקווים המגדירים את התכונות הטובות ביותר, ולפי הנתונים הללו בודקת לאיזו אות התמונה הזאת מתאימה ביותר.
הערות:
מיקום נקודה מוגדר על ידי זוג מספרים: אחד מהם קובע היכן היא נמצאת ביחס לרוחב תמונת המופעים, והשני קובע היכן היא נמצאת ביחס לאורכה.
טעינת הקובץ למערך לכאורה היא מיותרת, ומבזבזת זמן ומקום בזיכרון המחשב. אבל תהליך החיפוש, מהיר במערך מאשר בקובץ.
המערך הוא רב ממדי, בעל 4 ממדים: 2 הממדים הראשונים היא מטריצה ריבועית באורך ורוחב של מספר האותיות, בה כל אות מושוות לאות אחרת. הממד הבא הוא מספר התכונות החשובות ביותר (נניח: עד 3 תכונות מבדילות באופן מוחלט בין 2 אותיות). הממד הבא אורכו 3 מספרים: מספר התכונה לדוגמה: ישר מספר 1234, הציון שניתן לאות נניח: 2 שמשמעותו חותך את האות 2 פעמים, והמספר השלישי הציון שניתן לאות המושוות, נניח: 0, שמשמעותו: חותך את האות 0 פעמים.
כשנותנים לתוכנה לחשב באופן אוטומטי מה הן 3 התכונות עם הציון הטוב ביותר, היא נוטה למצוא 3 ישרים הקרובים זה לזה, ובדרך כלל מיצגים את אותה התכונה, ולכן כדי למצוא את 3 התכונות הטובות ביותר נהוג לכתוב שגרה, הבוחרת 3 ישרים המחברים נקודות רחוקות יחסית.
לכל אות נותנים 10 מופעים כמה שאפשר שונים יותר, כדי שהתוכנה תלמד את התכונות המשותפות, ולא תגדיר אות על ידי תכונה מטעה. לדוגמה: נניח שבכל 10 המופעים של האות 'ג' בכתב, האות נכתבה כשהחלק העליון שלה נוטה ימינה. בשלב הלימוד התוכנה תיצור קו המקשר שתי נקודות: נקודה על הצלע העליונה של המלבן החוסם את האות, קרוב לפינה הימנית עליונה, ונקודה על אמצע הצלע הימנית של המלבן. בכל המופעים האות 'ג' לא תיחתך, כתוצאה מכך התוכנה תלמד שהאות 'ג' חלקה העליון נוטה ימינה. ולכן התוכנה לא תצליח לזהות 'ג' שחלקה העליון קו אנך (אות 'ג' רגילה).
אם אחד ממופעי האות הוא כל כך שונה, שהוא נראה כאילו הוא אות אחרת, הוא לא יאפשר לתוכנה ללמוד את התכונות המאפיינות את האות. במקרה כזה צריך ליצור בתמונת המופעים, שתי שורות המגדירות את אותה אות: שורה של המופעים הרגילים של אותה אות, ושורה של מופעים הדומים למופע השונה.
בצג המחשב, קו אלכסוני דק, מוצג לפעמים כסדרה של מלבנים הנוגעים זה בזה בפינות. סביר שאם ננסה לחתוך קו כזה בקו אלכסוני דק אחר, התוצאה תהייה שהקווים לא נחתכו. כי חיתוך שני קווים, פירושו שבנקודה מסוימת קו אחד עלה על קו אחר, אבל במקרה שלנו לא חייב להיות שבנקודת החיתוך, מלבן מקו אחד עלה על מלבן מקו שני. לכן בתוכנה כותבים שגרה להרחבת הקו בצורה כזו: עוברים על כל הנקודות בתמונה (שהן בעצם מלבנים קטנים) ואם מוצאים 4 מלבנים צמודים (2 למעלה ו־2 למטה) שמתוכם 2 לבנים ו־2 שחורים, כאשר 2 השחורים נוגעים זה בזה רק בפינה אחת (כלומר עומדים באלכסון), משנים אחד מהמלבנים הלבנים לצבע שחור.
תכונה המתקבלת מקו חיתוך העובר ליד מרכז המלבן החוסם את האות, מקבלת ציון גבוה מתכונה המתקבלת על ידי קו המחבר שתי נקודות בקרבת פינת המלבן. כי עיקר תכונות האות מוגדרות על ידי מרכזה. לדוגמה: בין האותיות 'ב', 'ה', 'כ' ו־'פ' בכתב, אפשר להבדיל, בעיקר על פי מרכזם.
כדי לחסוך בזיכרון ולהאיץ את החישוב, מחשבים את טיב התכונה בעזרת חישוב במספרים שלמים ועיגול התוצאה. לדוגמה: נניח שאות אחת נחתכה בעזרת קו של תכונה מסוימת ב־9 מתוך 10 המופעים. התוכנה תבצע ממוצע במספרים שלמים:
= הממוצע
אבל להגיד שאם במקרה אחד האות לא נחתכה היא לא תיחתך אף פעם זו שגיאה משמעותית. לכן במקרה זה מעגלים למעלה והתוצאה יוצאת:
= הממוצע
התוצאה מלמדת שלא מתחשבים במקרה אחד חריג. אבל בכל זאת זה לא טוב, כי נראה שהתוכנה תיכשל בזיהוי של אחד מתוך עשרה מקרים!
במציאות הזיהוי הרבה יותר מדויק ממה שנדמה. כי יש עוד תכונות המגבות במקרה שגוי. ובנוסף לכך החישוב מדמה את הקריאה של האדם,
כי כשאנו קוראים אנו בהכרתנו מעגלים.
הזיהוי הצורני לא עובד על כל האותיות, למשל הוא לא עוזר להבחין בין האותיות במילה "יון". לכן יוצרים תמונת מופעי אותיות נוספת, כמו בתמונת מופעי האותיות לזיהוי צורת האות. בשונה מתמונת המופעים לזיהוי צורה, כל מופע הוא מילה בת 3 אותיות. כדי שהמחשב יוכל להבחין בין 3 האותיות, האות הנלמדת מוקפת בקו עקום צהוב, ושתי האותיות הנלוות, כל אחת בנפרד, מוקפת בקו עקום כחול. שלוש האותיות נמתחות בתוך מלבן המופע, כך שהוא יתחלק ל־3 חלקים מבחינת גובהו: בשליש העליון ימצאו חלקי האותיות מעל השורה, באמצע ימצאו חלקי האותיות שבתוך השורה, ובחלק התחתון חלקי האותיות שמתחת השורה. בשלב הלימוד המחשב יוצר קובץ התכונות הטובות ביותר ביחס לשורה. התכונות הן:
האם האות נחתכה על ידי קו מקביל לשורה (האם קו צהוב נחתך?, 16 תכונות בגבהים שונים).
יחס גובה האות לגובה השורה באחוזים (באחוזים, כדי שבקובץ התכונות ישמרו מספרים שלמים. גובה האות הוא גובה המלבן החוסם אותה).
יחס אורך האות לגובה השורה באחוזים (רוחב האות הוא רוחב המלבן החוסם אותה).
מספר החלקים של האות (באות 'ה' שני חלקים, הספרה '8' מוקפת בקו אחד רציף, ולכן מכילה רק חלק אחד).