Clustering Pixels Using K-Means

本文介绍如何使用K-Means算法对图像像素进行聚类处理,通过滑动窗口提取区域特征,并进行聚类分析,实现简单图像的分割。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


原文来自我的个人博客:http://www.yuanyong.org/blog/python/clustering-pixels-using-k-means


在前一篇文章K-Means Using Python中,给出了一个用K-Means聚类的Tutorial,这个将K-Means用在具体图像像素聚类中,需要说明的是除了在很简单的图像上,单纯在像素值上应用K-Means给出的结果是毫无意义的。要产生有意义的结果,需要更多复杂的类模型或空间一致性而不是平均像素色彩。这里,我们仅仅在RGB三通道像素值上运用K-Means,关于图像分割问题会在后面的学习过程中给出一些笔记与示例。

这里,我们对两幅简单的图像利用K-Means进行像素聚类。下面代码先载入图像,然后用一个  100×100  的窗口在图像中滑动,在RGB三通道上,分别求窗口所在位置中窗口包含像素值的平均值作为特征,对这些特征利用K-Means进行聚类,然后进行向量量化,关于向量量化的解释及理解,可以参与[1,2],下面是完整的对一幅简单的图像利用K-Means进行像素聚类的完整code:

1 """
2 Function: Illustrate Clustering Pixels Using K-Means
3 Date: 2013-11-01
4 """"
5 from scipy.cluster.vq import *
6 from scipy.misc import imresize
7 from pylab import *
8 import Image
9 steps = 100 # image is divided in steps*steps region
10 infile = 'D:\NutStore\Project\Translation\PCV\pcv_data\data\empire.jpg'
11 im = array(Image.open(infile))
12 dx = im.shape[0/ steps
13 dy = im.shape[1/ steps
14 # compute color features for each region
15 features = []
16 for in range(steps):
17     for in range(steps):
18         = mean(im[x * dx:(x + 1* dx, y * dy:(y + 1* dy, 0])
19         = mean(im[x * dx:(x + 1* dx, y * dy:(y + 1* dy, 1])
20         = mean(im[x * dx:(x + 1* dx, y * dy:(y + 1* dy, 2])
21         features.append([R, G, B])
22 features = array(features, 'f'# make into array
23 # cluster
24 centroids, variance = kmeans(features, 3)
25 code, distance = vq(features, centroids)
26 # create image with cluster labels
27 codeim = code.reshape(steps, steps)
28 codeim = imresize(codeim, im.shape[:2], 'nearest')
29 figure()
30 ax1 = subplot(121)
31 ax1.set_title('Image')
32 axis('off')
33 imshow(im)
34 ax2 = subplot(122)
35 ax2.set_title('Image after clustering')
36 axis('off')
37 imshow(codeim)
38 show()

上面两层for循环实现的就是窗口滑动时,窗口中三通道像素的平均值,并将求得的三通道上的平均值作为feature,后面的过程就是K-Means Using Python中详解的内容,这里不再赘述。下面是像素聚类结果:

再次需要强调的是利用像素聚类的方法只能对一些简单的图像进行分割,对于复杂点的图像,我们可以采用图割的方法,后面会对这方面进行一些分析。

[1] http://www.data-compression.com/vq.shtml

[2] http://blog.youkuaiyun.com/zouxy09/article/details/9153255


CH341A编程器是一款广泛应用的通用编程设备,尤其在电子工程和嵌入式系统开发领域中,它被用来烧录各种类型的微控制器、存储器和其他IC芯片。这款编程器的最新版本为1.3,它的一个显著特点是增加了对25Q256等32M芯片的支持。 25Q256是一种串行EEPROM(电可擦可编程只读存储器)芯片,通常用于存储程序代码、配置数据或其他非易失性信息。32M在这里指的是存储容量,即该芯片可以存储32兆位(Mbit)的数据,换算成字节数就是4MB。这种大容量的存储器在许多嵌入式系统中都有应用,例如汽车电子、工业控制、消费电子设备等。 CH341A编程器的1.3版更新,意味着它可以与更多的芯片型号兼容,特别是针对32M容量的芯片进行了优化,提高了编程效率和稳定性。26系列芯片通常指的是Microchip公司的25系列SPI(串行外围接口)EEPROM产品线,这些芯片广泛应用于各种需要小体积、低功耗和非易失性存储的应用场景。 全功能版的CH341A编程器不仅支持25Q256,还支持其他大容量芯片,这意味着它具有广泛的兼容性,能够满足不同项目的需求。这包括但不限于微控制器、EPROM、EEPROM、闪存、逻辑门电路等多种类型芯片的编程。 使用CH341A编程器进行编程操作时,首先需要将设备通过USB连接到计算机,然后安装相应的驱动程序和编程软件。在本例中,压缩包中的"CH341A_1.30"很可能是编程软件的安装程序。安装后,用户可以通过软件界面选择需要编程的芯片类型,加载待烧录的固件或数据,然后执行编程操作。编程过程中需要注意的是,确保正确设置芯片的电压、时钟频率等参数,以防止损坏芯片。 CH341A编程器1.3版是面向电子爱好者和专业工程师的一款实用工具,其强大的兼容性和易用性使其在众多编程器中脱颖而出。对于需要处理25Q256等32M芯片的项目,或者26系列芯片的编程工作,CH341A编程器是理想的选择。通过持续的软件更新和升级,它保持了与现代电子技术同步,确保用户能方便地对各种芯片进行编程和调试。
### 使用 K-means 实现颜色聚类 #### 数据准备 为了使用 K-means 进行颜色聚类,首先需要准备好图像数据。通常情况下,这些图像是彩色的 RGB 图像。每张图片可以被看作是一个像素矩阵,其中每个像素由三个数值 (R, G, B) 表示。 ```python import numpy as np from sklearn.cluster import KMeans import matplotlib.pyplot as plt from PIL import Image import cv2 # 加载并预处理图像 image_path = 'path_to_image.jpg' img = Image.open(image_path) img_np = np.array(img) # 将三维数组转换成二维数组以便于后续操作 pixels = img_np.reshape(-1, 3).astype(float) ``` #### 执行 K-means 聚类 接下来应用 `sklearn` 库中的 `KMeans()` 函数来进行实际的颜色聚类工作。这里假设要找到五种主要颜色,则设置参数 n_clusters=5。 ```python n_colors = 5 model = KMeans(n_clusters=n_colors, random_state=42) labels = model.fit_predict(pixels) cluster_centers = model.cluster_centers_ ``` #### 可视化结果 完成聚类之后,可以通过重新构建带有新颜色模式的新图像来展示效果。这一步骤涉及将原始像素替换为其所属簇中心的颜色值。 ```python def recreate_image(codebook, labels, w, h): """Recreate the image using cluster centers.""" 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() ax = plt.axes([0, 0, 1, 1]) plt.axis('off') plt.title(f'Quantized image ({n_colors} colors)') plt.imshow(recreate_image(cluster_centers, labels, *img.size)) plt.show() ``` 上述过程展示了如何基于给定的一幅或多幅RGB格式的照片执行简单的色彩量化任务[^1]。此方法不仅限于此应用场景,在其他领域如计算机视觉、图形学等方面也有广泛应用价值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值