发布时间:2024-01-22 08:30
注意:单击此处https://urlify.cn/A3EJ3a下载完整的示例代码,或通过Binder在浏览器中运行此示例
对颐和园(中国)的图像进行逐像素矢量量化(Vector Quantization)(VQ),将显示图像所需要的颜色数量从96、615种独特颜色减少到64种,同时保留整体图片的清晰度。 在此示例中,像素在三维空间中表示,K均值用于查找64个颜色的聚类。在图像处理文献中,从K均值(聚类中心)获得的codebook称为调色板(color palette)。使用一个字节,最多可以处理256种颜色,而RGB编码每个像素需要3个字节。例如,GIF文件格式使用了这样的调色板。 为了进行比较,还显示了使用随机codebook(随机拾取的颜色)的量化图像。 输出:Fitting model on a small sub-sample of the data
done in 0.356s.
Predicting color indices on the full image (k-means)
done in 0.149s.
Predicting color indices on the full image (random)
done in 0.152s.
# 作者: Robert Layton
# Olivier Grisel
# Mathieu Blondel
#
# 许可证: BSD 3 clause
print(__doc__)
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.metrics import pairwise_distances_argmin
from sklearn.datasets import load_sample_image
from sklearn.utils import shuffle
from time import time
n_colors = 64
# 加载颐和园照片
china = load_sample_image(\"china.jpg\")
# 转换为浮点数,而不是默认的8位整数编码。
# 除以255很重要,这使得plt.imshow的显示在浮点数据上效果很好
# (需要在[0-1]范围内)
china = np.array(china, dtype=np.float64) / 255
# 加载图片(Image)并将其转换为二维numpy数组。
w, h, d = original_shape = tuple(china.shape)
assert d == 3
image_array = np.reshape(china, (w * h, d))
print(\"Fitting model on a small sub-sample of the data\")
t0 = time()
image_array_sample = shuffle(image_array, random_state=0)[:1000]
kmeans = KMeans(n_clusters=n_colors, random_state=0).fit(image_array_sample)
print(\"done in %0.3fs.\" % (time() - t0))
# 获取所有点的标签
print(\"Predicting color indices on the full image (k-means)\")
t0 = time()
labels = kmeans.predict(image_array)
print(\"done in %0.3fs.\" % (time() - t0))
codebook_random = shuffle(image_array, random_state=0)[:n_colors]
print(\"Predicting color indices on the full image (random)\")
t0 = time()
labels_random = pairwise_distances_argmin(codebook_random,
image_array,
axis=0)
print(\"done in %0.3fs.\" % (time() - t0))
def recreate_image(codebook, labels, w, h):
\"\"\"从密码本和标签重新创建(压缩的)图像\"\"\"
d = codebook.shape[1]
image = np.zeros((w, h, d))
label_idx = 0
for i in range(w):
for j in range(h):
image[i][j] = codebook[labels[label_idx]]
label_idx += 1
return image
# 显示所有结果以及原始图像
plt.figure(1)
plt.clf()
plt.axis(\'off\')
plt.title(\'Original image (96,615 colors)\')
plt.imshow(china)
plt.figure(2)
plt.clf()
plt.axis(\'off\')
plt.title(\'Quantized image (64 colors, K-Means)\')
plt.imshow(recreate_image(kmeans.cluster_centers_, labels, w, h))
plt.figure(3)
plt.clf()
plt.axis(\'off\')
plt.title(\'Quantized image (64 colors, Random)\')
plt.imshow(recreate_image(codebook_random, labels_random, w, h))
plt.show()
脚本的总运行时间:(0分钟1.769秒) 估计的内存使用量: 156 MB 下载Python源代码: plot_color_quantization.py
下载Jupyter notebook源代码: plot_color_quantization.ipynb
由Sphinx-Gallery生成的画廊
文壹由“伴编辑器”提供技术支持
☆☆☆为方便大家查阅,小编已将scikit-learn学习路线专栏 文章统一整理到公众号底部菜单栏,同步更新中,关注公众号,点击左下方“系列文章”,如图:欢迎大家和我一起沿着scikit-learn文档这条路线,一起巩固机器学习算法基础。(添加微信:mthler,备注:sklearn学习,一起进【sklearn机器学习进步群】开启打怪升级的学习之旅。)