Morphology Transformations

Morphology Transformations เป็นตัวดำเนินการพื้นฐานที่ใช้ในการเปลี่ยนแปลงลักษณะรูปร่างหรือโครงสร้างของภาพ โดยใช้องค์ประกอบโครงสร้าง (Structuring Element) เป็นตัวกำหนดรูปร่าง มีตัวดำเนินการพื้นฐานของ Morphology Transformations จะมีสองตัว คือ การกัดเซาะ (Erosion) และการขยาย (Dilation) จากนั้นจะมีรูปแบบที่หลากหลายที่พัฒนามาจากตัวดำเนินการพื้นฐานอย่างเช่น การเปิด (Opening) การปิด (Closing) การไล่ระดับ (Gradient) และอื่น ๆ ให้เลือกใช้

Structuring Element

องค์ประกอบโครงสร้าง (Structuring Element) คือ เมทริกซ์ย่อยที่ถูกกำหนดขึ้นเพื่อใช้ดำเนินการกับรูปภาพ สามารถเรียกได้อีกชื่อหนึ่ง คือ เคอร์เนล (Kernels) ขนาดขององค์ประกอบโครงสร้างนั้นส่วนใหญ่แล้วจะเป็นจำนวนคี่ เช่น 3*3 หรือ 5*5 เป็นต้น

Erosion

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

$ cv2.erode(image,kernel,iterations)

Parameters:

  • image => ภาพไบนารี่หรือภาพ grayscale ที่ต้องการนำมาใช้

  • kernel => องค์ประกอบโครงสร้างที่ใช้สำหรับการ erosion

  • iterations => จำนวนครั้งที่ใช้ในการ erosion

Example:

import cv2
import numpy as np 

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

kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(gray,kernel,iterations=5)

cv2.imshow("erode ", erosion)
cv2.waitKey(0)

Dilation

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

$ cv2.dilate(image,kernel,iterations)

Parameters:

  • image => ภาพไบนารี่หรือภาพ grayscale ที่ต้องการนำมาใช้

  • kernel => องค์ประกอบโครงสร้างที่ใช้สำหรับการ dilation

  • iterations => จำนวนครั้งที่ใช้ในการ dilation

Example:

import cv2
import numpy as np 

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

kernel = np.ones((5,5),np.uint8)
dilation = cv2.dilate(gray,kernel,iterations=5)

cv2.imshow("Dilated ", dilation)
cv2.waitKey(0)

Closing

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

$ cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)

Parameters:

  • image => ภาพไบนารี่หรือภาพ grayscale ที่ต้องการนำมาใช้

  • cv2.MORPH_CLOSE => ตัวดำเนินการของ Closing

  • kernel => องค์ประกอบโครงสร้างที่ใช้สำหรับการ Closing

Example:

import cv2
import numpy as np 

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

kernel = np.ones((13,13),np.uint8)
closing = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)

cv2.imshow("closing", closing)
cv2.waitKey(0)

Opening

การเปิด (Opening) เป็นตัวดำเนินการที่มาจากการทำงานคู่กันของตัวดำเนินการพื้นฐานคือ การกัดเซาะและการขยาเช่นเดียวกับการปิดย แต่มีลำดับการดำเนินงานที่สลับกัน เริ่มจากการกัดเซาะตามด้วยการขยายโดยการใช้องค์ประกอบโครงสร้าง ถ้าหากใช้กับภาพไบนารี่จะเป็นการเปลี่ยนค่าของตำแหน่งที่อยู่ใกล้ขอบเขตของวัตถุที่มีค่าเท่ากับ 1 ให้มีค่าเป็น 0 จากนั้นจึงจะเป็นการเปลี่ยนค่าของตำแหน่งขอบเขตของวัตถุที่เหลืออยู่ที่มีค่าพิกเซลเท่ากับ 0 ให้มีค่าเป็น 1 มักถูกนำมาใช้ในการหารูปทรงที่มีลักษณะเฉพาะของภาพไบนารี่

$ cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)

Parameters:

  • image => ภาพไบนารี่หรือภาพ grayscale ที่ต้องการนำมาใช้

  • cv2.MORPH_OPEN => ตัวดำเนินการของ Opening

  • kernel => องค์ประกอบโครงสร้างที่ใช้สำหรับการ Opening

Example:

import cv2
import numpy as np 

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

kernel = np.ones((15,15),np.uint8)
opening = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)

cv2.imshow("opening", opening)
cv2.waitKey(0)

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