Machine Learning สร้าง Color Codes ทำเองได้ ง่ายนิดเดียว ไม่เกิน 10 นาทีเสร็จ [แจกโค้ด]

เคยเห็นโพส Color Codes เจ๋งๆ บน Social Media กันมั้ยคะ? วันนี้ Algoaddict ชวนมาลองสร้าง Color Code กันเองแบบง่ายๆ ด้วยการประยุกต์ใช้ Machine Learning ที่ชื่อว่า K-mean Clustering เข้ามาช่วยในการวิเคราะห์ค่าสี ต้องลองทำแล้วจะรู้ว่า ง่ายมากๆ ไม่เกิน 10 นาที ได้ Color Codes ให้รูปสวยๆ ของเรา แน่นอนค่ะ สาย Social Media, Graphic Designers และ Web designers ห้ามพลาด!

Photo by Erik Mclean | Design by Behic Guven

Idea

เราจะมาตรวจจับค่าสีในรูปภาพที่ต้องการ และทำการคำนวณนำ้หนักของค่าสีแต่ละค่าที่ประกอบขึ้นเป็นรูปภาพนั้นๆ สุดท้ายเราจะนำข้อมูลเหล่านี้มาสร้าง Color Codes สวยๆ กันค่ะ โปรแกรมนี้เป็นโปรแกรมที่ ง่าย สะดวก และทำได้รวดเร็ว แถมยังถือเป็นโอกาสเรียนรู้การประยุกต์ใช้งาน K-mean Clustering ในการทางด้าน Image Processing ไปในตัวอีกด้วยค่ะ

Step 1: Import Libraries

ก่อนอื่น ทำการเรียกใช้ Libraries ที่จำเป็นกันก่อนเลยค่ะ ในที่จะมี Libraries หลักๆ อยู่ 2 ส่วนด้วยกัน คือ 1) Scikit-learn ที่ใช้ในงานทาง AI และ Machine Learning และ 2) OpenCV ที่ใช้ในงานในส่วนของ Computer Vision นั่นเองค่ะ

หมายเหตุ ถ้าใครยังไม่ได้ลง Libraries ต่างๆ จะต้องลงก่อนนะคะ โดยใช้คำสั่ง ดังนี้

pip install opencv-python scikit-learn numpy matplotlib 

มาดู Libraries ที่เราจะใช้กันในโปรเจคนี้ มีดังนี้

from collections import Counter
from sklearn.cluster import KMeans
from matplotlib import colors
import matplotlib.pyplot as plt
import numpy as np
import cv2

Step 2: Read Image

ในขั้นตอนนี้ ให้เลือกรูปที่เราสนใจมา 1 รูปค่ะ ในตัวอย่างนี้ เราจะใช้รูปนี้กันค่ะ

Photo by Wil Stewart on Unsplash

คำสั่งที่ใช้ในการอ่าน และ แสดงรูปภาพ มีดังนี้

image = cv2.imread('test_image.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

plt.imshow(image)

ในที่นี้เราใช้คำสั่ง imread ในการอ่านรูปภาพเข้ามาเก็บไว้ในตัวแปร image ซึ่งค่าของสีในขั้นตอนนี้ จะถูกเก็บในรูปแบบ BGR (blue, green, red) ของ pixel นั้นๆ ดังนี้

ค่าสี BGR ของแต่ละ pixel ที่เก็บในตัวแปร image (ก่อนสลับค่าสี)

ซึ่งการเก็บค่าแบบ BGR นี้ เมื่อทำการแสดงผล จะยังไม่ได้ค่าสีเช่นเดียวกับค่าที่แสดงในรูปต้นฉบับ ดังนี้

รูปภาพที่ได้ก่อนสลับค่าสี

ดังนี้ ต่อมาเราจะใช้คำสั่ง cvtColor เพื่อปรับค่าสีให้เก็บในรูปแบบของ RGB ซึ่งเป็นลำดับที่ถูกต้องในการแสดงผล ทำให้สามารถแสดงผลได้ภาพที่มีสีเช่นเดียวกับภาพต้นฉบับ ดังนี้

ค่าสี RGB ของแต่ละ pixel ที่เก็บในตัวแปร image (หลังสลับค่าสี)

Step 3 Image Preparation

ขั้นตอนที่ 3 เป็นการปรับรูปภาพให้พร้อมสำหรับการทำการวิเคราะห์ค่าสีด้วย K-mean Clustering ในที่นี้เราจะสร้างฟังก์ชันที่มีชื่อว่า prep_image เพื่ออ่านค่า pixel ของรูปภาพ และ ปรับจาก 3 มิติ เหลือเพียง 2 มิติ โดยใช้คำสั่ง ดังนี้

def prep_image(raw_img):
      modified_img = raw_img.reshape(raw_img.shape[0]*raw_img.shape[1], 3)
      print(modified_img.shape)
      return modified_img

จากนั้น ทำการเรียกใช้ ฟังก์ชัน โดยส่งค่า image ไปยังฟังก์ชัน เมื่อทำการปรับค่ามิติเรียบร้อยแล้ว ฟังก์ชันจะส่งค่าที่ได้รับการปรับเรียบร้อยแล้วกลับมาในตัวแปรที่มีชื่อว่า modified_img คำสั่งที่เรียกใช้ฟังก์ชัน มีดังนี้

modified_image = prep_image(image)

ถ้าเราทำการเรียกดูขนาดของตัวแปร image ก่อนปรับค่า จะเห็นว่ามีขนาด 3 มิติ แต่เมื่อได้รรับการปรับค่าแล้ว จะมีขนาดมิติลดลงเหลือเพียงแค่ 2 มิติ ดังสังเกตุได้จากขนาดของตัวแปร modified_image ดังนี้

มิติของตัวแปรที่เปลี่ยนไป

Step 4: Color Analysis

ขั้นตอนนี้จะทำการวิเคราะห์ค่าสี โดยการแบ่งกลุ่มของค่าสีออกเป็น Clusters โดยอาศัยขั้นตอนวิธีทาง Machine Learning ที่มีชื่อว่า K-mean Clustering โดยใช้ฟังก์ชัน rgb_to_hex และ color_analysis ดังนี้

def rgb_to_hex(rgb_color):
          hex_color = "#"
          for i in rgb_color:
                  i = int(i)
                  hex_color += ("{:02x}".format(i))
          return hex_color
def color_analysis(img):
          clf = KMeans(n_clusters = 5)
          color_labels = clf.fit_predict(img)
          center_colors = clf.cluster_centers_

          counts = Counter(color_labels)
          ordered_colors = [center_colors[i] for i in counts.keys()]
          hex_colors = [rgb_to_hex(ordered_colors[i]) for i in counts.keys()]    

          plt.figure(figsize = (12, 8))
          plt.pie(counts.values(), labels = hex_colors, colors = hex_colors)
          plt.savefig("color_analysis_report.png")    

ฟังก์ชันนี้จะทำงานใน 3 ส่วนหลักๆ ด้วยกันคือ

4.1) บรรทัดที่ 1-3 เป็นการสร้างโมเดล clf เป็น Machine Learning ประเภท K-mean Clustering ซึ่งเป็น Machine Learning ชนิดที่มีการเรียนรู้แบบไม่มีผู้สอน (Unsupervised Learning) ที่นิยมนำมาใช้ในการแบ่งกลุ่มข้อมูล โดยอาศัยลักษณะความเหมือน หรือ แตกต่างกันของข้อมูล

