ZBLOG

kMeans算法实验 一、图像分割实验 1、导入需要的包 2、读入图片数据 img = np.array(Image.open("ladybug.png"))#读取图片,转为numpy 数组 plt.imshow(img) 测试:输出img对象的维度shape函数 3、将数据转化成可以处理的数据维度(n行,3) 函数reshape 4、随机从数据中选择k个初始质心 5、将所有数据点聚类 a. 初始化一个向量保存质心 b. 计算每个样本点和每个质心的距离 c. 选择

以下是使用k-means算法进行图像分割的实验代码:

import numpy as np
from PIL import Image
import matplotlib.pyplot as plt

# 读入图片数据
img = np.array(Image.open("ladybug.png")) # 读取图片,转为numpy数组
plt.imshow(img)
plt.show()

# 将数据转化成可以处理的数据维度(n行,3)
pixels = img.reshape(-1, 3)

def k_means(data, k, max_iter=100):
    # 随机从数据中选择k个初始质心
    centroids = data[np.random.choice(range(len(data)), k)]
    
    for _ in range(max_iter):
        # 初始化一个向量保存每个样本点对应的质心索引
        labels = np.zeros(len(data))
        
        # 计算每个样本点和每个质心的距离
        distances = np.linalg.norm(data[:, np.newaxis] - centroids, axis=-1)
        
        # 选择样本点距离k个质心的最小距离所在的索引作为聚类标签
        labels = np.argmin(distances, axis=-1)
        
        # 更新质心为每个聚类的均值
        for i in range(k):
            centroids[i] = np.mean(data[labels == i], axis=0)
    
    return labels, centroids

# 主函数进行图像分割
def image_segmentation(image_path, k=2, max_iter=100):
    img = np.array(Image.open(image_path)) # 读取图片,转为numpy数组
    
    pixels = img.reshape(-1, 3) # 将数据转化成可以处理的数据维度(n行,3)
    
    labels, centroids = k_means(pixels, k, max_iter) # 进行k-means聚类
    
    # 将数据转换成图片格式
    segmented_img = centroids[labels].reshape(img.shape)
    
    return segmented_img

# 测试效果
segmented_img = image_segmentation("ladybug.png", k=2, max_iter=100)

# 输出分割结果
plt.imshow(segmented_img)
plt.show()

注意:此代码仅为示例,实际使用中可能需要根据具体情况进行调整和优化。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=10376

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?