<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yohita Polass</title>
    <description>The latest articles on DEV Community by Yohita Polass (@yohita).</description>
    <link>https://dev.to/yohita</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3028871%2F35ebcc62-8a3d-42c9-992f-573ce7d7d059.gif</url>
      <title>DEV Community: Yohita Polass</title>
      <link>https://dev.to/yohita</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yohita"/>
    <language>en</language>
    <item>
      <title>การแยกและบันทึกตัวอักษรจากภาพด้วย Python และ OpenCV</title>
      <dc:creator>Yohita Polass</dc:creator>
      <pubDate>Tue, 08 Apr 2025 09:54:32 +0000</pubDate>
      <link>https://dev.to/yohita/kaaraeykaelabanthuektawaksrcchaakphaaphdwy-python-aela-opencv-51le</link>
      <guid>https://dev.to/yohita/kaaraeykaelabanthuektawaksrcchaakphaaphdwy-python-aela-opencv-51le</guid>
      <description>&lt;p&gt;โดยปกติแล้วเมื่อเราต้องการที่จะข้อความจากภาพมานั้น เพื่อน ๆ คงนึกถึง Google Translate ที่จะสามารถอัพโหลดรูปภาพลงไปได้หรือหยิบกล้องมือถือ ขึ้นมาถ่ายจากนั้นก็จะได้คำแปลออกมาหรืออยากได้ข้อความนั้น ๆ แต่ว่าวันนี้เราจะพามาดูกันว่า เบื้องหลังเหล่ามีการทำงานแบบใด แต่ในบทความนี้ยังถือว่าเป็นจุดเล็ก ๆ และยังห่างไกลกับการทำงานของ Google Translate ทำ&lt;/p&gt;

&lt;p&gt;OK งั้นเรามาเริ่มกันเลยดีกว่า ในบทความนี้เราจะพูดถึงเทคนิคในการประมวลผลภาพ (Image Processing) และ OpenCV ซึ่งน่าจะคุ้นหูกันมาบ้างแล้ว เพื่อใช้ในการแยกตัวอักษรที่อยู่ในภาพออกมาเป็นภาพย่อยที่ละตัว จากนั้นก็จะทำการบันทึกภาพเป็นไฟล์รูปภาพแยกที่ละตัวอักษรซึ่งเป็นพื้นฐานสำคัญของการทำงานด้าน OCR (Optical Character Recognition)&lt;/p&gt;

&lt;p&gt;งั้นขอเพิ่มส่วนอธิบาย OCR หรือ การรู้จำอักขระด้วยแสง (Optical Character Recognition) : การรู้จำอักขระด้วยแสง หรือมักเรียกอย่างย่อว่า OCR คือกระบวนการทางกลไกหรือทางอิเล็กทรอนิกส์เพื่อแปลภาพของข้อความจากการเขียนหรือจากการพิมพ์ ไปเป็นข้อความที่สามารถแก้ไขได้โดยเครื่องคอมพิวเตอร์ การจับภาพอาจทำโดยเครื่องสแกนเนอร์ กล้องดิจิทัล โอซีอาร์เป็นสาขาวิจัยในการรู้จำแบบ, ปัญญาประดิษฐ์, และคอมพิวเตอร์วิทัศน์&lt;/p&gt;

&lt;p&gt;อันดับแรกเลยนั้นก็คือการติดตั้ง library&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install imutils
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เป็น library Python เสริมสำหรับ OpenCV ที่มีฟังก์ชันอำนวยความสะดวก เช่น&lt;br&gt;
การเรียงลำดับ contours, การย่อ/ขยายภาพ (resize), การหมุนภาพอัตโนมัติ, การแปลงองศา/พิกัด ซึ่งจะเป็น library หลักของเราในการทำงานในครั้งนี้&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;ขั้นตอนที่ 1 โหลดภาพ และแปลงเป็น Grayscale&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import cv2
from imutils import contours

