基于聚类的图像分割——Python实现

0 图像读取

import numpy as np
from PIL import Image as image
def loadData(filePath):
    f = open(filePath,'rb') 
    data= []
    img =image.open(f) 
    m,n =img.size    
    for i in range(m):
        for j in range(n):
            x,y,z =img.getpixel((i,j))
            data.append([x/256.0,y/256.0,z/256.0])
    f.close()
    return np.mat(data),m,n
imgData,row,col =loadData('apple.jpg')

apple.jpg:
图1

图 1 原始图像

1 算法实现

1.1 K-Means

from sklearn.cluster import  KMeans
km=KMeans(n_clusters=3)
label =km.fit_predict(imgData)
label=label.reshape([row,col])
pic_new = image.new("L",(row,col))
for i in range(row):
for j in range(col):
   pic_new.putpixel((i,j),int(256/(label[i][j]+1)))
pic_new.save("KM_Apple.jpg","JPEG")

调整参数 K,(为km=KMeans(n_clusters=3)中参数n_clusters)得到如下结果:


K=2

K=3

K=6
图 2 K-Means算法聚类后的图像

1.2 FCM聚类

from skfuzzy.cluster import cmeans
imgData = imgData.T
center, u, u0, d, jm, p, fpc = cmeans(imgData, m=2, c=6, error=0.0001, maxiter=1000)
for i in u:
    label = np.argmax(u, axis=0) 
label = label.reshape([row, col]) 
print(label)
pic_new = image.new('L', (row, col))
for i in range(row):
    for j in range(col):
        pic_new.putpixel((i, j), int(256 / (label[i][j] + 1)))
pic_new.save('FCM_apple.jpg','JPEG')

调整参数 C C C,(为center, u, u0, d, jm, p, fpc = cmeans(imgData, m=2, c=6, error=0.0001, maxiter=1000)中参数c)得到如下结果:


C=3

C=6

C=9
图 3 FCM算法聚类后的图像

1.3 漂移均值

import sklearn.cluster as sc
bw = sc.estimate_bandwidth(imgData, n_samples=500, quantile=0.2)
model = sc.MeanShift(bandwidth=bw, bin_seeding=True)
label = model.fit_predict(imgData)  
label = label.reshape([row, col])
pic_new = image.new('L', (row, col))
for i in range(row):
    for j in range(col):
        pic_new.putpixel((i, j), int(256 / (label[i][j] + 1)))
pic_new.save('MS_Apple.jpg','JPEG')

bw=0.01

bw=0.17

bw=0.5
图 4 均值漂移算法聚类后的图像

1.4 谱聚类

from sklearn.cluster import SpectralClustering
label = SpectralClustering(n_clusters=3).fit_predict(imgData)
label=label.reshape([row,col])
pic_new = image.new("L",(row,col))
for i in range(row):
    for j in range(col):
        pic_new.putpixel((i,j),int(256/(label[i][j]+1)))
pic_new.save("SP_apple.jpg","JPEG")

在这里插入图片描述

图 5 谱聚类算法聚类后的图像

1.5 Affinity Propagation聚类

from sklearn.cluster import AffinityPropagation
label = AffinityPropagation(damping=0.9, max_iter=20, convergence_iter=15, copy=True, preference=None, affinity='euclidean', verbose=False).fit_predict(imgData)
for i in range(row):
    for j in range(col):
        pic_new.putpixel((i,j),int(256/(label[i][j]+1)))
pic_new.save("AP_apple.jpg","JPEG")

max_iter=20

max_iter=50

max_iter=100
图 6 Affinity Propagation聚类算法聚类后的图像

1.6 Birch聚类

from sklearn.cluster import Birch
label = Birch(n_clusters = 2).fit_predict(imgData)
label=label.reshape([row,col])
pic_new = image.new("L",(row,col))
for i in range(row):
    for j in range(col):
        pic_new.putpixel((i,j),int(256/(label[i][j]+1)))
pic_new.save("Birch_apple.jpg","JPEG")

在这里插入图片描述

图7 Birch聚类算法聚类后的图像

1.7 DBSCAN聚类

from sklearn.cluster import DBSCAN
label = DBSCAN(eps=0.005,min_samples=1).fit_predict(imgData)
label=label.reshape([row,col])
pic_new = image.new("L",(row,col))
for i in range(row):
    for j in range(col):
        pic_new.putpixel((i,j),int(256/(label[i][j]+1)))
pic_new.save("DBSCAN_apple.jpg","JPEG")

eps=0.005

eps=0.07

eps=0.072
图 8 DBSCAN聚类算法聚类后的图像

1.8 高斯混合模型

from sklearn import mixture
label=mixture.GaussianMixture(n_components=4,covariance_type='full')
.fit_predict(imgData)
label=label.reshape([row,col])
pic_new = image.new("L",(row,col))
for i in range(row):
    for j in range(col):
        pic_new.putpixel((i,j),int(256/(label[i][j]+1)))
pic_new.save("GMM_apple.jpg","JPEG")


ncomponents=2

ncomponents=3

ncomponents=5
图 9 高斯混合模型聚类算法聚类后的图像

1.9 OPTICS聚类

from sklearn.cluster import OPTICS
label = OPTICS(min_samples=0.1, xi=0.005, min_cluster_size=0.05).fit_predict(imgData)
label=label.reshape([row,col])
pic_new = image.new("L",(row,col))
for i in range(row):
    for j in range(col):
        pic_new.putpixel((i,j),int(256/(label[i][j]+1)))
