Python 2.7 基于k-means的图像分割
我正在尝试使用k-means算法进行图像分割任务。问题是我的程序没有分割图像。 你能帮我找出代码中的错误吗 事实上,我已经将集群的数量固定为32。 我使用了以下数据结构: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():
- 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
条件始终为真
您需要使用
您的代码格式可能需要一点帮助。您的代码格式可能需要一点帮助。我已经按照您所说的修改了我的代码,k-means聚合。但是,分割失败。请添加另一个问题,询问为什么分割不起作用。在问题中,请解释一下,“分割不起作用”是什么意思。为了说明这一点,您可以附加两幅图像:分割输入和分割结果。正如您所说,我已经修改了我的代码,k-均值收敛。但是,分割失败。请添加另一个问题,询问为什么分割不起作用。在问题中,请解释,“分割不起作用”是什么意思。为了说明这一点,您可以附加两幅图像:分割输入和分割结果oldGroupe=numpy.copy(groupe)在
中创建数据副本groupe