MATLAB OCR 7-Segment Part5

Step 4 เชื่อมต่อ 7 Segment

ก็ตามชื่อนั่นแหละครับ ตัวเลข 7 Segment 1 ตัว จะมีส่วนประกอบอยู่ 7 ส่วน เรียงลำดับจาก A ถึง F ตามนี้ครับ





ซึ่งเราจะเห็นว่าแต่ละส่วนนั้น มันไม่ได้เชื่อมต่อกันเลย (ถ้ามันเชื่อมต่อกันแล้วจะเรียกเป็นส่วนได้ไงเนอะ ฮ่าๆๆ) ซึ่งตรงจุดนี้แหละครับ ที่มันทำให้เกิดปัญหา เพราะว่าโปรแกรมมันจะไม่รู้ว่า ทั้ง 7 ส่วนนี้มันคือตัวเลขตัวเดียวกันนะ เพราะไม่ใช่ว่าตัวเลขทุกตัวจะมองเห็นครบ 7 ส่วนเสมอ เช่น เลข 1 แสดงด้วย 2 ส่วนเท่านั้น คือ B กับ C

ดังนั้นเราจะมาทำให้แต่ละส่วนมันเชื่อมต่อกัน โดยใช้วิธีการทาง image processing ที่เรียกว่า "dilate" ซึ่งจะทำให้ภาพขยายตัวออกตามแนวโครงสร้างของมันครับ

แต่ปัญหาคือ แล้วเราจะขยายมันออกไปเท่าไรละ?

ถ้าเราจะให้โปรแกรมทำงานได้ถูกต้องกับภาพนี้ภาพเดียว มันก็ไม่เป็นปัญหาหรอกครับ เราก็แค่ค่อยๆ ลองปรับไปเรื่อยๆ จนเห็นมันเชื่อมต่อกันหมด แค่นั้นก็พอละ

แต่ถ้าเราจะให้โปรแกรมของเรามันทำงานได้กับทุกภาพ เราก็ต้องให้โปรแกรมมันคำนวณเอง ว่าจะปรับขยายไปเท่าไร ซึ่งในจุดนี้ เราจะใช้คำสั่ง bwlabel เข้ามาช่วยนับครับ

โดยคำสั่ง bwlabel จะคืนค่ามา 2 ค่าคือ label ของภาพ และ จำนวน label งั้นเรามาลองทดสอบกันดูนะครับว่าภาพ 7-segment ของเรามันมีกี่ label โดยพิมพ์คำสั่ง ต่อไปนี้ใน command window


จะเห็นว่าตัวเลขทั้ง 10 ตัวนี้ มีจำนวน label ถึง 49 label เลยนะครับ ซึ่งก็เท่ากับจำนวนส่วนของ 7-Segment ในแต่ละรูปรวมกันนั่นแหละ (ไม่เชื่อก็ลองนับดูนะ)

แต่ตาของคนเรา มองเห็นแค่ว่ามันเป็นตัวเลข 10 ตัวเท่านั้น ดังนั้น เราก็จะให้มันขยายตัวออกเรื่อยๆ จนกว่าจะเหลือจำนวน label เท่ากับที่ตาเรามองเห็น ซึ่งเราได้เขียนฟังก์ชันนับจำนวนตัวเลขเอาไว้แล้วในขั้นตอนก่อนหน้านี้ (Step 3)

ดังนั้น เราก็จะใช้คำตอบจาก step 3 นั่นแหละครับมาเป็นเงื่อนไข โดยเขียนโค้ดดังนี้

%Grow 7 segment
for m=1:50
    nbw = bwmorph(xbw,'dilate',m);
    [a,b] = bwlabel(nbw);
    if(b<=nb)
        break;
    end
end
nbw = bwmorph(nbw,'thin',m);

จากนั้นเราลอง imshow(nbw) ขึ้นมาดูนะครับ เราก็จะเห็นว่ามันเชื่อมต่อกันเรียบร้อยแล้ว


แค่นี้ก็เสร็จเรียบร้อยแล้วครับ

ขั้นตอนที่เหลือก็คือ กระบวนการเทรนนิ่ง ให้โปรแกรมรู้จำตัวเลขได้ ซึ่งก็มีหลายวิธี อย่างเช่น

- ใช้นิวรอล
https://github.com/subho406/Handwritten-Digit-Recognition

- ใช้ Hog feature classify
https://www.mathworks.com/help/vision/examples/digit-classification-using-hog-features.html

จริงๆ ก็อีกหลายวิธีแหละครับ หาดูได้ใน google เลย หรือไม่ก็รอดูบทความต่อๆ ไปที่ผมจะเขียนก็ได้ครับคิดว่าน่าจะมีเรื่อง การรู้จำตัวเลข และตัวอักษร รวมอยู่ด้วยนะ (ตอนนี้ยังไม่ได้เขียน แค่คิดไว้เฉยๆ ครับ ฮ่าๆๆๆ)


<< Part4

ความเห็น

โพสต์ยอดนิยมจากบล็อกนี้

การแก้สมการ Differential ด้วย MATLAB

การหาค่าเฉลี่ยโดยไม่ต้องเก็บค่า

การเปรียบเทียบข้อมูล