ผลต่างระหว่างรุ่นของ "Morphological Transformations"
จาก Morange Wiki
Patcharapun (คุย | มีส่วนร่วม) (เนตดับๆมาๆ) |
Patcharapun (คุย | มีส่วนร่วม) (success) |
||
แถว 11: | แถว 11: | ||
=== Erosion === | === Erosion === | ||
* ความคิดพื้นฐานของ Erosion คล้ายคลึงกับแบบ Soil Erosion | * ความคิดพื้นฐานของ Erosion คล้ายคลึงกับแบบ Soil Erosion | ||
− | ดังนั้นสิ่งที่เกิดขึ้น และ พิกเซลทั้งหมดที่อยู่ใกล้กันจะตัดออกขึ้นอยู่กับขนาดของ kernel | + | ดังนั้นสิ่งที่เกิดขึ้น และ พิกเซลทั้งหมดที่อยู่ใกล้กันจะตัดออกขึ้นอยู่กับขนาดของ kernel |
+ | * โดยทั้งหมดที่อยู่ใกล้เคียงนั้นจะโดนลบออกไปตามขนาดของ kernel ดังนั้นความหนาหรือขนาดของวัตถุข้างหน้าจะลดลง (หรือพื้นที่ที่มีสีขาวก็จะลดลง) และสิ่งนั้นจะเป็นประโยชน์ด้านการลด noises ออก | ||
+ | ==== ทดลองเขียน CODE ==== | ||
+ | <pre> | ||
+ | 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) | ||
+ | </pre> | ||
+ | ==== ผลลัพธ์ ==== | ||
+ | <center> [[ไฟล์:Erosion.png|frame|center|ขอบคุณภาพจาก OpenCV.org]] </center> | ||
+ | |||
+ | === Dilation === | ||
+ | * ฟังก์ชั่นนี้จะตรงข้ามกันกับ Erosion โดยจะเป็นเพิ่มส่วนสีขาวหรือขนาดของวัตถุเบื้องหน้า (Foreground) ปกติในกรณีการลด Noise นั้นจะใช้ Erosion ขยายและลดภาพสีขาวลง และจะทำให้วัตถุหดตัวลง โดยวิธีนี้เหมาะสำหรับการเพิ่มจุดที่เสียหายไป เช่น | ||
+ | |||
+ | ==== ทดลองเขียน CODE ==== | ||
+ | <pre> | ||
+ | dilation = cv2.dilate(img,kernel,iterations=1) | ||
+ | </pre> | ||
+ | ==== ผลลัพธ์ ==== | ||
+ | <center> [[ไฟล์:Dilation.png|frame|center|ขอบคุณภาพจาก OpenCV.org]] </center> | ||
+ | |||
+ | === Opening === | ||
+ | * ฟังก์ชั่นนี้จะเป็นการลบ Noises โดยใช้คำสั่ง cv2.morphologyEx() | ||
+ | |||
+ | ==== ทดลองเขียน CODE ==== | ||
+ | <pre> | ||
+ | opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) | ||
+ | </pre> | ||
+ | ==== ผลลัพธ์ ==== | ||
+ | <center> [[ไฟล์:Opening.png|frame|center|ขอบคุณภาพจาก OpenCV.org]] </center> | ||
+ | |||
+ | === Morphological Gradient === | ||
+ | * โดยวิธีนี้จะแตกต่างจากฟังก์ชั่น dilation และ erosion โดยจะได้ผลผลที่แตกต่างออกไป | ||
+ | ==== ทดลองเขียน CODE ==== | ||
+ | <pre> | ||
+ | gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) | ||
+ | </pre> | ||
+ | ==== ผลลัพธ์ ==== | ||
+ | <center> [[ไฟล์:Gradient result.png|frame|center|ขอบคุณภาพจาก OpenCV.org]] </center> | ||
+ | |||
+ | === Top Hat === | ||
+ | * โดยวิธีนี้จะแตกต่างกันกับวิธี Opening เพื่อให้เห็นภาพชัดเจน ดูตัวอย่างด้านล่าง : | ||
+ | ==== ทดลองเขียน CODE ==== | ||
+ | <pre> | ||
+ | tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel) | ||
+ | </pre> | ||
+ | ==== ผลลัพธ์ ==== | ||
+ | <center> [[ไฟล์:Tophat.png|frame|center|ขอบคุณภาพจาก OpenCV.org]] </center> | ||
+ | |||
+ | === Black Hat === | ||
+ | * วิธีนี้จะแตกต่างกัน โดยเป็นวิธีการปิดภาพที่นำเข้ามา | ||
+ | ==== ทดลองเขียน CODE ==== | ||
+ | <pre> | ||
+ | blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel) | ||
+ | </pre> | ||
+ | ==== ผลลัพธ์ ==== | ||
+ | <center> [[ไฟล์:Blackhat.png|frame|center|ขอบคุณภาพจาก OpenCV.org]] </center> | ||
+ | |||
+ | === องค์ประกอบของโครงสร้าง === | ||
+ | * องค์ประกอบของโครงสร้างนั้น ตัวอย่างก่อหน้าจะใช้ Numpy นั้นจะเป็นรูปร่างแบบมุมฉาก โดยต่อไปนี้ จะเป็นรูปวงกลมและวงรี โดยฟังก์ชั่นที่จะเข้ามาช่วยคือ cv2.getStructuringElement() แค่นี้ก็จะได้รูปร่างที่ต้องการ | ||
+ | <pre> | ||
+ | # 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) | ||
+ | </pre> |
รุ่นแก้ไขปัจจุบันเมื่อ 03:29, 5 สิงหาคม 2559
เนื้อหา
คณิตสัณฐานวิทยา ทฤษฎีแลตติก เพื่อประมวลผลเป็นรูปภาพในคอมพิวเตอร์
วัตถุประสงค์
- ในบทนี้จะเรียนเรื่องการใช้งานเครื่องหมาย คณิตสัณฐานวิทยา เช่น 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)