การนับจำนวนสิ่งของโดยใช้ PythonAI

ในบทความนี้นั้นจะเสนอเกี่ยวกับ การประมวลผลภาพด้วย Python และ OpenCV โดยการแยกวัตถุออกจากภาพถือเป็นหนึ่งในกระบวนการพื้นฐานที่มีความสำคัญมาก เพราะสามารถนำไปประยุกต์ใช้ได้ในหลากหลายสาขา อย่างเช่น การนับจำนวนสินค้า การวิเคราะห์ผลการทดลองทางวิทยาศาสตร์ หรือการวัดจำนวนผลผลิตทางการเกษตร บทความนี้เราจะแสดงตัวอย่างการใช้งาน OpenCV สำหรับการแยกวัตถุออกจากภาพ และทำการนับจำนวนวัตถุที่ตรวจพบโดยใช้เทคนิคการประมวลผลภาพเบื้องต้น โดยเราจะใช้ OpenCV เป็นหลักในการประมวลผลของภาพ NimPy ในการจัดการข้อมูลเชิงตัวเลข Matplotlib ใช้ในการแสดงผลใน Colab Google Drive ใช้ในการโหลดไฟล์ภาพจากโฟลเดอร์ที่จัดเก็บไว้ เริ่มจากการนำเข้า Libraries # Import libraries import cv2 import numpy as np import matplotlib.pyplot as plt from google.colab import drive drive.mount('/content/drive') ก่อนที่จะนำรูปมาประมวลผลก็ต้องเรียกรูปให้ได้ก่อน โดยที่เราใช้ Google Drive ในการเก็บรูปเราจึงต้องเรียกจาก Google Drive เราจะเริ่มจากการแยกวัตถุอย่างเหรียญ image = cv2.imread('/content/drive/My Drive/AIData1051/coinn.jpg') และหลังจากได้รับรูปแล้ว ขั้นตอนต่อไปคือการแยกวัตถุจากภาพของเรา 1. แปลงภาพเป็นสีเทาเพื่อทำให้สามารถประมวลผลได้ง่ายขึ้น gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 2. เบลอภาพด้วย Gaussian Blur เพื่อ noise ที่อาจส่งผลต่อการประมวลผลของภาพ blur = cv2.GaussianBlur(gray, (11, 11), 0) 3. ตรวจจับขอบด้วย Canny Edge Detection ใช้ในการระบุ "เส้นขอบ" ของวัตถุในภาพ canny = cv2.Canny(blur, 30, 150, 3) 4. ขยายเส้นขอบด้วย Dilation ทำให้ขอบของวัตถุชัดเจนขึ้น และทำให้เหมาะสำหรับการหาคอนทัวร์ dilated = cv2.dilate(canny, (1, 1), iterations=0) 5. หา Contours เพื่อระบุวัตถุ โดย cv2.findContours จะคืนค่าคอนทัวร์ทั้งหมดที่ตรวจพบ ซึ่งแทนขอบเขตของวัตถุ (cnt, hierarchy) = cv2.findContours(dilated.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 6. สุดท้ายคือการวาดกรอบของวัตถุแต่ละชิ้นในภาพ และนับจำนวนที่ตรวจพบจากการประมวลผล cv2.drawContours(rgb, cnt, -1, (0, 255, 0), 2) print("coins in the image : ", len(cnt)) โดยนี่คือผลสุดท้ายที่ได้รับ ต่อไปเรามาลองอะไรที่น่ากินกันมากขึ้นดีกว่าโดยใช้วัตถุที่มีสีสดใสน่ากินอย่าง ขนมช็อกโกแลต โดยนี่คือรูปของขนมที่เรานำมาใช้ น่ากินมากครับ เราจะเริ่มการทำงานอย่างเดิมเลย นั่นคือ เริ่มจากการนำเข้า Libraries # Import libraries import cv2 import numpy as np import matplotlib.pyplot as plt from google.colab import drive drive.mount('/content/drive') และนำรูปเข้ามาจาก Google Drive image = cv2.imread('/content/drive/My Drive/AIData1051/candy1.png') ขั้นตอนต่อไปคือการแยกวัตถุจากภาพของเรา 1. แปลงภาพเป็นสีเทาเพื่อทำให้สามารถประมวลผลได้ง่ายขึ้น gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 2. เบลอภาพด้วย Gaussian Blur เพื่อ noise ที่อาจส่งผลต่อการประมวลผลของภาพ blur = cv2.GaussianBlur(gray, (11, 11), 0) 3. ตรวจจับขอบด้วย Canny Edge Detection ใช้ในการระบุ "เส้นขอบ" ของวัตถุในภาพ canny = cv2.Canny(blur, 30, 150, 3) 4. ขยายเส้นขอบด้วย Dilation ทำให้ขอบของวัตถุชัดเจนขึ้น และทำให้เหมาะสำหรับการหาคอนทัวร์ dilated = cv2.dilate(canny, (1, 1), iterations=0) 5. หา Contours เพื่อระบุวัตถุ โดย cv2.findContours จะคืนค่าคอนทัวร์ทั้งหมดที่ตรวจพบ ซึ่งแทนขอบเขตของวัตถุ (cnt, hierarchy) = cv2.findContours(dilated.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 6. สุดท้ายคือการวาดกรอบของวัตถุแต่ละชิ้นในภาพ และนับจำนวนที่ตรวจพบจากการประมวลผล cv2.drawContours(rgb, cnt, -1, (0, 255, 0), 2) print("coins in the image : ", len(cnt)) โดยนี่คือผลสุดท้ายที่ได้รับ แค่นี้น่าจะดูไม่สดใส จะขอเพิ่มสีของเส้นขอบอีกสักหน่อย # แปลงภาพเป็น RGB เพื่อใช้กับ matplotlib rgb = cv2.cvtColor(image.copy(), cv2.COLOR_BGR2RGB) # วาดแต่ละ contour ด้วยสีสุ่ม for c in cnt: color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) cv2.drawContours(rgb, [c], -1, color, 2) print("Objects in the image:", len(cnt)) plt.imshow(rgb) plt.title("Detected Objects with Random Colors") plt.show() สวยขึ้นมากเลยทีเดียว การประยุกต์ในการใช้งาน โค้ดนี้สามารถปรับใช้เพื่อแยกวัตถุประเภทอื่นได้ เช่น เมล็ดพืช ยาเม็ด หรือแม้แต่ ชิ้นส่วนเล็กๆ ในสายการผลิต เพียงปรับพารามิเตอร์ต่าง ๆ เช่น พารามิเตอร์ของการเบลอ, ค่าการตรวจจับขอบ, หรือการกรองคอนทัวร์ ตามขนาดของภาพที่ต้องการก็จะสามารถนำไปใช้ต่อได้แล้ว โดยสรุป การแยกวัตถุจากภาพ OpenCV เป็นเครื่องมือที่ใช้งานได้ง่ายสำหรับงานประมวลผลภาพเบื้องต้น โค้ดในบทความนี้สามารถใช้เป็นจุดเริ่มต้นสำหรับนำไปต่อยอดโปรเจกต์ในด้านต่าง ๆ ได้

