利用OPENCV平台实现基于python的K-均值聚类方法,实现目标分割
# 导入相应的库
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
创作工场
免责声明:
以上内容除特别注明外均来源于网友提问,创作工场回答,未经许可,严谨转载。
点击这里>>使用🔥专业版,更聪明、更完整、更原创!