image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F614iyyemp3wrwa0avuqp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F614iyyemp3wrwa0avuqp.png" alt="Image description" width="459" height="211"&gt;&lt;/a&gt;&lt;br&gt;
เราจะเริ่มจากการโหลดภาพที่มีตัวอักษรเข้ามาเข้ามาและแปลงจากภาพสีให้กลายเป็นภาพขาวดำ เพื่อให้สามารถนำไปประมวลผลต่อได้ง่ายขึ้น&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;ขั้นตอนที่ 2 ใช้ Otsu’s Threshold เพื่อแยกพื้นหลังกับตัวอักษร&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;thresh = cv2.threshold(
    gray, 0, 255,
    cv2.THRESH_OTSU + cv2.THRESH_BINARY_INV
)[1]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgn8v1qqhh4duc3zge1tv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgn8v1qqhh4duc3zge1tv.png" alt="Image description" width="546" height="254"&gt;&lt;/a&gt;&lt;br&gt;
ต่อมานั้นเราจะใช้ Otsu’s Threshold ที่ขะช่วยกำหนดค่ากลางอัตโนมัติเพื่อแยกพื้นหลังกับตัวอักษร โดยเราสั่งให้ทำ Invert (THRESH_BINARY_INV) เพื่อให้ตัวอักษรเป็นสีขาวและพื้นหลังเป็นสีดำ&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;ขั้นตอนที่ 3 หาขอบเขตของตัวอักษรและเรียงจากซ้ายไปขวา&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cnts = cv2.findContours(
    thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
cnts, _ = contours.sort_contours(cnts, method="left-to-right")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เราจะใช้ cv2.findContours() เพื่อหาขอบเขตของตัวอักษรแต่ละตัว จากนั้นก็ขะใช้ sort_contours() จาก library imutils เพื่อเรียงจากซ้ายไปขวา ซึ่งเหมาะกับภาษาอังกฤษที่อ่านจากซ้ายไปขวา&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;ขั้นตอนที่ 4 ตัดตัวอักษรทีละตัวด้วย ROI และบันทึกภาพ&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ROI_number = 0
for c in cnts:
    area = cv2.contourArea(c)
    if area &amp;gt; 10:
        x,y,w,h = cv2.boundingRect(c)
        ROI = image[y:y+h, x:x+w]
        cv2.imwrite('ROI_{}.png'.format(ROI_number), ROI)
        cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
        ROI_number += 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg2y0umpa2lwc4nlp6ikb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg2y0umpa2lwc4nlp6ikb.png" alt="Image description" width="672" height="309"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm3dzymss664v8crgn5xh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm3dzymss664v8crgn5xh.png" alt="Image description" width="800" height="245"&gt;&lt;/a&gt;&lt;br&gt;
วนลูปในแต่ละ Contour ตรวจสอบว่า area มากกว่า 10 เพื่อกรอง noise ออก&lt;br&gt;
ตัดสี่เหลี่ยมล้อมรอบตัวอักษร Bounding Box &lt;br&gt;
บันทึกภาพแต่ละตัวเป็นไฟล์ ROI_0.png, ROI_1.png, ...&lt;br&gt;
และในขณะเดียวกันก็ วาดกรอบสีเขียว แสดงผลลัพธ์ด้วย cv2.rectangle() เพื่อดูว่าโปรแกรมตรวจจับได้ถูกต้องหรือไม่&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;ขั้นตอนที่ 5 แสดงผลลัพธ์&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.waitKey()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;แสดงภาพ Threshold และแสดงภาพจริงที่มีกรอบครอบตัวอักษร&lt;br&gt;
จากนั้นรอให้ผู้ใช้กดปุ่มเพื่อปิดหน้าต่าง&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;ตัวอย่างเพิ่มเติม&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;เราจะลองใช้ภาพอื่น ในการในการทดสอบว่า บทความการแยกและบันทึกตัวอักษรจากภาพด้วย Python และ OpenCV นี้ สามารถนำมาใช้งานจริงได้หรือไม่&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;ขั้นตอนที่ 1 โหลดภาพ และแปลงเป็น Grayscale&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import cv2
from imutils import contours

image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqe402ijilu9m3d04pp33.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqe402ijilu9m3d04pp33.png" alt="Image description" width="800" height="140"&gt;&lt;/a&gt;&lt;br&gt;
เราจะเริ่มจากการโหลดภาพที่มีตัวอักษรเข้ามาเข้ามาและแปลงจากภาพสีให้กลายเป็นภาพขาวดำ เพื่อให้สามารถนำไปประมวลผลต่อได้ง่ายขึ้น&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;ขั้นตอนที่ 2 ใช้ Otsu’s Threshold เพื่อแยกพื้นหลังกับตัวอักษร&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;thresh = cv2.threshold(
    gray, 0, 255,
    cv2.THRESH_OTSU + cv2.THRESH_BINARY_INV
)[1]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxfx6juqtov61t75mi7do.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxfx6juqtov61t75mi7do.png" alt="Image description" width="800" height="138"&gt;&lt;/a&gt;&lt;br&gt;
ต่อมานั้นเราจะใช้ Otsu’s Threshold ที่ขะช่วยกำหนดค่ากลางอัตโนมัติเพื่อแยกพื้นหลังกับตัวอักษร โดยเราสั่งให้ทำ Invert (THRESH_BINARY_INV) เพื่อให้ตัวอักษรเป็นสีขาวและพื้นหลังเป็นสีดำ&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;ขั้นตอนที่ 3 หาขอบเขตของตัวอักษรและเรียงจากซ้ายไปขวา&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cnts = cv2.findContours(
    thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
cnts, _ = contours.sort_contours(cnts, method="left-to-right")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เราจะใช้ cv2.findContours() เพื่อหาขอบเขตของตัวอักษรแต่ละตัว จากนั้นก็ขะใช้ sort_contours() จาก library imutils เพื่อเรียงจากซ้ายไปขวา ซึ่งเหมาะกับภาษาอังกฤษที่อ่านจากซ้ายไปขวา&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;ขั้นตอนที่ 4 ตัดตัวอักษรทีละตัวด้วย ROI และบันทึกภาพ&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ROI_number = 0
for c in cnts:
    area = cv2.contourArea(c)
    if area &amp;gt; 10:
        x,y,w,h = cv2.boundingRect(c)
        ROI = image[y:y+h, x:x+w]
        cv2.imwrite('ROI_{}.png'.format(ROI_number), ROI)
        cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
        ROI_number += 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fla6wymiquom3jzwpsanu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fla6wymiquom3jzwpsanu.png" alt="Image description" width="800" height="139"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0vscg8hpvb5khcil8icj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0vscg8hpvb5khcil8icj.png" alt="Image description" width="680" height="250"&gt;&lt;/a&gt;&lt;br&gt;
วนลูปในแต่ละ Contour ตรวจสอบว่า area มากกว่า 10 เพื่อกรอง noise ออก&lt;br&gt;
ตัดสี่เหลี่ยมล้อมรอบตัวอักษร Bounding Box &lt;br&gt;
บันทึกภาพแต่ละตัวเป็นไฟล์ ROI_0.png, ROI_1.png, ...&lt;br&gt;
และในขณะเดียวกันก็ วาดกรอบสีเขียว แสดงผลลัพธ์ด้วย cv2.rectangle() เพื่อดูว่าโปรแกรมตรวจจับได้ถูกต้องหรือไม่&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;ขั้นตอนที่ 5 แสดงผลลัพธ์&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.waitKey()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs2q1dkg00r0gs3bcvuc6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs2q1dkg00r0gs3bcvuc6.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
แสดงภาพ Threshold และแสดงภาพจริงที่มีกรอบครอบตัวอักษร&lt;br&gt;
จากนั้นรอให้ผู้ใช้กดปุ่มเพื่อปิดหน้าต่าง&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Code ทั้งหมด&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import cv2
from imutils import contours

# Load image, grayscale, Otsu's threshold
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY_INV)[1]

# Find contours, sort from left-to-right, then crop
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
cnts, _ = contours.sort_contours(cnts, method="left-to-right")

# Filter using contour area and extract ROI
ROI_number = 0
for c in cnts:
    area = cv2.contourArea(c)
    if area &amp;gt; 10:
        x,y,w,h = cv2.boundingRect(c)
        ROI = image[y:y+h, x:x+w]
        cv2.imwrite('ROI_{}.png'.format(ROI_number), ROI)
        cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
        ROI_number += 1

cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.waitKey()

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;สรุปผล&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;สรุปแล้วในบทความนี้ เราได้แสดงให้เห็นแล้วว่าสามารถที่จะใช้การประมวลผลภาพ (Image Processing) และ OpenCV ในการแยกและบันทึกตัวอักษรจากภาพได้จากตัวอย่างเพิ่มเติมที่มีซึ่งในบทความนี้ เราจะได้เรียนรู้การใช้ OpenCV เพื่อแปลงภาพให้พร้อมใช้งาน&lt;br&gt;
แยกตัวอักษรจากภาพโดยใช้ threshold และ contours ตัดและบันทึกภาพตัวอักษรออกมาเป็นไฟล์ย่อย โดยเทคนิคนี้สามารถใช้เป็น ขั้นตอนเริ่มต้นในการเตรียมข้อมูลสำหรับระบบ OCR ได้ หรือจะใช้แบบ standalone เพื่อแยกข้อความจากภาพก็ได้เช่นกัน หรือนำไปต่อยอดในงานต่อ ๆ ไป&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;References&lt;/strong&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://stackoverflow.com/questions/60515216/extracting-and-saving-characters-from-an-image" rel="noopener noreferrer"&gt;https://stackoverflow.com/questions/60515216/extracting-and-saving-characters-from-an-image&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>python</category>
    </item>
  </channel>
</rss>