Apr 8, 2025 - 22:03
 0
การนับจำนวนสิ่งของโดยใช้ PythonAI

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

บทความนี้เราจะแสดงตัวอย่างการใช้งาน OpenCV สำหรับการแยกวัตถุออกจากภาพ และทำการนับจำนวนวัตถุที่ตรวจพบโดยใช้เทคนิคการประมวลผลภาพเบื้องต้น

โดยเราจะใช้
OpenCV เป็นหลักในการประมวลผลของภาพ
NimPy ในการจัดการข้อมูลเชิงตัวเลข
Matplotlib ใช้ในการแสดงผลใน Colab
Google Drive ใช้ในการโหลดไฟล์ภาพจากโฟลเดอร์ที่จัดเก็บไว้

เริ่มจากการนำเข้า Libraries

# Import libraries
import cv2
import numpy as np
import matplotlib.pyplot as plt
from google.colab import drive
drive.mount('/content/drive')

ก่อนที่จะนำรูปมาประมวลผลก็ต้องเรียกรูปให้ได้ก่อน
โดยที่เราใช้ Google Drive ในการเก็บรูปเราจึงต้องเรียกจาก Google Drive
เราจะเริ่มจากการแยกวัตถุอย่างเหรียญ

image = cv2.imread('/content/drive/My Drive/AIData1051/coinn.jpg')

และหลังจากได้รับรูปแล้ว

Image description

ขั้นตอนต่อไปคือการแยกวัตถุจากภาพของเรา

1. แปลงภาพเป็นสีเทาเพื่อทำให้สามารถประมวลผลได้ง่ายขึ้น

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

Image description

