<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: narathip1071</title>
    <description>The latest articles on DEV Community by narathip1071 (@narathip1071).</description>
    <link>https://dev.to/narathip1071</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1060845%2Fd98f25ce-5ba5-41e9-a958-5f86bc01703e.jpg</url>
      <title>DEV Community: narathip1071</title>
      <link>https://dev.to/narathip1071</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/narathip1071"/>
    <language>en</language>
    <item>
      <title>การหาชนิดของเหรียญด้วยการประมวลผลภาพ (image processing) โดยใช้ภาษา Python</title>
      <dc:creator>narathip1071</dc:creator>
      <pubDate>Tue, 11 Apr 2023 03:47:13 +0000</pubDate>
      <link>https://dev.to/narathip1071/kaarhaachnidkhngehriiyydwykaarpramwlphlphaaph-image-processing-odyaichphaasaa-python-4fh2</link>
      <guid>https://dev.to/narathip1071/kaarhaachnidkhngehriiyydwykaarpramwlphlphaaph-image-processing-odyaichphaasaa-python-4fh2</guid>
      <description>&lt;p&gt;เมื่อคุณต้องการนับสิ่งของที่มีขนาดต่างกันจากภาพที่เราถ่ายมา เช่น รูปของใช้ รูปคนที่มีความสูงต่างกัน หรือรูปภาพของเหรียญขนาดที่แตกต่างกัน คุณสามารถทำได้ง่ายๆเพียงแค่ใช้ image processing &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;บทความนี้จะมาบอกเคล็ดลับในการใช้ image processing ในการหาขนาดของเหรียญและแสดงชนิดของเหรียญ โดยใช้ภาษา Python และรันโค้ดผ่าน Google Colab&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;ตัวอย่างรูปภาพ&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zqFsNseq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ssf344j5n9uzqfqu6w0a.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zqFsNseq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ssf344j5n9uzqfqu6w0a.jpg" alt="ภาพเหรียญขนาดต่างๆ" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;คุณสามารถทำตามขั้นตอนได้ดังนี้&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ขั้นตอนที่ 1&lt;/strong&gt; นำเข้าไลบรารี OpenCV และ Matplotlib&lt;/p&gt;

&lt;p&gt;การ import library OpenCV (Open Source Computer Vision Library) เป็น library สำหรับการประมวลผลภาพและวิดีโอ ส่วนการ import module pyplot ซึ่งเป็นส่วนหนึ่งของ library Matplotlib จะเป็น library สำหรับการวาดกราฟและภาพแสดงผลใน Python.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import cv2
from matplotlib import pyplot as plt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ขั้นตอนที่ 2&lt;/strong&gt; อัปโหลดไฟล์รูปภาพ&lt;br&gt;
อัพโหลดไฟล์จาก local machine เข้าสู่ Google Colaboratory โดยจะมีการเปิดหน้าต่างเลือกไฟล์ขึ้นมาให้เลือก และหลังจากเลือกไฟล์เสร็จเรียบร้อยแล้ว ไฟล์จะถูกอัพโหลดขึ้น Colab และบันทึกไว้ในตัวแปร uploaded ซึ่งจะเป็น dictionary ที่เก็บชื่อไฟล์และข้อมูลไฟล์ของไฟล์ที่ถูกอัพโหลด&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from google.colab import files
uploaded = files.upload()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;ภาพตัวอย่าง&lt;/em&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rY79z_-r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p46u8srkaiweou0j0mfq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rY79z_-r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p46u8srkaiweou0j0mfq.jpg" alt="ภาพแสดงเมื่อ upload images เสร็จ" width="800" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ขั้นตอนที่ 3&lt;/strong&gt; ประมวลผลภาพ&lt;br&gt;
อ่านภาพที่ชื่อว่า "coin.jpg" ในรูปแบบภาพสีและเก็บไว้ในตัวแปร coin_colorจากนั้นแสดงภาพที่เก็บไว้ในตัวแปร coin_color ที่เป็นภาพสี ด้วย Matplotlib โดยไม่ได้แปลงเป็นภาพขาว-ดำ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;coin_color = cv2.imread('coin.jpg')
plt.imshow(coin_color)
plt.show()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;ภาพตัวอย่าง&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--69JLFd9n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6xrp6oi042lc9naqo33f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--69JLFd9n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6xrp6oi042lc9naqo33f.png" alt="ภาพโชว์รูปที่นำเข้า" width="548" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;ใช้ไลบรารี OpenCV แปลงรูปภาพจากสีเป็นโทนเทา (grayscale) และทำการทำ Thresholding บนรูปภาพ &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;การกำหนด threshold ที่เหมาะสมจะต้องพิจารณาจากคุณสมบัติของภาพนั้น ๆ เช่น ระดับความเข้มของพื้นหลังและวัตถุที่ต้องการจะเห็น หรือลักษณะของแสงที่เป็นสาเหตุให้เกิดเงาโค้งบนวัตถุ&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;โดยจะกำนหนดสีดำ 235 และสีขาว 255 ใช้ cv2.THRESH_BINARY_INV ซึ่งหมายความว่าจะกลับสีของภาพจากดำเป็นขาว และขาวเป็นดำ และแสดงผลรูปภาพที่ได้หลังจาก Thresholding แล้ว&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;coin_gray = cv2.cvtColor(coin_color,cv2.COLOR_BGR2GRAY)
ret,coin_th = cv2.threshold(coin_gray,235,255,cv2.THRESH_BINARY_INV)
plt.imshow(coin_th)
plt.show()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;ภาพตัวอย่าง&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GWpEZ7Kf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kx521suluqs68948ghkw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GWpEZ7Kf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kx521suluqs68948ghkw.png" alt="ภาพที่ถูกปรับสีเป็นตรงข้าม" width="548" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ค้นหาเส้น contour บนภาพที่ได้ทำ thresholding ไว้ก่อนหน้านี้ ก็คือ coin_th&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;contours, _ = cv2.findContours(coin_th,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ขั้นตอนที่ 4&lt;/strong&gt; สร้างตัวแปรและสร้างเงื่อนไข&lt;/p&gt;

