Morphological Transformations

จาก Morange Wiki

คณิตสัณฐานวิทยา ทฤษฎีแลตติก เพื่อประมวลผลเป็นรูปภาพในคอมพิวเตอร์

วัตถุประสงค์

  • ในบทนี้จะเรียนเรื่องการใช้งานเครื่องหมาย คณิตสัณฐานวิทยา เช่น Erosion, Dilation, Opening, Closing ฯลฯ
  • และเรียนรู้คำสั้งที่แตกต่างกันออกไป ได้แก่ : cv2.erode(), cv2.dilate(), cv2.morphologyEx() ฯลฯ

ทฤษฏี

  • การเปลี่ยนแปลงทางสัณฐานวิทยาคือบางการดำเนินงานง่ายๆ โดยขึ้นอยู่กับรูปร่างของภาพ โดยจะดำเนินการตามปกติในภาพไบนารี ในกระบวนการทำงาน จำเป็นต้องมีสองอินพุตหนึ่ง เป็นภาพต้นฉบับ อีกหนึ่งเรียกว่าองค์ประกอบโครงสร้าง หรือเคอร์เนลที่ตัดสินใจลักษณะเครื่องหมายทางคณิตศาสตร์ ทั้งสองนี้คือพื้นฐานทางสัณฐานวิทยา เราสามารดูวิธีเหล่านั้นได้ one by one
    • รูปที่จะนำมาทดสอบนั้นคือรูป
J.png

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)

ผลลัพธ์

ขอบคุณภาพจาก OpenCV.org

Dilation

  • ฟังก์ชั่นนี้จะตรงข้ามกันกับ Erosion โดยจะเป็นเพิ่มส่วนสีขาวหรือขนาดของวัตถุเบื้องหน้า (Foreground) ปกติในกรณีการลด Noise นั้นจะใช้ Erosion ขยายและลดภาพสีขาวลง และจะทำให้วัตถุหดตัวลง โดยวิธีนี้เหมาะสำหรับการเพิ่มจุดที่เสียหายไป เช่น

ทดลองเขียน CODE

dilation = cv2.dilate(img,kernel,iterations=1)

ผลลัพธ์

ขอบคุณภาพจาก OpenCV.org

Opening

  • ฟังก์ชั่นนี้จะเป็นการลบ Noises โดยใช้คำสั่ง cv2.morphologyEx()

ทดลองเขียน CODE

opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

ผลลัพธ์

ขอบคุณภาพจาก OpenCV.org

Morphological Gradient

  • โดยวิธีนี้จะแตกต่างจากฟังก์ชั่น dilation และ erosion โดยจะได้ผลผลที่แตกต่างออกไป

ทดลองเขียน CODE

gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

ผลลัพธ์

ขอบคุณภาพจาก OpenCV.org

Top Hat

  • โดยวิธีนี้จะแตกต่างกันกับวิธี Opening เพื่อให้เห็นภาพชัดเจน ดูตัวอย่างด้านล่าง :

ทดลองเขียน CODE

tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

ผลลัพธ์

ขอบคุณภาพจาก OpenCV.org

Black Hat

  • วิธีนี้จะแตกต่างกัน โดยเป็นวิธีการปิดภาพที่นำเข้ามา

ทดลองเขียน CODE

blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

ผลลัพธ์

ขอบคุณภาพจาก OpenCV.org

องค์ประกอบของโครงสร้าง

  • องค์ประกอบของโครงสร้างนั้น ตัวอย่างก่อหน้าจะใช้ 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)