Computer Vision Basics

บทเรียนนี้จะกล่าวถึงการใช้งานฟังก์ชันพื้นฐานที่มีอยู่ในไลบารี่ OpenCV เริ่มจากการทำความรู้จักกับฟังก์ชันที่ใช้ในการอ่านภาพ ฟังก์ชันแสดงภาพ ฟังก์ชันบันทึกภาพและฟังก์ชันปรับขนาดภาพ ซึ่งเป็นฟังก์ชันที่สำคัญเมื่อต้องทำงานกับรูปภาพ

imread

หลักการเขียนฟังก์ชันอ่านภาพตามแหล่งที่อยู่ของภาพ

  1. ภาพที่ต้องการใช้อยู่ต่างโฟลเดอร์กับไฟล์ .py

กรณีที่ภาพอยู่คนละที่กับไฟล์ .py หรืออยู่นอกโฟลเดอร์ที่มีไฟล์ .py จะมีหลักการเขียนฟังก์ชันอ่านภาพเพียงแบบเดียว คือ การใช้ path ที่อยู่ของภาพมาใส่ในเครื่องหมาย “…” ดังภาพตัวอย่างต่อไปนี้

$ cv2.imread("path/to/your/image.jpg")

2. ภาพที่ต้องการใช้อยู่ในโฟลเดอร์เดียวกันกับไฟล์ .py

กรณีที่ภาพที่ต้องการใช้อยู่ในโฟล์เดอร์เดียวกันกับไฟล์ .py สามารถเขียนฟังก์ชันอ่านภาพได้ 2 แบบ คือ การใช้ path ที่อยู่ของภาพหรือการใช้ชื่อภาพนั้นมาใส่ในเครื่องหมาย “…” ดังภาพตัวอย่างต่อไปนี้

$ cv2.imread("nameimage.jpg") 
or
$ cv2.imread("path/to/your/image.jpg")

imshow

การเขียนฟังก์ชันแสดงภาพบนหน้าจอนั้นจะต้องตั้งชื่อหน้าจอแสดงผลภาพลงในเครื่องหมาย “…” โดยภาพที่ถูกนำมาใช้ในการแสดงจะอยู่หลังเครื่องหมาย , ดังภาพตัวอย่างต่อไปนี้

$ cv2.imshow("name_desktop", image)

จากภาพตัวอย่างการแสดงภาพบนหน้าจอจะมีอีกฟังก์ชันหนึ่งที่นำมาใช้คู่กันคือ ฟังก์ชัน waitKey() ฟังก์ชันนี้จะทำหน้าที่ในกำหนดการแสดงผล ค่า 0 ที่อยู่ในฟังก์ชันจะหมายความว่ารอรับ input จากคีย์บอร์ด หรือก็คือ เมื่อผู้ใช้ทำการกดปุ่มใดปุ่มหนึ่งบนคีย์บอร์ด จะส่งผลให้ภาพที่แสดงอยู่หายไป หากไม่ต้องการที่จะให้ภาพหายไปด้วยการกดปุ่มบนคีย์บอร์ด ผู้ใช้สามารถตั้งเวลาที่ภาพจะแสดงผลด้วยการกำหนดค่าอื่นแทนค่า 0 ซึ่งค่าที่ใส่แทนค่า 0 จะทำให้แสดงภาพบนหน้าจอตามเวลาที่กำหนดในหน่วยวินาที

ข้อควรระวัง!

กรณีที่ต้องการแสดงภาพ 2 หน้าต่าง ต้องตั้งชื่อหน้าต่างแสดงผลไม่ซ้ำกัน เพื่อไม่ให้เกิดการซ้อนทับของภาพ

imwrite

การเขียนฟังก์ชันบันทึกภาพนั้นจะต้องตั้งชื่อภาพและนามสกุลของไฟล์ภาพลงในเครื่องหมาย “…” โดยภาพที่ถูกนำมาใช้ในการบันทึกจะอยู่หลังเครื่องหมาย , ดังภาพตัวอย่างต่อไปนี้

