Morphological Transformations
จาก Morange Wiki
เนื้อหา
คณิตสัณฐานวิทยา ทฤษฎีแลตติก เพื่อประมวลผลเป็นรูปภาพในคอมพิวเตอร์
วัตถุประสงค์
- ในบทนี้จะเรียนเรื่องการใช้งานเครื่องหมาย คณิตสัณฐานวิทยา เช่น Erosion, Dilation, Opening, Closing ฯลฯ
- และเรียนรู้คำสั้งที่แตกต่างกันออกไป ได้แก่ : cv2.erode(), cv2.dilate(), cv2.morphologyEx() ฯลฯ
ทฤษฏี
- การเปลี่ยนแปลงทางสัณฐานวิทยาคือบางการดำเนินงานง่ายๆ โดยขึ้นอยู่กับรูปร่างของภาพ โดยจะดำเนินการตามปกติในภาพไบนารี ในกระบวนการทำงาน จำเป็นต้องมีสองอินพุตหนึ่ง เป็นภาพต้นฉบับ อีกหนึ่งเรียกว่าองค์ประกอบโครงสร้าง หรือเคอร์เนลที่ตัดสินใจลักษณะเครื่องหมายทางคณิตศาสตร์ ทั้งสองนี้คือพื้นฐานทางสัณฐานวิทยา เราสามารดูวิธีเหล่านั้นได้ one by one
- รูปที่จะนำมาทดสอบนั้นคือรูป
Erosion
- ความคิดพื้นฐานของ Erosion คล้ายคลึงกับแบบ Soil Erosion
ดังนั้นสิ่งที่เกิดขึ้น และ พิกเซลทั้งหมดที่อยู่ใกล้กันจะตัดออกขึ้นอยู่กับขนาดของ kernel
- โดยทั้งหมดที่อยู่ใกล้เคียงนั้นจะโดนลบออกไปตามขนาดของ kernel ดังนั้นความหนาหรือขนาดของวัตถุข้างหน้าจะลดลง (หรือพื้นที่ที่มีสีขาวก็จะลดลง) และสิ่งนั้นจะเป็นประโยชน์ด้านการลด noises ออก
ทดลองเขียน CODE
import cv2 import numpy as np img = cv2.imread('j.png',0) kernel = np.ones((5,5),np.uint8) erosion = cv2.erode(img,kernel,iterations = 1)
ผลลัพธ์
Dilation
- ฟังก์ชั่นนี้จะตรงข้ามกันกับ Erosion โดยจะเป็นเพิ่มส่วนสีขาวหรือขนาดของวัตถุเบื้องหน้า (Foreground) ปกติในกรณีการลด Noise นั้นจะใช้ Erosion ขยายและลดภาพสีขาวลง และจะทำให้วัตถุหดตัวลง โดยวิธีนี้เหมาะสำหรับการเพิ่มจุดที่เสียหายไป เช่น
ทดลองเขียน CODE
dilation = cv2.dilate(img,kernel,iterations=1)
ผลลัพธ์
Opening
- ฟังก์ชั่นนี้จะเป็นการลบ Noises โดยใช้คำสั่ง cv2.morphologyEx()
ทดลองเขียน CODE
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
ผลลัพธ์
Morphological Gradient
- โดยวิธีนี้จะแตกต่างจากฟังก์ชั่น dilation และ erosion โดยจะได้ผลผลที่แตกต่างออกไป
ทดลองเขียน CODE
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
ผลลัพธ์
Top Hat
- โดยวิธีนี้จะแตกต่างกันกับวิธี Opening เพื่อให้เห็นภาพชัดเจน ดูตัวอย่างด้านล่าง :
ทดลองเขียน CODE
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
ผลลัพธ์
Black Hat
- วิธีนี้จะแตกต่างกัน โดยเป็นวิธีการปิดภาพที่นำเข้ามา
ทดลองเขียน CODE
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
ผลลัพธ์
องค์ประกอบของโครงสร้าง
- องค์ประกอบของโครงสร้างนั้น ตัวอย่างก่อหน้าจะใช้ Numpy นั้นจะเป็นรูปร่างแบบมุมฉาก โดยต่อไปนี้ จะเป็นรูปวงกลมและวงรี โดยฟังก์ชั่นที่จะเข้ามาช่วยคือ cv2.getStructuringElement() แค่นี้ก็จะได้รูปร่างที่ต้องการ
# Rectangular Kernel >>> cv2.getStructuringElement(cv2.MORPH_RECT,(5,5)) array([[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]], dtype=uint8) # Elliptical Kernel >>> cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5)) array([[0, 0, 1, 0, 0], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [0, 0, 1, 0, 0]], dtype=uint8) # Cross-shaped Kernel >>> cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5)) array([[0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [1, 1, 1, 1, 1], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0]], dtype=uint8)