2. เบลอภาพด้วย Gaussian Blur เพื่อ noise ที่อาจส่งผลต่อการประมวลผลของภาพ

blur = cv2.GaussianBlur(gray, (11, 11), 0)

Image description

3. ตรวจจับขอบด้วย Canny Edge Detection ใช้ในการระบุ "เส้นขอบ" ของวัตถุในภาพ

canny = cv2.Canny(blur, 30, 150, 3)

Image description

4. ขยายเส้นขอบด้วย Dilation ทำให้ขอบของวัตถุชัดเจนขึ้น และทำให้เหมาะสำหรับการหาคอนทัวร์

dilated = cv2.dilate(canny, (1, 1), iterations=0)

Image description

5. หา Contours เพื่อระบุวัตถุ โดย cv2.findContours จะคืนค่าคอนทัวร์ทั้งหมดที่ตรวจพบ ซึ่งแทนขอบเขตของวัตถุ

(cnt, hierarchy) = cv2.findContours(dilated.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

Image description

6. สุดท้ายคือการวาดกรอบของวัตถุแต่ละชิ้นในภาพ และนับจำนวนที่ตรวจพบจากการประมวลผล

cv2.drawContours(rgb, cnt, -1, (0, 255, 0), 2)
print("coins in the image : ", len(cnt))

โดยนี่คือผลสุดท้ายที่ได้รับ

Image description

ต่อไปเรามาลองอะไรที่น่ากินกันมากขึ้นดีกว่าโดยใช้วัตถุที่มีสีสดใสน่ากินอย่าง

ขนมช็อกโกแลต

โดยนี่คือรูปของขนมที่เรานำมาใช้ น่ากินมากครับ

Image description

เราจะเริ่มการทำงานอย่างเดิมเลย นั่นคือ

เริ่มจากการนำเข้า Libraries

# Import libraries
import cv2
import numpy as np
import matplotlib.pyplot as plt
from google.colab import drive
drive.mount('/content/drive')

และนำรูปเข้ามาจาก Google Drive

image = cv2.imread('/content/drive/My Drive/AIData1051/candy1.png')

Image description

ขั้นตอนต่อไปคือการแยกวัตถุจากภาพของเรา

1. แปลงภาพเป็นสีเทาเพื่อทำให้สามารถประมวลผลได้ง่ายขึ้น

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

Image description

2. เบลอภาพด้วย Gaussian Blur เพื่อ noise ที่อาจส่งผลต่อการประมวลผลของภาพ

blur = cv2.GaussianBlur(gray, (11, 11), 0)

Image description

3. ตรวจจับขอบด้วย Canny Edge Detection ใช้ในการระบุ "เส้นขอบ" ของวัตถุในภาพ

canny = cv2.Canny(blur, 30, 150, 3)

Image description

4. ขยายเส้นขอบด้วย Dilation ทำให้ขอบของวัตถุชัดเจนขึ้น และทำให้เหมาะสำหรับการหาคอนทัวร์

dilated = cv2.dilate(canny, (1, 1), iterations=0)

Image description

5. หา Contours เพื่อระบุวัตถุ โดย cv2.findContours จะคืนค่าคอนทัวร์ทั้งหมดที่ตรวจพบ ซึ่งแทนขอบเขตของวัตถุ

(cnt, hierarchy) = cv2.findContours(dilated.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

Image description

6. สุดท้ายคือการวาดกรอบของวัตถุแต่ละชิ้นในภาพ และนับจำนวนที่ตรวจพบจากการประมวลผล

cv2.drawContours(rgb, cnt, -1, (0, 255, 0), 2)
print("coins in the image : ", len(cnt))

โดยนี่คือผลสุดท้ายที่ได้รับ

Image description

แค่นี้น่าจะดูไม่สดใส จะขอเพิ่มสีของเส้นขอบอีกสักหน่อย

# แปลงภาพเป็น RGB เพื่อใช้กับ matplotlib
rgb = cv2.cvtColor(image.copy(), cv2.COLOR_BGR2RGB)

# วาดแต่ละ contour ด้วยสีสุ่ม
for c in cnt:
    color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
    cv2.drawContours(rgb, [c], -1, color, 2)

print("Objects in the image:", len(cnt))
plt.imshow(rgb)
plt.title("Detected Objects with Random Colors")
plt.show()

Image description

สวยขึ้นมากเลยทีเดียว

การประยุกต์ในการใช้งาน

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

โดยสรุป

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