# 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>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.aic-eec.com/artificial-intelligence-ai/basic-image-processing/computer-vision-for-python/lab-2-basic-cv/morphology-transformations.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