$ cv2.imwrite("name_newimage.jpg", image)

ข้อควรระวัง!

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

resize

$ cv2.resize(image, dim, interpolation)

Parameter:

image => ภาพที่ต้องการนำมาใช้

dim => ขนาดภาพที่ต้องการ เขียนในลักษณะคู่อันดับ (ขนาดความกว้าง,ขนาดความสูง)

interpolation => ตัวเลือกการทำงานของฟังก์ชัน resize ประกอบด้วย

  • INTER_NEAREST

  • INTER_LINEAR

  • INTER_AREA

  • INTER_CUBIC

  • INTER_LANCZOS4

ตัวอย่างที่ 1

import cv2

image = cv2.imread("path/your/image.png")
cv2.imshow("Original", image)

dim = (150, 200)

resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
cv2.imshow("Resized", resized)
cv2.waitKey(0)

จากภาพตัวอย่างที่ 1 จะเห็นได้ว่าการปรับขนาดของภาพให้มีขนาด 150x200 pixel จะทำให้อัตราส่วนของภาพจะเปลี่ยนไป ภาพที่ได้จึงดูผิดเพี้ยน ดังนั้น ทุกครั้งที่ต้องการปรับขนาดภาพจึงต้องคำนึงถึงอัตราส่วนของภาพ

  • สมการหาอัตราส่วนของภาพ

ratio=width/heightratio = width / height

ตัวอย่างที่ 2

import cv2

image = cv2.imread("path/your/image.jpg")
cv2.imshow("Original", image)

r = 150.0 / image.shape[1]
dim = (150, int(image.shape[0] * r))

resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
cv2.imshow("Resized (Width)", resized)
cv2.waitKey(0)

ตัวอย่างที่ 2 จะทำการปรับขนาดภาพความกว้าง 150 pixel เช่นเดียวกับตัวย่างที่ 1 แต่ความสูงของภาพจะใช้การคำนวณหาอัตราส่วนของภาพเป็นตัวกำหนดค่า เพื่อใช้ภาพผลลัพธ์ในการปรับขนาดไม่ผิดเพี้ยน

ฟังก์ชัน shape คือ ฟังก์ชันที่ใช้การเรียกขนาดของข้อมูลภาพ ซึ่งจะมีลักษณะเป็น array ประกอบด้วย array ของ ความกว้าง(w), ความสูง(h) และจำนวนของสีของภาพในแต่ละ pixel ตามลำดับโดยที่ตำแหน่ง array จะเริ่มต้นที่ 0

นอกจากการใช้คำสั่ง resize ของ OpenCV สามารถปรับขนาดด้วยการใช้ไลบารี่ imutils

 $ pip install imutils

ตัวอย่างที่ 3

import cv2
import imutils

image = cv2.imread("/path/your/image/png")
cv2.imshow("Original", image)

resized = imutils.resize(image,width = 150)

cv2.imshow("Resized (Width)", resized)
cv2.waitKey(0)

ความแตกต่างระหว่างหารใช้งาน cv2.resize และ imutils.resize

  • cv2.resize -> กำหนดขนาดได้ทั้งความกว้างและความสูงพร้อมกัน หากต้องการปรับขนาดภาพให้ได้อัตราส่วนที่เหมาะสม ต้องทำการคำนวณด้วยตนเอง

  • imutils.resize -> กำหนดค่าความกว้างหรือความสูง อย่างใดอย่างหนึ่ง จากนั้นฟังก์ชันจะทำการคำนวณอัตราส่วนขนาดภาพให้โดยอัตโนมัติ

Last updated

Assoc. Prof. Wiroon Sriborrirux, Founder of Advance Innovation Center (AIC) and Bangsaen Design House (BDH), Electrical Engineering Department, Faculty of Engineering, Burapha University