Image Feature Extraction คือ อะไร

Image Feature Extraction คือ อะไร
Photo by Jimmy Chan

ในที่นี้จะพูดถึง Image Feature Extraction ยกตัวอย่าง การ Extract 2 Features คือ Edges (ขอบ) และ Corners (มุม) จากรูปภาพโดยใช้ OpenCV Library

สำหรับงานประยุกต์ด้าน Computer Vision (CV) และ Image Processing การ Extract Features ที่มีประโยชน์ และสามารถใช้ในการอธิบายรูปภาพนั้นๆ ได้ เป็นเรื่องสำคัญ ซึ่ง Features เหล่านี้ จะเป็น Input สำหรับงาน Object Detection, Classification ฯลฯ

มีหลายวิธีในการหา Features เหล่านี้ วิธีที่ไร้เดียงสาที่สุด คือ การนับจำนวน Pixels แต่ใน OpenCV มี Functions ต่างๆ ในการ Extract Features ในระดับ High-level ออกมา

ใน Blog นี้ มีเนื้อหาประกอบไปด้วย

  • ทำความเข้าใจ Image Feature Extraction
  • Canny Edge Detection โดยใช้ OpenCV
  • Harris Corner Detection โดยใช้ OpenCV

ทำความเข้าใจ Image Feature Extraction

เป็นการระบุและแสดงโครงสร้างที่โดดเด่นภายในภาพ การอ่านค่า Pixel ถือเป็นตัวอย่างหนึ่ง แต่ถือเป็น Feature ระดับ Low-level ตัวอย่าง Features ที่เป็น High-level เช่น Edges (ขอบ), Corners (มุม), Textures (พื้นผิว) หรือ Shapes (รูปร่าง)

Features ถือเป็น Characteristics ของภาพ ด้วย Unique Characteristics นี้ เราอาจใช้ในการแยกความแตกต่างของแต่ละภาพได้ ถือเป็นขั้นตอนแรกของ Computer Vision การทำ Feature Extraction ทำให้สามารถสร้าง Representative ของแต่ละภาพได้ (จำนวน Dimensions ที่น้อยกว่า และ มีความหมายมากกว่าแค่ค่า Pixel ของภาพ) ช่วยในการวิเคราะห์และประมวลผลในลำดับถัดๆ ไป

Canny Edge Detection โดยใช้ OpenCV

ในช่วงหลายปีที่ผ่านมา มีการพัฒนา Algorithms จำนวนมาก สำหรับการทำ Image Feature Extraction ไม่ถือเป็น Machine Learning Models แต่มีลักษณะใกล้เคียงกับ Algorithms ที่กำหนดขึ้นเอง โดยมุ่งเน้นไปที่การดึงคุณลักษณะเฉพาะ

OpenCV มี Functions จำนวนมาก สำหรับการ Extract Features แสดงตัวอย่างจาก Canny Edge Detector

การค้นหาเส้นในรูปภาพน่าจะเป็นการ Extract Feature ที่ง่ายที่สุด มีเป้าหมาย คือ ระบุว่า Pixel ใดที่เป็นขอบ (Edge) สามารถกำหนดได้โดยพิจารณาการไล่ระดับสีตามความเข้มของ Pixel กล่าวอีกนัยหนึ่งหากเปลี่ยนสีกะทันหันก็ถือเป็นขอบ ทั้งนี้จำเป็นต้องมีการแยก Noise ออก

ตัวอย่าง Python Code (ใน Google Colab) สำหรับ Edge Detector 👨🏻‍💻

สามารถ Download Image ได้จาก https://www.pexels.com/photo/white-2-storey-house-near-trees-1115804/


import cv2
import numpy as np
from google.colab.patches import cv2_imshow

# Read the image
img = cv2.imread('image.jpeg')

# Convert from RGB to Grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Edge detector using Canny Method
edges = cv2.Canny(gray, 150, 300)

# Display the image with edges
img[edges == 255] = (255,0,0)
cv2_imshow(img)
ผลลัพธ์จากการทำ Edge Detection โดยใช้ Canny Method

Harris Corner Detection โดยใช้ OpenCV

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

การแยกมุม (Corner) ออกจากรูปภาพ ทำได้โดย 3 ขั้นตอน

  1. แปลงรูปภาพให้เป็น Grayscale เนื่องจาก Algorithm Harris Corner Detector ทำงานกับ Channel เดียวเท่านั้น
  2. เรียกใช้ cv2.cornerHarris(image, blockSize, ksize, k) ได้ค่า Score สำหรับทุก Pixels
  3. ระบุว่า Pixel ใดเป็นมุม (Corner) โดยการเปรียบเทียบ Score กับค่าสูงสุดในรูปภาพ

Arguments ของ cornerHarris() ต้องระบุ neighborhood size (blockSize) และ kernel size (ksize) โดยที่ค่าทั้งสองเป็นจำนวนเต็มบวกขนาดเล็ก แต่ค่า kernel ต้องเป็นเลขคี่ สำหรับ Argument k คือ ค่าทศนิยมที่เป็นบวก เพื่อควบคุม Sensitivity ของการตรวจจับมุม หากค่าดังกล่าวมากเกินไป จะทำให้ Algorithm เข้าใจผิดว่ามุมเป็นขอบ จำเป็นต้องทำการทดลองเพื่อให้ได้ค่าที่เหมาะสม

ตัวอย่าง Python Code (ใน Google Colab) สำหรับ Harris Corner Detector 👨🏻‍💻


import cv2
import numpy as np

# Load the image
img = cv2.imread('image.jpeg')

# Convert from RGB to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Corner detector using Harris Method
dst = cv2.cornerHarris(gray, 3, 5, 0.1)

# Create a boolean bitmap of corner positions
corners = dst > 0.05 * dst.max()

# Find the coordinates from the boolean bitmap
coord = np.argwhere(corners)

# Draw circles on the coordinates to mark the corners
for y, x in coord:
    cv2.circle(img, (x,y), 3, (0,0,255), -1)

# Display the image with corners
cv2_imshow(img)
ผลลัพธ์จากการทำ Corner Detection โดยใช้ Harris Method

หมายเหตุ หากรูปมีการ Process หรือ ผ่าน Filtering อาจทำให้การ Detect Edges หรือ Corners มีประสิทธิภาพต่ำลง ควรทำที่ Raw Data

******

ข้อมูลอ้างอิง - https://machinelearningmastery.com/opencv_edges_and_corners/