怎么在python中利用K-means聚類算法對(duì)圖像進(jìn)行分割-創(chuàng)新互聯(lián)

本篇文章給大家分享的是有關(guān)怎么在python中利用K-means聚類算法對(duì)圖像進(jìn)行分割,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站建設(shè)、做網(wǎng)站、靖遠(yuǎn)網(wǎng)絡(luò)推廣、小程序制作、靖遠(yuǎn)網(wǎng)絡(luò)營(yíng)銷、靖遠(yuǎn)企業(yè)策劃、靖遠(yuǎn)品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供靖遠(yuǎn)建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:muchs.cn

1 K-means算法

實(shí)際上,無(wú)論是從算法思想,還是具體實(shí)現(xiàn)上,K-means算法是一種很簡(jiǎn)單的算法。它屬于無(wú)監(jiān)督分類,通過(guò)按照一定的方式度量樣本之間的相似度,通過(guò)迭代更新聚類中心,當(dāng)聚類中心不再移動(dòng)或移動(dòng)差值小于閾值時(shí),則就樣本分為不同的類別。

1.1 算法思路

  1. 隨機(jī)選取聚類中心

  2. 根據(jù)當(dāng)前聚類中心,利用選定的度量方式,分類所有樣本點(diǎn)

  3. 計(jì)算當(dāng)前每一類的樣本點(diǎn)的均值,作為下一次迭代的聚類中心

  4. 計(jì)算下一次迭代的聚類中心與當(dāng)前聚類中心的差距

  5. 如4中的差距小于給定迭代閾值時(shí),迭代結(jié)束。反之,至2繼續(xù)下一次迭代

1.2 度量方式

根據(jù)聚類中心,將所有樣本點(diǎn)分為最相似的類別。這需要一個(gè)有效的盤踞,平方差是最常用的度量方式,如下

怎么在python中利用K-means聚類算法對(duì)圖像進(jìn)行分割

2 應(yīng)用于圖像分割

我們知道:無(wú)論是灰度圖還是RGB彩色圖,實(shí)際上都是存有灰度值的矩陣,所以,圖像的數(shù)據(jù)格式?jīng)Q定了在圖像分割方向上,使用K-means聚類算法是十分容易也十分具體的。

2.1 Code

導(dǎo)入必要的包

import numpy as np
import random

損失函數(shù)

def loss_function(present_center, pre_center):
  '''
  損失函數(shù),計(jì)算上一次與當(dāng)前聚類中的差異(像素差的平方和)
  :param present_center: 當(dāng)前聚類中心
  :param pre_center: 上一次聚類中心
  :return: 損失值
  '''
  present_center = np.array(present_center)
  pre_center = np.array(pre_center)
  return np.sum((present_center - pre_center)**2)

分類器

def classifer(intput_signal, center):
  '''
  分類器(通過(guò)當(dāng)前的聚類中心,給輸入圖像分類)
  :param intput_signal: 輸入圖像
  :param center: 聚類中心
  :return: 標(biāo)簽矩陣
  '''
  input_row, input_col= intput_signal.shape # 輸入圖像的尺寸

  pixls_labels = np.zeros((input_row, input_col)) # 儲(chǔ)存所有像素標(biāo)簽

  pixl_distance_t = [] # 單個(gè)元素與所有聚類中心的距離,臨時(shí)用

  for i in range(input_row):
    for j in range(input_col):
      # 計(jì)算每個(gè)像素與所有聚類中心的差平方
      for k in range(len(center)):
        distance_t = np.sum(abs((intput_signal[i, j]).astype(int) - center[k].astype(int))**2)
        pixl_distance_t.append(distance_t)
      # 差異最小則為該類
      pixls_labels[i, j] = int(pixl_distance_t.index(min(pixl_distance_t)))
      # 清空該list,為下一個(gè)像素點(diǎn)做準(zhǔn)備
      pixl_distance_t = []
  return pixls_labels

基于k-means算法的圖像分割

def k_means(input_signal, center_num, threshold):
  '''
  基于k-means算法的圖像分割(適用于灰度圖)
  :param input_signal: 輸入圖像
  :param center_num: 聚類中心數(shù)目
  :param threshold: 迭代閾值
  :return:
  '''
  input_signal_cp = np.copy(input_signal) # 輸入信號(hào)的副本
  input_row, input_col = input_signal_cp.shape # 輸入圖像的尺寸
  pixls_labels = np.zeros((input_row, input_col)) # 儲(chǔ)存所有像素標(biāo)簽

  # 隨機(jī)初始聚類中心行標(biāo)與列標(biāo)
  initial_center_row_num = [i for i in range(input_row)]
  random.shuffle(initial_center_row_num)
  initial_center_row_num = initial_center_row_num[:center_num]

  initial_center_col_num = [i for i in range(input_col)]
  random.shuffle(initial_center_col_num)
  initial_center_col_num = initial_center_col_num[:center_num]

  # 當(dāng)前的聚類中心
  present_center = []
  for i in range(center_num):
    present_center.append(input_signal_cp[initial_center_row_num[i], initial_center_row_num[i]])
  pixls_labels = classifer(input_signal_cp, present_center)

  num = 0 # 用于記錄迭代次數(shù)
  while True:
    pre_centet = present_center.copy() # 儲(chǔ)存前一次的聚類中心
    # 計(jì)算當(dāng)前聚類中心
    for n in range(center_num):
      temp = np.where(pixls_labels == n)
      present_center[n] = sum(input_signal_cp[temp].astype(int)) / len(input_signal_cp[temp])
    # 根據(jù)當(dāng)前聚類中心分類
    pixls_labels = classifer(input_signal_cp, present_center)
    # 計(jì)算上一次聚類中心與當(dāng)前聚類中心的差異
    loss = loss_function(present_center, pre_centet)
    num = num + 1
    print("Step:"+ str(num) + "  Loss:" + str(loss))
    # 當(dāng)損失小于迭代閾值時(shí),結(jié)束迭代
    if loss <= threshold:
      break
  return pixls_labels

3 分類效果

怎么在python中利用K-means聚類算法對(duì)圖像進(jìn)行分割

聚類中心個(gè)數(shù)=3,迭代閾值為=1

怎么在python中利用K-means聚類算法對(duì)圖像進(jìn)行分割

聚類中心個(gè)數(shù)=3,迭代閾值為=1

以上就是怎么在python中利用K-means聚類算法對(duì)圖像進(jìn)行分割,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享文章:怎么在python中利用K-means聚類算法對(duì)圖像進(jìn)行分割-創(chuàng)新互聯(lián)
路徑分享:http://muchs.cn/article46/deichg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司手機(jī)網(wǎng)站建設(shè)、App開(kāi)發(fā)、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站改版、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷型網(wǎng)站建設(shè)