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

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 รูปค่ะ ในตัวอย่างนี้ เราจะใช้รูปนี้กันค่ะ

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

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

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

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 ได้จัดทำไว้ได้โดยไม่มีค่าใช้จ่ายใดๆ ได้

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