&lt;p&gt;coin_type =&amp;gt;&lt;em&gt;กำหนดชนิดของเหรียญ&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;โค้ดจะวนลูปผ่านทุกๆ contour ที่ได้จากการตรวจจับของ OpenCV แสดงผลชนิดของเหรียญ ใช้ขนาดของ contour เป็นตัวกำหนดชนิดของเหรียญ โดยใค้ดนี้ &lt;code&gt;cv2.putText(coin_color,str(rect[2]),(rect[0],rect[1]),1,cv2.FONT_HERSHEY_PLAIN,(255,0,0),2)&lt;/code&gt;เมื่อเรารู้ขนาดของสิ่งหรือเหรียญที่เราต้องการแล้วให้คอมเม้นต์ไว้เพื่อไม่ให้ค่า contour แสด'&lt;/li&gt;
&lt;li&gt;สร้างเงื่อนไขจากค่า contour ที่ได้มาตามขนาดของเหรียญเพื่อแสดงชนิดของเหรียญและวาดสี่เหลี่ยมล้อมรอบ contour ด้วยสีเขียว และเขียนข้อความระบุชนิดเป็นสีม่วง
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for cnt in contours:
    rect = cv2.boundingRect(cnt)
    cv2.rectangle(coin_color,rect,(0,255,0),2)
    # cv2.putText(coin_color,str(rect[2]),(rect[0],rect[1]),1,cv2.FONT_HERSHEY_PLAIN,(255,0,0),2)

    if(rect[2]&amp;gt;110):
        coin_type = "10 Bath"
    elif(rect[2] &amp;gt;100):
        coin_type = "5 Bath"
    elif(rect[2]&amp;gt;80):
        coin_type = "1 Bath"
    elif(rect[2]&amp;gt;60):
        coin_type = "0.25 Bath"
    else:
        coin_type = " "
    cv2.putText(coin_color,coin_type,(rect[0],rect[1]),1,cv2.FONT_HERSHEY_PLAIN,(0,0,255),1)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ขั้นตอนที่ 5&lt;/strong&gt; แสดงผลลัพธ์&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;จะแสดงภาพ coin_color ซึ่งเป็นภาพที่มีการวาดสี่เหลี่ยมล้อมรอบ contour และเขียนข้อความระบุชนิดของเหรียญที่มีสีม่วง &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cv2.waitKey(0) เป็นฟังก์ชันที่ใช้รอรับ key input จากผู้ใช้ ถ้าไม่มี key input ใดๆ ระบบจะเข้าสู่สถานะ wait จนกว่าผู้ใช้จะกดปุ่มใดๆ บนคีย์บอร์ด หลังจากผู้ใช้กดปุ่มเรียบร้อยแล้ว ฟังก์ชันจะคืนค่าตาม key code ของปุ่มที่ผู้ใช้กด ถ้าไม่มีการกดปุ่มใดๆ ฟังก์ชันจะคืนค่า -1&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;plt.imshow(coin_color)
plt.show
cv2.waitKey(0)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;ภาพตัวอย่าง&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NK-QabY5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4y9ome66cjud6g3s9rmm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NK-QabY5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4y9ome66cjud6g3s9rmm.png" alt="ภาพแสดงผลลัพธ์" width="548" height="418"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;สรุผผล&lt;/strong&gt;&lt;br&gt;
จะได้ภาพเหรียญที่มีการประมวลผลภาพ (image processing) และแสดงชนิดของเหรียญตามขนาดต่างๆ ด้วยแนวคิดนี้เราสามารถนำไปใช้ในการหาขนาดหรือการนับจำนวนของสิ่งของได้&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;REFERENCE&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;ข้อมูลและโค้ดนำมาจากการเรียนการศึกษาในรายวิชาMMI 322&lt;br&gt;
MEDICAL IMAGE PROCESSING&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
    </item>
  </channel>
</rss>
