# Computer Vision Basics

&#x20;     บทเรียนนี้จะกล่าวถึงการใช้งานฟังก์ชันพื้นฐานที่มีอยู่ในไลบารี่ OpenCV เริ่มจากการทำความรู้จักกับฟังก์ชันที่ใช้ในการอ่านภาพ ฟังก์ชันแสดงภาพ ฟังก์ชันบันทึกภาพและฟังก์ชันปรับขนาดภาพ ซึ่งเป็นฟังก์ชันที่สำคัญเมื่อต้องทำงานกับรูปภาพ

### **imread**

&#x20;หลักการเขียนฟังก์ชันอ่านภาพตามแหล่งที่อยู่ของภาพ&#x20;

1. ภาพที่ต้องการใช้อยู่ต่างโฟลเดอร์กับไฟล์ .py

&#x20;   กรณีที่ภาพอยู่คนละที่กับไฟล์ .py หรืออยู่นอกโฟลเดอร์ที่มีไฟล์ .py จะมีหลักการเขียนฟังก์ชันอ่านภาพเพียงแบบเดียว คือ **การใช้ path ที่อยู่ของภาพ**มาใส่ในเครื่องหมาย “…” ดังภาพตัวอย่างต่อไปนี้&#x20;

```
$ cv2.imread("path/to/your/image.jpg")
```

