DEV Community

narathip1071
narathip1071

Posted on

การหาชนิดของเหรียญด้วยการประมวลผลภาพ (image processing) โดยใช้ภาษา Python

เมื่อคุณต้องการนับสิ่งของที่มีขนาดต่างกันจากภาพที่เราถ่ายมา เช่น รูปของใช้ รูปคนที่มีความสูงต่างกัน หรือรูปภาพของเหรียญขนาดที่แตกต่างกัน คุณสามารถทำได้ง่ายๆเพียงแค่ใช้ image processing

บทความนี้จะมาบอกเคล็ดลับในการใช้ image processing ในการหาขนาดของเหรียญและแสดงชนิดของเหรียญ โดยใช้ภาษา Python และรันโค้ดผ่าน Google Colab

ตัวอย่างรูปภาพ

ภาพเหรียญขนาดต่างๆ

คุณสามารถทำตามขั้นตอนได้ดังนี้

ขั้นตอนที่ 1 นำเข้าไลบรารี OpenCV และ Matplotlib

การ import library OpenCV (Open Source Computer Vision Library) เป็น library สำหรับการประมวลผลภาพและวิดีโอ ส่วนการ import module pyplot ซึ่งเป็นส่วนหนึ่งของ library Matplotlib จะเป็น library สำหรับการวาดกราฟและภาพแสดงผลใน Python.

import cv2
from matplotlib import pyplot as plt
Enter fullscreen mode Exit fullscreen mode

ขั้นตอนที่ 2 อัปโหลดไฟล์รูปภาพ
อัพโหลดไฟล์จาก local machine เข้าสู่ Google Colaboratory โดยจะมีการเปิดหน้าต่างเลือกไฟล์ขึ้นมาให้เลือก และหลังจากเลือกไฟล์เสร็จเรียบร้อยแล้ว ไฟล์จะถูกอัพโหลดขึ้น Colab และบันทึกไว้ในตัวแปร uploaded ซึ่งจะเป็น dictionary ที่เก็บชื่อไฟล์และข้อมูลไฟล์ของไฟล์ที่ถูกอัพโหลด

from google.colab import files
uploaded = files.upload()
Enter fullscreen mode Exit fullscreen mode

ภาพตัวอย่าง
ภาพแสดงเมื่อ upload images เสร็จ

ขั้นตอนที่ 3 ประมวลผลภาพ
อ่านภาพที่ชื่อว่า "coin.jpg" ในรูปแบบภาพสีและเก็บไว้ในตัวแปร coin_colorจากนั้นแสดงภาพที่เก็บไว้ในตัวแปร coin_color ที่เป็นภาพสี ด้วย Matplotlib โดยไม่ได้แปลงเป็นภาพขาว-ดำ

coin_color = cv2.imread('coin.jpg')
plt.imshow(coin_color)
plt.show()
Enter fullscreen mode Exit fullscreen mode

ภาพตัวอย่าง

ภาพโชว์รูปที่นำเข้า

  • ใช้ไลบรารี OpenCV แปลงรูปภาพจากสีเป็นโทนเทา (grayscale) และทำการทำ Thresholding บนรูปภาพ

  • การกำหนด threshold ที่เหมาะสมจะต้องพิจารณาจากคุณสมบัติของภาพนั้น ๆ เช่น ระดับความเข้มของพื้นหลังและวัตถุที่ต้องการจะเห็น หรือลักษณะของแสงที่เป็นสาเหตุให้เกิดเงาโค้งบนวัตถุ

โดยจะกำนหนดสีดำ 235 และสีขาว 255 ใช้ cv2.THRESH_BINARY_INV ซึ่งหมายความว่าจะกลับสีของภาพจากดำเป็นขาว และขาวเป็นดำ และแสดงผลรูปภาพที่ได้หลังจาก Thresholding แล้ว

coin_gray = cv2.cvtColor(coin_color,cv2.COLOR_BGR2GRAY)
ret,coin_th = cv2.threshold(coin_gray,235,255,cv2.THRESH_BINARY_INV)
plt.imshow(coin_th)
plt.show()
Enter fullscreen mode Exit fullscreen mode

