> For the complete documentation index, see [llms.txt](https://docs.aic-eec.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.aic-eec.com/artificial-intelligence-ai/basic-image-processing/computer-vision-for-python/lab-2-basic-cv.md).

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

![](https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MClo3nC-1US0rbK8Qau%2F-MXWqBr_oLYwWqjk8SQL%2F-MXX0VpY7j6Y1FZ4tFUb%2FScreenshot%20from%202021-04-05%2019-31-17.png?alt=media\&token=d4dfc965-dfb0-4260-85d5-5e73b70daf93)

&#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)
```

![](https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MClo3nC-1US0rbK8Qau%2F-MXWqBr_oLYwWqjk8SQL%2F-MXX0aiCJiOTXXrTdIYV%2FScreenshot%20from%202021-04-05%2019-31-45.png?alt=media\&token=0de3c137-3be7-42a6-bbde-1b1c928526b8)

&#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)
```

![](https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MClo3nC-1US0rbK8Qau%2F-MXWqBr_oLYwWqjk8SQL%2F-MXX1UTm8u2j-9vwGd7B%2FScreenshot%20from%202021-04-05%2019-37-18.png?alt=media\&token=70fea8a4-d269-4916-80aa-7650d357df4f)

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

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