ในที่นี้เราจะใช้ Kmean Cluster ในการแบ่งกลุ่มของค่าสีในแต่ละ Pixel ออกเป็นกลุ่มๆ จำนวน 5 กลุ่ม เพื่อใช้ในการแสดงผลในวงล้อของสี จากนั้นใช้ clf แบ่งกลุ่มของ Pixel ออกจากกันด้วยคำสั่ง .fit_predict และ กลุ่มค่าจุดศูนย์กลางของกลุ่มแต่ละกลุ่มไว้ในตัวแปร center_colors

4.2) บรรทัดที่ 4-6 ทำการนับจำนวน Pixel ในแต่ละกลุ่มที่แบ่งได้ในขั้นตอนที่ 4.1) ทำการเรียงลำดับตามจำนวนขนาดสมาชิกภายในกลุ่ม แต่ส่งค่าที่ได้ไปยัง ฟังก์ชัน rgb_to_hex เพื่อแปลงค่าสีเป็นเลขฐาน 16 หรือ hex color code สำหรับการแสดงผล

4.3) บรรทัดที่ 7-9 เป็นการแสดงผลวงล้อสีโดยใช้การพล็อตกราฟแบบ Pie chart และ แสดงผลสีในรูปแบบของ Hex color

เมื่อสร้างฟังก์ชันเรียบร้อยแล้ว เราจะมาเรียกใช้ฟังก์ชัน ด้วยคำสั่ง ดังนี้

color_analysis(modified_image)

ซึ่งจะได้ผลลัพธ์ดังนี้

เป็นอย่างไรกันบ้างคะ เพียงเท่านี้ เราก็จะได้วงล้อสีสวยๆ แบบนี้ไว้ใช้งานแล้วค่ะ ไม่ว่าจะใช้ตกแต่ง Social media หรือไว้จัดการค่าสีเพื่อใช้ในการออกแบบก็ได้ ง่ายๆ โค้ดไม่เยอะ ก็ได้เล่นสนุกกันแล้ว แถมยังได้เรียนรู้เกี่ยวกับ K-mean Clustering ไปในตัวด้วยนะคะ

ถ้าผู้อ่านท่านใดอยากเรียนรู้เพิ่มเติมเกี่ยวกับ K-mean Cluster ก็สามารถเรียนได้ในบทเรียนเรื่อง “เจาะลึก K-mean clustering และ การประยุกต์ใช้งานกับข้อมูลหุ้น” ที่ทีมงาน Algoaddict ได้จัดทำไว้ได้โดยไม่มีค่าใช้จ่ายใดๆ ได้

https://algoaddict.com/courses/enrolled/533260

หวังว่าบทความนี้ จะเป็นประโยชน์แก่ผู้ที่สนใจ ไม่มากก็น้อยนะคะ แล้วโอกาสหน้าเราจะหาบทความสนุกๆ น่าสนใจ ทำตามได้ไม่ยากแบบนี้มาแชร์กันอีกนะคะ ขอบคุณมากค่ะ

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s