ภาพตัวอย่าง

ภาพที่ถูกปรับสีเป็นตรงข้าม

ค้นหาเส้น contour บนภาพที่ได้ทำ thresholding ไว้ก่อนหน้านี้ ก็คือ coin_th

contours, _ = cv2.findContours(coin_th,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
Enter fullscreen mode Exit fullscreen mode

ขั้นตอนที่ 4 สร้างตัวแปรและสร้างเงื่อนไข

coin_type =>กำหนดชนิดของเหรียญ

  • โค้ดจะวนลูปผ่านทุกๆ contour ที่ได้จากการตรวจจับของ OpenCV แสดงผลชนิดของเหรียญ ใช้ขนาดของ contour เป็นตัวกำหนดชนิดของเหรียญ โดยใค้ดนี้ cv2.putText(coin_color,str(rect[2]),(rect[0],rect[1]),1,cv2.FONT_HERSHEY_PLAIN,(255,0,0),2)เมื่อเรารู้ขนาดของสิ่งหรือเหรียญที่เราต้องการแล้วให้คอมเม้นต์ไว้เพื่อไม่ให้ค่า contour แสด'
  • สร้างเงื่อนไขจากค่า contour ที่ได้มาตามขนาดของเหรียญเพื่อแสดงชนิดของเหรียญและวาดสี่เหลี่ยมล้อมรอบ contour ด้วยสีเขียว และเขียนข้อความระบุชนิดเป็นสีม่วง
for cnt in contours:
    rect = cv2.boundingRect(cnt)
    cv2.rectangle(coin_color,rect,(0,255,0),2)
    # cv2.putText(coin_color,str(rect[2]),(rect[0],rect[1]),1,cv2.FONT_HERSHEY_PLAIN,(255,0,0),2)

    if(rect[2]>110):
        coin_type = "10 Bath"
    elif(rect[2] >100):
        coin_type = "5 Bath"
    elif(rect[2]>80):
        coin_type = "1 Bath"
    elif(rect[2]>60):
        coin_type = "0.25 Bath"
    else:
        coin_type = " "
    cv2.putText(coin_color,coin_type,(rect[0],rect[1]),1,cv2.FONT_HERSHEY_PLAIN,(0,0,255),1)
Enter fullscreen mode Exit fullscreen mode

ขั้นตอนที่ 5 แสดงผลลัพธ์

  • จะแสดงภาพ coin_color ซึ่งเป็นภาพที่มีการวาดสี่เหลี่ยมล้อมรอบ contour และเขียนข้อความระบุชนิดของเหรียญที่มีสีม่วง

  • cv2.waitKey(0) เป็นฟังก์ชันที่ใช้รอรับ key input จากผู้ใช้ ถ้าไม่มี key input ใดๆ ระบบจะเข้าสู่สถานะ wait จนกว่าผู้ใช้จะกดปุ่มใดๆ บนคีย์บอร์ด หลังจากผู้ใช้กดปุ่มเรียบร้อยแล้ว ฟังก์ชันจะคืนค่าตาม key code ของปุ่มที่ผู้ใช้กด ถ้าไม่มีการกดปุ่มใดๆ ฟังก์ชันจะคืนค่า -1

plt.imshow(coin_color)
plt.show
cv2.waitKey(0)
Enter fullscreen mode Exit fullscreen mode

ภาพตัวอย่าง

ภาพแสดงผลลัพธ์
สรุผผล
จะได้ภาพเหรียญที่มีการประมวลผลภาพ (image processing) และแสดงชนิดของเหรียญตามขนาดต่างๆ ด้วยแนวคิดนี้เราสามารถนำไปใช้ในการหาขนาดหรือการนับจำนวนของสิ่งของได้

REFERENCE
ข้อมูลและโค้ดนำมาจากการเรียนการศึกษาในรายวิชาMMI 322
MEDICAL IMAGE PROCESSING

Top comments (0)