Python 2.7 基于k-means的图像分割

Python 2.7 基于k-means的图像分割,python-2.7,image-processing,machine-learning,computer-vision,k-means,Python 2.7,Image Processing,Machine Learning,Computer Vision,K Means,我正在尝试使用k-means算法进行图像分割任务。问题是我的程序没有分割图像。 你能帮我找出代码中的错误吗 事实上,我已经将集群的数量固定为32。 我使用了以下数据结构: 3个阵列bleu、vert、rouge存储每个像素的RGB值 3个阵列cluster_bleu、cluster_rouge、cluster_vert存储每个群集的RGB值 groupe[i,0]=k将每个像素i映射到簇k import cv2 import numpy import random def main():

我正在尝试使用k-means算法进行图像分割任务。问题是我的程序没有分割图像。 你能帮我找出代码中的错误吗

事实上,我已经将集群的数量固定为32。 我使用了以下数据结构:

  • 3个阵列bleu、vert、rouge存储每个像素的RGB值

  • 3个阵列cluster_bleu、cluster_rouge、cluster_vert存储每个群集的RGB值

  • groupe[i,0]=k将每个像素i映射到簇k

    import cv2
    
    import numpy
    
    import random
    def main():
        MAX_LARGEUR = 400
        MAX_HAUTEUR = 400
    
        K = 32 #Le fameux parametre K de l'algorithme
        imagecolor = cv2.imread('perr.jpg')
    
    
        if imagecolor.shape[0] > MAX_LARGEUR or imagecolor.shape[1] > MAX_HAUTEUR:
            factor1 = float(MAX_LARGEUR) / imagecolor.shape[0]
            factor2 = float(MAX_HAUTEUR) / imagecolor.shape[1]
            factor = min(factor1, factor2)
            imagecolor = cv2.resize(imagecolor, None, fx=factor, fy=factor, interpolation=cv2.INTER_AREA)
    
    
        nb_pixels = imagecolor.shape[0] * imagecolor.shape[1]
    
        bleu = imagecolor[:, :, 0].reshape(nb_pixels, 1)
        vert = imagecolor[:, :, 1].reshape(nb_pixels, 1)
        rouge = imagecolor[:, :, 2].reshape(nb_pixels, 1)
    
    
        cluster_bleu = numpy.zeros(K)
        cluster_vert = numpy.zeros(K)
        cluster_rouge = numpy.zeros(K)
    
        groupe = numpy.zeros((nb_pixels, 1)) 
    
        for i in range(0,K):
            groupe[i,0]=i
    
        for i in range(K,nb_pixels):
            groupe[i,0]=random.randint(0, K-1)
    
    
        condition =False
    
    
    
    
        def etape1(indices,i):
        s=indices.size
        rouge_s=0
        vert_s=0
        bleu_s=0
        #calcul de barycentre des points
        if s==0:
            cluster_rouge[i]=0  
            cluster_vert[i]=0
            cluster_bleu[i]=0
    
    
        if s >=1:
            for j in range(0,s):
                rouge_s=rouge_s+rouge[indices[j]]
                vert_s=vert_s+vert[indices[j]]
                bleu_s=bleu_s+bleu[indices[j]]
    
            #mise  jour des clusters 
    
            cluster_rouge[i]=rouge_s/s  
            cluster_vert[i]=vert_s/s
            cluster_bleu[i]=bleu_s/s        
    
    
        iteration=0
        oldGroupe = numpy.copy(groupe)
        while(condition==False) :
    
    
        for i in range(0,K):
    
            indices=numpy.where(groupe==i)[0]
            etape1(indices,i)
    
    
    
        for i in range(0,nb_pixels):
            minimum=10000;
            dist=0;
            index=-1;
            for j in range(0,K):
                 dist=(cluster_rouge[j]-rouge[i])**2+(cluster_vert[j]-vert[i])**2+(cluster_bleu[j]-bleu[i])**2;
                 if(dist<=minimum):
                    minimum=dist;
                    index=j;
    
    
    
            groupe[i,0]=index;
    
    
    
        condition=numpy.all(groupe==oldGroupe)
    
        oldGroupe = numpy.copy(groupe)  
    
    
        groupe=numpy.reshape(groupe, (imagecolor.shape[0], imagecolor.shape[1]))
    
    
    
    
        for i in range(0, imagecolor.shape[0]):
            for j in range(0, imagecolor.shape[1]):
                imagecolor[i,j,0] = (cluster_bleu[groupe[i,j]])
                imagecolor[i,j,1] = (cluster_vert[groupe[i,j]])
                imagecolor[i,j,2] = (cluster_rouge[groupe[i,j]])
    
        cv2.namedWindow("sortie")
        cv2.imshow("sortie", imagecolor)
        key = cv2.waitKey(0)
    if __name__ == "__main__":
        main()
    
    导入cv2
    进口numpy
    随机输入
    def main():
    最大值=400
    最大值=400
    K=32#Le fameux参数K de l’algorithme
    imagecolor=cv2.imread('perr.jpg'))
    如果imagecolor.shape[0]>MAX_LARGEUR或imagecolor.shape[1]>MAX_HAUTEUR:
    系数1=浮动(最大值)/图像颜色。形状[0]
    系数2=浮动(最大值)/图像颜色。形状[1]
    系数=最小值(系数1,系数2)
    imagecolor=cv2.调整大小(imagecolor,无,fx=因子,fy=因子,插值=cv2.内部面积)
    nb_pixels=imagecolor.shape[0]*imagecolor.shape[1]
    bleu=imagecolor[:,:,0]。重塑形状(nb_像素,1)
    vert=imagecolor[:,:,1]。重塑形状(nb_像素,1)
    胭脂=图像颜色[:,:,2]。重塑形状(nb_像素,1)
    集群_bleu=numpy.zeros(K)
    集群垂直=numpy.zero(K)
    簇红色=numpy.0(K)
    groupe=numpy.zero((nb_像素,1))
    对于范围(0,K)内的i:
    群[i,0]=i
    对于范围内的i(K,nb_像素):
    群[i,0]=random.randint(0,K-1)
    条件=假
    def etape1(索引,i):
    s=指数。大小
    胭脂=0
    垂直面=0
    bleu_s=0
    #点重心计算
    如果s==0:
    簇红色[i]=0
    簇垂直[i]=0
    集群_bleu[i]=0
    如果s>=1:
    对于范围(0,s)内的j:
    胭脂=胭脂+胭脂[指数[j]]
    垂直方向=垂直方向+垂直方向[指数[j]]
    bleu_s=bleu_s+bleu[指数[j]]
    #mise-jour-des团簇
    群集胭脂[i]=胭脂s/s
    集群垂直[i]=垂直s/s
    集群bleu[i]=bleu\u s/s
    迭代=0
    oldGroupe=numpy.copy(groupe)
    而(条件==False):
    对于范围(0,K)内的i:
    索引=numpy.where(groupe==i)[0]
    etape1(指数,一)
    对于范围内的i(0,nb_像素):
    最低=10000;
    dist=0;
    指数=-1;
    对于范围(0,K)内的j:
    dist=(cluster_ruge[j]-ruge[i])**2+(cluster_vert[j]-vert[i])**2+(cluster_bleu[j]-bleu[i])**2;
    
    如果(dist问题是赋值
    oldGroupe=groupe;
    ,它不复制数组,而是创建具有不同名称的引用(
    oldGroupe
    ),它指向与
    groupe
    相同的数据。因此,当您更改
    groupe
    时,您也会更改
    oldGroupe
    ,并且
    条件始终为真


    您想要的是使用
    oldGroupe=numpy.copy(groupe)
    groupe
    中创建一个数据副本。问题是赋值
    oldGroupe=groupe;
    它不复制数组,而是创建具有不同名称的引用(
    oldGroupe
    ),它指向与
    groupe
    相同的数据。因此,当您更改
    groupe
    时,您也会更改
    oldGroupe
    ,并且
    条件始终为真


    您需要使用
    oldGroupe=numpy.copy(groupe)在
    groupe
    中创建数据副本

    您的代码格式可能需要一点帮助。您的代码格式可能需要一点帮助。我已经按照您所说的修改了我的代码,k-means聚合。但是,分割失败。请添加另一个问题,询问为什么分割不起作用。在问题中,请解释一下,“分割不起作用”是什么意思。为了说明这一点,您可以附加两幅图像:分割输入和分割结果。正如您所说,我已经修改了我的代码,k-均值收敛。但是,分割失败。请添加另一个问题,询问为什么分割不起作用。在问题中,请解释,“分割不起作用”是什么意思。为了说明这一点,您可以附加两幅图像:分割输入和分割结果