# Morphology Transformations

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

### **Structuring Element**    &#x20;

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

### **Erosion**    &#x20;

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

![](https://paper-attachments.dropbox.com/s_ED8F33D726DEEB274B91070CD54DD9822C8EEE25152706EDC8932020507EB3FC_1600678863336_image.png)

```
$ cv2.erode(image,kernel,iterations)
```

**Parameters:**

* image => ภาพไบนารี่หรือภาพ grayscale ที่ต้องการนำมาใช้
* kernel => องค์ประกอบโครงสร้างที่ใช้สำหรับการ erosion&#x20;
* iterations => จำนวนครั้งที่ใช้ในการ erosion&#x20;

**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)
```

![](https://paper-attachments.dropbox.com/s_ED8F33D726DEEB274B91070CD54DD9822C8EEE25152706EDC8932020507EB3FC_1600693839743_Screenshot+from+2020-09-21+20-10-13.png)

### **Dilation**    &#x20;

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

![](https://paper-attachments.dropbox.com/s_ED8F33D726DEEB274B91070CD54DD9822C8EEE25152706EDC8932020507EB3FC_1600678887303_image.png)

```
$ cv2.dilate(image,kernel,iterations)
```

**Parameters:**

* image => ภาพไบนารี่หรือภาพ grayscale ที่ต้องการนำมาใช้
* kernel => องค์ประกอบโครงสร้างที่ใช้สำหรับการ dilation&#x20;
* iterations => จำนวนครั้งที่ใช้ในการ dilation &#x20;

**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)
```

![](https://paper-attachments.dropbox.com/s_ED8F33D726DEEB274B91070CD54DD9822C8EEE25152706EDC8932020507EB3FC_1600693682947_Screenshot+from+2020-09-21+20-07-47.png)

###

### **Closing**    &#x20;

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

![](https://paper-attachments.dropbox.com/s_ED8F33D726DEEB274B91070CD54DD9822C8EEE25152706EDC8932020507EB3FC_1600678895749_image.png)

```
$ 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)
```

![](https://paper-attachments.dropbox.com/s_ED8F33D726DEEB274B91070CD54DD9822C8EEE25152706EDC8932020507EB3FC_1600697870756_Screenshot+from+2020-09-21+21-17-27.png)

### **Opening**    &#x20;

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

![](https://paper-attachments.dropbox.com/s_ED8F33D726DEEB274B91070CD54DD9822C8EEE25152706EDC8932020507EB3FC_1600678905662_image.png)

```
$ 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)
```

![](https://paper-attachments.dropbox.com/s_ED8F33D726DEEB274B91070CD54DD9822C8EEE25152706EDC8932020507EB3FC_1600698036089_Screenshot+from+2020-09-21+21-19-36.png)

\ <br>
