aiaiask.com©

开花即结果 提问即答案

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

利用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
利用OPENCV平台实现基于python的K-均值聚类方法,实现目标分割
https://www.aiaiask.com/ask/15220.html
AI / 模型iFLYTEK
时间 / DATEApril 20, 2023, 9:58 PM
语言zh-CN
IP / 区域江苏 常州