怎么用Python K-means实现简单图像聚类
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍"怎么用Python K-means实现简单图像聚类",在日常操作中,相信很多人在怎么用Python K-means实现简单图像聚类问题上存在疑惑,小编查阅了各式资料,整理出简单好用的
千家信息网最后更新 2026年11月02日怎么用Python K-means实现简单图像聚类
这篇文章主要介绍"怎么用Python K-means实现简单图像聚类",在日常操作中,相信很多人在怎么用Python K-means实现简单图像聚类问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"怎么用Python K-means实现简单图像聚类"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
这里直接给出第一个版本的直接实现:
import osimport numpy as npfrom sklearn.cluster import KMeansimport cv2from imutils import build_montagesimport matplotlib.image as imgpltimage_path = []all_images = []images = os.listdir('./images')for image_name in images: image_path.append('./images/' + image_name)for path in image_path: image = imgplt.imread(path) image = image.reshape(-1, ) all_images.append(image)clt = KMeans(n_clusters=2)clt.fit(all_images)labelIDs = np.unique(clt.labels_)for labelID in labelIDs: idxs = np.where(clt.labels_ == labelID)[0] idxs = np.random.choice(idxs, size=min(25, len(idxs)), replace=False) show_box = [] for i in idxs: image = cv2.imread(image_path[i]) image = cv2.resize(image, (96, 96)) show_box.append(image) montage = build_montages(show_box, (96, 96), (5, 5))[0] title = "Type {}".format(labelID) cv2.imshow(title, montage) cv2.waitKey(0)主要需要注意的问题是对K-Means原理的理解。K-means做的是对向量的聚类,也就是说,假设要处理的是224×224×3的RGB图像,那么就得先将其转为1维的向量。在上面的做法里,我们是直接对其展平:
image = image.reshape(-1, )
那么这么做的缺陷也是十分明显的。例如,对于两张一模一样的图像,我们将前者向左平移一个像素。这么做下来后两张图像在感官上几乎没有任何区别,但由于整体平移会导致两者的图像矩阵逐像素比较的结果差异巨大。以橘子汽车聚类为例,实验结果如下:

可以看到结果是比较差的。因此,我们进行改进,利用ResNet-50进行图像特征的提取(embedding),在特征的基础上聚类而非直接在像素上聚类,代码如下:
import osimport numpy as npfrom sklearn.cluster import KMeansimport cv2from imutils import build_montagesimport torch.nn as nnimport torchvision.models as modelsfrom PIL import Imagefrom torchvision import transformsclass Net(nn.Module): def __init__(self): super(Net, self).__init__() resnet50 = models.resnet50(pretrained=True) self.resnet = nn.Sequential(resnet50.conv1, resnet50.bn1, resnet50.relu, resnet50.maxpool, resnet50.layer1, resnet50.layer2, resnet50.layer3, resnet50.layer4) def forward(self, x): x = self.resnet(x) return xnet = Net().eval()image_path = []all_images = []images = os.listdir('./images')for image_name in images: image_path.append('./images/' + image_name)for path in image_path: image = Image.open(path).convert('RGB') image = transforms.Resize([224,244])(image) image = transforms.ToTensor()(image) image = image.unsqueeze(0) image = net(image) image = image.reshape(-1, ) all_images.append(image.detach().numpy())clt = KMeans(n_clusters=2)clt.fit(all_images)labelIDs = np.unique(clt.labels_)for labelID in labelIDs: idxs = np.where(clt.labels_ == labelID)[0] idxs = np.random.choice(idxs, size=min(25, len(idxs)), replace=False) show_box = [] for i in idxs: image = cv2.imread(image_path[i]) image = cv2.resize(image, (96, 96)) show_box.append(image) montage = build_montages(show_box, (96, 96), (5, 5))[0] title = "Type {}".format(labelID) cv2.imshow(title, montage) cv2.waitKey(0)可以发现结果明显改善:
到此,关于"怎么用Python K-means实现简单图像聚类"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
图像
结果
学习
像素
明显
向量
更多
特征
问题
帮助
平移
实用
巨大
一模一样
接下来
也就是
也就是说
代码
做法
原理
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
广州互联网科技公司
互联网金融 科技金融
互联网科技作文
鑫亿盛互联网科技
互联网科技咨询
互联网科技大会案例
广州优美互联网科技
来此购互联网科技有限公司
互联网科技公司实习生
坤平互联网科技
互联网科技如何创业
电子商务与互联网科技的关系
中天科技中国工业互联网
领航科技大厦互联网公司
互联网相关科技技术
张家口科技产业互联网平台
长沙易易互联网科技有限公司
互联网大会出现的黑科技
互联网高科技绘画
广州全民伙伴互联网科技有限公司
互联网的科技
互联网科技战争
网络科技有限互联网
麻工互联网科技
北京互联网科技
互联网前沿科技
欧洲十大科技互联网公司
互联网金融科技公司干啥的
互联网领先科技宣传片
重庆科技产业互联网有哪些