Màu sắc hình ảnh
Thuộc phần Học không giám sát trong hành trình Machine Learning của Coddy. Bài học 41 trên 51.
Một người in lụa có một vài màu mực, chứ không có hàng triệu màu. k-means chọn ra một vài màu phù hợp nhất cho mỗi bức ảnh:
Ảnh màu có shape (hàng, cột, 3): mỗi pixel có một giá trị đỏ, xanh lá và xanh dương, mỗi giá trị nằm trong khoảng từ 0 đến 1. Một lần reshape sẽ chuyển các pixel thành dữ liệu:
pixels = image.reshape(-1, 3)
km = KMeans(n_clusters=4, n_init=10, random_state=0).fit(pixels)
poster = km.cluster_centers_[km.labels_].reshape(image.shape)
ax.imshow(poster)Mỗi tâm tương ứng với một màu. Dùng nhãn để lập chỉ mục các tâm sẽ gán màu của tâm cho từng điểm ảnh; thao tác reshape ghép các hàng lại thành một hình ảnh.
Thử thách
Trung bìnhMột xưởng in poster in lụa hình hồ trên núi bằng k màu mực. Phần code khởi đầu vẽ image kích thước 40 × 60, đọc k và thiết lập biểu đồ có tiêu đề.
- Chuyển ảnh thành một hàng cho mỗi pixel và tìm
kmàu bằng k-means. - Tô lại từng pixel bằng màu của tâm cụm tương ứng, rồi ghép các hàng thành ảnh.
- Vẽ ảnh trên
axvà hiển thị.
Như hoàng hôn này với 5 màu mực:
Chương trình của bạn không in ra gì: Coddy sẽ mô tả bức tranh và các màu mực. Sau đó, hãy thử các giá trị khác của k: khi nào chiếc thuyền đỏ có màu mực riêng?
Tự làm thử
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# Vẽ cảnh hồ trên núi kích thước 40 × 60: bầu trời, đỉnh núi phủ tuyết, khu rừng, mặt nước và chiếc thuyền đỏ
def paint_lake():
image = np.zeros((40, 60, 3))
for r in range(40):
for c in range(60):
if 30 <= r <= 31 and 10 <= c <= 17 - (r - 30) * 2:
image[r, c] = [0.8, 0.15, 0.1]
elif r >= 27:
t = (r - 27) / 12
image[r, c] = [0.1, 0.45 - 0.2 * t, 0.65 - 0.2 * t]
elif r >= 21:
image[r, c] = [0.1, 0.35 + 0.05 * (c % 3), 0.15]
elif r >= abs(c - 34) + 4 and r < 10:
image[r, c] = [0.95, 0.95, 0.97]
elif r >= abs(c - 34) + 4:
image[r, c] = [0.45, 0.42, 0.45]
else:
image[r, c] = [0.55 + r / 50, 0.75 + r / 120, 0.95]
return np.round(image, 3)
# Đừng thay đổi các dòng bên dưới
image = paint_lake()
k = int(input())
fig, ax = plt.subplots()
ax.set_title(f"{k} inks")
ax.axis("off")
# Viết code của bạn bên dưới
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Học không giám sát
1Tìm các nhóm
Học không cần nhãnĐo độ tương đồngTự thực hiện K-MeansK-Means trong scikit-learnÔn tập: thành viên phòng gym7PCA trong thực tế
Quan sát 64 chiềuCác thành phần như mẫu hìnhNén và dựng lạiPCA trước khi xây dựng mô hìnhÔn tập: máy quét khuôn mặt10Dự án: Khám phá chữ số
Quan sát các chữ sốThu gọn bằng PCAPhân cụm chữ sốĐặt tên cho các cụmTìm những chữ số khác biệt2Chọn k
Quán tínhPhương pháp khuỷu tayĐiểm số SilhouetteChuẩn hóa thang đo trước khi phân cụmÔn tập: Các vùng giao hàng3Đọc hiểu các cụm
Phân tích đặc điểm các cụmTâm cụm theo đơn vị thực tếCụm và nhãn đã biếtKhi K-Means thất bạiÔn tập: Nếm trà9Cụm trong thực tế
Phân khúc khách hàngCụm làm đặc trưngMàu sắc hình ảnhÔn tập: sắc thái danh sách phátTự luyện tập: Trình biên dịch Python online