以下是使用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助手提供,问题来源于学员提问