pic_new.save("OPTICS.jpg","JPEG")

在这里插入图片描述

图 10 OPTICS聚类算法聚类后的图像

1.10 Agglomerative聚类

from sklearn.cluster import AgglomerativeClustering
label = AgglomerativeClustering(n_clusters=3).fit_predict(imgData)
label=label.reshape([row,col])
print(label)
pic_new = image.new("L",(row,col))
for i in range(row):
    for j in range(col):
        pic_new.putpixel((i,j),int(256/(label[i][j]+1)))
pic_new.save("AC_apple.jpg","JPEG")

在这里插入图片描述

图 11 Agglomerative聚类算法聚类后的图像

2 作者注

博主: 于2020年毕业于安庆师范大学数学与计算科学学院信息与计算科学专业,QQ(1755826272)
说明: 本博客系毕业论文原文代码,距毕业近两年之久,今得兴致,整而发之!秉着开源精神将此代码进行公开,供大家学习使用。 转载请联系本人!!!
关于毕业论文::毕业论文的撰写过程涉及查阅文献资料、展开实验、撰写论文、查重一系列操作,其中滋味唯有经历者可意会。作者在实验过程中花去两月余时间,疫情在家,白天睡觉,晚上点灯调试代码,其中百般滋味。借撰写毕业论文之机会作者代码能力有所提升,查阅资料能力也随之提升。
关于博客内容: 博客写作仅供分享学习之用,如有理论方面困惑请移步他处自行查找,稍后博主可能补充,也可能不会补充,随性而为。如遇理论方面之困顿可联系博主讨论,欢迎来扰!

  • 24
    点赞
  • 182
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: 在MATLAB中,要对一张彩色图像进行层次聚类,首先需要将图像加载到MATLAB中。可以使用imread函数将图像加载为一个三维矩阵,其中每个元素表示图像的像素值。 接下来,可以使用将图像从RGB颜色空间转换为Lab颜色空间。可以使用rgb2lab函数来实现这一点。在Lab颜色空间中,颜色信息和亮度信息分开表示,这有利于后续的聚类。 然后,我们可以使用kmeans函数来对Lab颜色空间中的像素进行聚类。kmeans函数需要指定聚类的数目,这决定了最终的聚类结果的多少。可以尝试不同的聚类数目,以得到最佳的聚类结果。 聚类之后,可以将每个像素分配到一个聚类中心。这样,每个像素都有一个簇标签,表示它所属的聚类。 最后,可以根据聚类的结果将像素重新映射到RGB颜色空间,以得到彩色图像。可以使用lab2rgb函数来实现这一点。该函数将Lab颜色空间中的像素值转换为RGB颜色空间中的像素值。 综上所述,要在MATLAB中对一张彩色图像进行层次聚类,可以按照上述步骤进行操作。这样就可以得到图像的层次聚类结果,并将像素重新映射为彩色图像。 ### 回答2: Matlab是一种强大的编程语言和环境,可以用来进行图像处理和数据分析。在Matlab中,可以使用层次聚类算法对一张彩色图像进行聚类分析。 层次聚类是一种自底向上的聚类方法,它将相似的数据点逐步合并为更大的簇。对于彩色图像,可以使用RGB或者HSV三个通道的像素值来描述每个像素的颜色。首先,需要将图像转换为合适的颜色空间。例如,可以将图像从RGB颜色空间转换为HSV颜色空间,其中H表示色调,S表示饱和度,V表示亮度。 然后,可以使用层次聚类算法对转换后的图像进行聚类。在Matlab中,可以使用自带的函数`clusterdata`来实现层次聚类。该函数可以根据要求选择不同的距离度量和聚类方法,并返回聚类结果。 在层次聚类完成后,可以通过可视化来展示聚类结果。可以绘制不同聚类簇的颜色编码图像,或者将图像中的每个像素标记为所属簇的索引值。 总结来说,使用Matlab对一张彩色图像进行层次聚类的过程可以分为以下几个步骤:图像颜色空间的转换、选择合适的距离度量和聚类方法、调用`clusterdata`函数进行聚类、可视化聚类结果。这样可以帮助我们更好地理解图像中的颜色分布和聚类特点。 ### 回答3: MATLAB可以通过使用Image Processing Toolbox中的功能对一张彩色图像进行层次聚类处理。 首先,我们需要将彩色图像加载到MATLAB中。这可以通过使用imread函数来实现,该函数可以将图像文件读取为矩阵形式。 接下来,我们可以使用rgb2lab函数将RGB颜色空间转换为Lab颜色空间。由于Lab颜色空间与人眼感知更加相关,因此在聚类过程中使用Lab颜色空间可以提供更好的结果。 然后,我们可以使用kmeans函数执行聚类。kmeans函数是一种常用的聚类算法,它可以将数据点分为指定数量的簇。我们可以设置簇的数量为我们想要的层次聚类的数量。 在执行聚类之后,我们可以使用reshape函数将聚类结果重新构造为图像的形状。然后,我们可以使用label2rgb函数将标签映射为颜色,以生成可视化的聚类结果。 最后,我们可以使用imshow函数显示聚类结果。 综上所述,通过适当地使用MATLAB中的函数和工具箱,我们可以对一张彩色图像进行层次聚类处理,并以可视化的方式展示聚类结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值