qcode
  • 创作工场专业版,一问多答!更智能、更完整、更原创
  • 这是一个超强内容创作平台,它会写文章、做设计、绘图、敲代码,有问必答!
🔥点击使用-高级专业版🔥

利用OPENCV平台实现基于python的K-均值聚类方法,实现目标分割

时间2023-04-20 21:58:22 提问来自 江苏省常州市 的网友 分类创作 浏览324
# 导入相应的库 import cv2 import numpy as np # 读取图片并转换为灰度图像,作为聚类的数据集 img = cv2.imread('test.jpg') # 读取图片 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 将RGB图像转换为灰度图像 # 定义K-means函数,用于实现K-means聚类方法 def KMeans(dataSet, k): # dataSet:数据集;k:分割成多少部分 numSamples, dim = dataSet.shape # numSamples:样本总量;dim:样本的特征数 # 确定随机中心点 clusterCenters=np.zeros((k,dim)) # 生成k行dim列的0阵 for i in range(k): # 选取随机中心点 index = int(np.random.uniform(0,numSamples)) # 随机生成一个在[0,numSamples)之间的整形随机数 clusterCenters[i]=dataSet[index] # 根据随机生成的index将对应样本作为中心点 clusterChanged=True # 标识是否已完成所以样本分配迭代过程 while clusterChanged: clusterChanged=False for i in range(numSamples): # 遍历所以样本 minDist=100000 ## 表明minDist与clusterAssment[i]之间关联 minIndex=-1 ## 表明minIndex与clusterAssment[i]之间关联 ### 找出当前样例到各中心之间的距离 ### 判断当前样例属于哪一中心 ### 最小化误差并更新clusterAssment for j in range(k): distJI=np.linalg.norm(clusterCenters[j]-dataSet[i]) if distJI<minDist: minDist=distJI minIndex=j ## 更新当前样例对应的中心 if clusterAssment[i][0]!=minIndex or clusterAssment[i][1]>minDist**2 : clusterChanged==True clusterAssment[i]=minIndex,minDist**2 ## 更新已存在的中心位置 for j in range (k): pointsInCluster = dataSet [np . nonzero (clusterAssment [:, 0].A == j)[ 0]] if len (pointsInCluster)! = 0 : newCenter = np . mean (pointsInCluster , axis = 0 ) newCenter += 1e - 4 * np . random . randn (*newCenter . shape ) if not np . equal (newCenter ,clusterCenters [j ]). all () : cluterChanged == True cluterCenters [j ]== newCenter print("The iteration is complete!") return cluterCenters , cluterAssemtent def main(): dataSet=[]; img_shape=(gray . shape ) m , n = img_shape gray_reshape=(m * n ). reshape ((m * n ), 1 ) gray_list=[float (gray_reshape [ i ][ 0 ])for i in range ( m * n )] gray_array=(np . array (gray_list ))/255; dataSet=(np . matrix ([ list for list in gray_array ])). T ; kmeansResult , labelsResult , centersResult = KMeans ((dataSet ), 2 ); labelsResult=(labelsResult / 255 ). astype ("uint8") ; labelsMat=(labelsResult ). reshape ((m ,n )) ; labelsMat3D=cv2 . merge ([labelsMat ]) ; dstImg3D=(cv2 . bitwise _and ( img , img

点击这里,进行内容创作

创作工场 免责声明:
以上内容除特别注明外均来源于网友提问,创作工场回答,未经许可,严谨转载。
点击这里>>使用🔥专业版,更聪明、更完整、更原创!

上一篇 写一篇原神同人文 下一篇 人类对英语上瘾了吗英语作文