![ภาพที่โฟล์เดอร์ Download](https://paper-attachments.dropbox.com/s_5F843E0D7BE712F45A944F4940FE9034501EFCB105F755802F4857032412A211_1598523143692_Screenshot+from+2020-08-27+17-12-08.png)

![ภาพอยู่ในโฟลเดอร์ image ในแหล่งที่อยู่เดียวกัน](https://paper-attachments.dropbox.com/s_5F843E0D7BE712F45A944F4940FE9034501EFCB105F755802F4857032412A211_1598523054239_Screenshot+from+2020-08-27+17-10-38.png)

2\. ภาพที่ต้องการใช้อยู่ในโฟลเดอร์เดียวกันกับไฟล์ .py

&#x20;    กรณีที่ภาพที่ต้องการใช้อยู่ในโฟล์เดอร์เดียวกันกับไฟล์ .py สามารถเขียนฟังก์ชันอ่านภาพได้ 2 แบบ คือ **การใช้ path ที่อยู่ของภาพหรือการใช้ชื่อภาพ**นั้นมาใส่ในเครื่องหมาย “…” ดังภาพตัวอย่างต่อไปนี้

```
$ cv2.imread("nameimage.jpg") 
or
$ cv2.imread("path/to/your/image.jpg")
```

![](https://paper-attachments.dropbox.com/s_5F843E0D7BE712F45A944F4940FE9034501EFCB105F755802F4857032412A211_1598522508504_Screenshot+from+2020-08-27+17-01-31.png)

![](https://paper-attachments.dropbox.com/s_5F843E0D7BE712F45A944F4940FE9034501EFCB105F755802F4857032412A211_1598522558761_Screenshot+from+2020-08-27+17-02-27.png)

### **imshow**        &#x20;

&#x20;    การเขียนฟังก์ชันแสดงภาพบนหน้าจอนั้นจะต้อง**ตั้งชื่อหน้าจอแสดงผลภาพ**ลงในเครื่องหมาย “…” โดยภาพที่ถูกนำมาใช้ในการแสดงจะอยู่หลังเครื่องหมาย ,  ดังภาพตัวอย่างต่อไปนี้&#x20;

```
$ cv2.imshow("name_desktop", image)
```

![](https://paper-attachments.dropbox.com/s_5F843E0D7BE712F45A944F4940FE9034501EFCB105F755802F4857032412A211_1598523407156_Screenshot+from+2020-08-27+17-10-38.png)

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

{% hint style="danger" %}
ข้อควรระวัง!&#x20;

&#x20;    กรณีที่ต้องการแสดงภาพ 2 หน้าต่าง ต้องตั้งชื่อหน้าต่างแสดงผลไม่ซ้ำกัน เพื่อไม่ให้เกิดการซ้อนทับของภาพ
{% endhint %}

### **imwrite**

&#x20;    การเขียนฟังก์ชันบันทึกภาพนั้นจะต้อง**ตั้งชื่อภาพและนามสกุลของไฟล์ภาพ**ลงในเครื่องหมาย “…” โดยภาพที่ถูกนำมาใช้ในการบันทึกจะอยู่หลังเครื่องหมาย , ดังภาพตัวอย่างต่อไปนี้&#x20;

```
$ cv2.imwrite("name_newimage.jpg", image)
```

![](https://paper-attachments.dropbox.com/s_5F843E0D7BE712F45A944F4940FE9034501EFCB105F755802F4857032412A211_1598524044771_Screenshot+from+2020-08-27+17-27-12.png)

![ภาพต้นแบบและภาพที่ถูกบันทึกใหม่](https://paper-attachments.dropbox.com/s_5F843E0D7BE712F45A944F4940FE9034501EFCB105F755802F4857032412A211_1598524260946_Screenshot+from+2020-08-27+17-30-47.png)

{% hint style="danger" %}
ข้อควรระวัง!&#x20;

&#x20;    ทุกครั้งที่ต้องการบันทึกภาพใหม่ควรใช้ชื่อภาพที่ไม่ซ้ำกับภาพเดิม หากทำการบันทึกภาพใหม่ด้วยการใช้ชื่อเดิมจะเกิดการซ้อนทับกันของข้อมูล ทำให้ภาพเดิมหายไปและถูกแทนที่ด้วยภาพใหม่&#x20;
{% endhint %}

### resize

```python
$ cv2.resize(image, dim, interpolation)
```

**Parameter:**

image => ภาพที่ต้องการนำมาใช้

dim =>  ขนาดภาพที่ต้องการ เขียนในลักษณะคู่อันดับ (ขนาดความกว้าง,ขนาดความสูง)&#x20;

interpolation => ตัวเลือกการทำงานของฟังก์ชัน resize ประกอบด้วย

* INTER\_NEAREST
* INTER\_LINEAR&#x20;
* INTER\_AREA&#x20;
* INTER\_CUBIC&#x20;
* INTER\_LANCZOS4&#x20;

ตัวอย่างที่ 1

```python
import cv2

image = cv2.imread("path/your/image.png")
cv2.imshow("Original", image)

dim = (150, 200)

resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
cv2.imshow("Resized", resized)
cv2.waitKey(0)
```

![](/files/-MXX0VpY7j6Y1FZ4tFUb)

&#x20;    จากภาพตัวอย่างที่ 1 จะเห็นได้ว่าการปรับขนาดของภาพให้มีขนาด 150x200 pixel จะทำให้อัตราส่วนของภาพจะเปลี่ยนไป ภาพที่ได้จึงดูผิดเพี้ยน ดังนั้น ทุกครั้งที่ต้องการปรับขนาดภาพจึงต้องคำนึงถึงอัตราส่วนของภาพ

* สมการหาอัตราส่วนของภาพ

$$
ratio = width / height
$$

ตัวอย่างที่ 2

```python
import cv2

image = cv2.imread("path/your/image.jpg")
cv2.imshow("Original", image)

r = 150.0 / image.shape[1]
dim = (150, int(image.shape[0] * r))

resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
cv2.imshow("Resized (Width)", resized)
cv2.waitKey(0)
```

![](/files/-MXX0aiCJiOTXXrTdIYV)

&#x20;    ตัวอย่างที่ 2 จะทำการปรับขนาดภาพความกว้าง 150 pixel เช่นเดียวกับตัวย่างที่ 1 แต่ความสูงของภาพจะใช้การคำนวณหาอัตราส่วนของภาพเป็นตัวกำหนดค่า เพื่อใช้ภาพผลลัพธ์ในการปรับขนาดไม่ผิดเพี้ยน

{% hint style="info" %}
&#x20;    ฟังก์ชัน shape คือ ฟังก์ชันที่ใช้การเรียกขนาดของข้อมูลภาพ ซึ่งจะมีลักษณะเป็น array ประกอบด้วย array ของ ความกว้าง(w), ความสูง(h) และจำนวนของสีของภาพในแต่ละ pixel  ตามลำดับโดยที่ตำแหน่ง array จะเริ่มต้นที่ 0&#x20;
{% endhint %}

&#x20;    นอกจากการใช้คำสั่ง resize ของ OpenCV สามารถปรับขนาดด้วยการใช้ไลบารี่ imutils

```python
 $ pip install imutils
```

ตัวอย่างที่ 3&#x20;

```python
import cv2
import imutils

image = cv2.imread("/path/your/image/png")
cv2.imshow("Original", image)

resized = imutils.resize(image,width = 150)

cv2.imshow("Resized (Width)", resized)
cv2.waitKey(0)
```

![](/files/-MXX1UTm8u2j-9vwGd7B)

{% hint style="warning" %}
ความแตกต่างระหว่างหารใช้งาน cv2.resize และ imutils.resize

* cv2.resize -> กำหนดขนาดได้ทั้งความกว้างและความสูงพร้อมกัน หากต้องการปรับขนาดภาพให้ได้อัตราส่วนที่เหมาะสม ต้องทำการคำนวณด้วยตนเอง
* imutils.resize -> กำหนดค่าความกว้างหรือความสูง อย่างใดอย่างหนึ่ง จากนั้นฟังก์ชันจะทำการคำนวณอัตราส่วนขนาดภาพให้โดยอัตโนมัติ
  {% endhint %}


---

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