提交 6267943a 编写于 作者: W wizardforcel

3.5

上级 22e6302e
......@@ -392,3 +392,93 @@ CPU times: user 34.6 s, sys: 3.17 s, total: 37.8 s Wall time: 44.6 s
```
显然,这就违背了问题的核心,但是这的确展示了重要东西。选择差劲的初始条件可能影响我们的模型,特别是聚类模型的收敛。使用 MiniBatch KMeans,全局最优是否能达到,是不一定的。
## 3.5 使用 KMeans 聚类来量化图像
图像处理是个重要的话题,其中聚类有一些应用。值得指出的是,Python 中有几种非常不错的图像处理库。Scikit-image 是 Scikit-learn 的“姐妹”项目。如果你打算做任何复杂的事情,都值得看一看它。
### 准备
我们在这篇秘籍中会有一些乐趣。目标是使用聚类来把图像变模糊。
首先,我们要利用 SciPy 来读取图像。图像翻译为三维数组,`x``y`坐标描述了高度和宽度,第三个维度表示每个图像的 RGB 值。
```
# in your terminal
$ wget http://blog.trenthauck.com/assets/headshot.jpg
```
### 操作步骤
现在,让我们在 Python 中读取图像:
```py
>>> from scipy import ndimage
>>> img = ndimage.imread("headshot.jpg")
>>> plt.imshow(img)
```
下面就是图像:
![](img/3-5-1.jpg)
嘿,这就是(年轻时期的)作者。
既然我们已经有了图像,让我们检查它的维度:
```py
>>> img.shape
(420, 420, 3)
```
为了实际量化图像,我们需要将其转换为二维数组,长为`420x420`,宽为 RGB 值。思考它的更好的方法,是拥有一堆三维空间中的数据点,并且对点进行聚类来降低图像中的不同颜色的数量 -- 这是一个简单的量化方式。
首先,让我们使数组变形,它是个 NumPy 数组,所以非常简单:
```py
>>> x, y, z = img.shape
>>> long_img = img.reshape(x*y, z)
>>> long_img.shape (176400, 3)
```
现在我们开始聚类过程。首先,让我们导入聚类模块,并创建 KMeans 对象。我们传入`n_clusters=5`,使我们拥有 5 个簇,或者实际上是 5 个不同颜色。
这是个不错的秘籍,我们使用前面提到的轮廓距离:
```py
>>> from sklearn import cluster
>>> k_means = cluster.KMeans(n_clusters=5)
>>> k_means.fit(long_img)
```
既然我们已经训练了 KMeans 对象,让我们看看我们的眼色:
```py
>>> centers = k_means.cluster_centers_
>>> centers
array([[ 142.58775848, 206.12712986, 226.04416873],
[ 86.29356543, 68.86312505, 54.04770507],
[ 194.36182899, 172.19845258, 149.65603813],
[ 24.67768412, 20.45778933, 16.19698314],
[ 149.27801776, 132.19850659, 115.32729167]])
```
### 工作原理
既然我们拥有了形心,我们需要的下一个东西就是标签。它会告诉我们,哪个点关联哪个簇。
```py
>>> labels = k_means.labels_
>>> labels[:5] array([1, 1, 1, 1, 1], dtype=int32)
```
这个时候,我们需要最简的 NumPy 操作,之后是一个变形,我们就拥有的新的图像:
```py
>>> plt.imshow(centers[labels].reshape(x, y, z))
```
下面就是产生的图像:
![](img/3-5-2.jpg)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册