最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python基于K-means聚類(lèi)算法的圖像分割

 更新時(shí)間:2019年10月30日 11:01:41   作者:iwuqing  
這篇文章主要介紹了python基于K-means聚類(lèi)算法的圖像分割,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1 K-means算法

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

1.1 算法思路

  1. 隨機(jī)選取聚類(lèi)中心
  2. 根據(jù)當(dāng)前聚類(lèi)中心,利用選定的度量方式,分類(lèi)所有樣本點(diǎn)
  3. 計(jì)算當(dāng)前每一類(lèi)的樣本點(diǎn)的均值,作為下一次迭代的聚類(lèi)中心
  4. 計(jì)算下一次迭代的聚類(lèi)中心與當(dāng)前聚類(lèi)中心的差距
  5. 如4中的差距小于給定迭代閾值時(shí),迭代結(jié)束。反之,至2繼續(xù)下一次迭代

1.2 度量方式

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

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

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

2.1 Code

導(dǎo)入必要的包

import numpy as np
import random

損失函數(shù)

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

分類(lèi)器

def classifer(intput_signal, center):
  '''
  分類(lèi)器(通過(guò)當(dāng)前的聚類(lèi)中心,給輸入圖像分類(lèi))
  :param intput_signal: 輸入圖像
  :param center: 聚類(lèi)中心
  :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è)元素與所有聚類(lèi)中心的距離,臨時(shí)用

  for i in range(input_row):
    for j in range(input_col):
      # 計(jì)算每個(gè)像素與所有聚類(lèi)中心的差平方
      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)
      # 差異最小則為該類(lèi)
      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: 聚類(lèi)中心數(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ī)初始聚類(lèi)中心行標(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)前的聚類(lèi)中心
  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ǔ)存前一次的聚類(lèi)中心
    # 計(jì)算當(dāng)前聚類(lèi)中心
    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)前聚類(lèi)中心分類(lèi)
    pixls_labels = classifer(input_signal_cp, present_center)
    # 計(jì)算上一次聚類(lèi)中心與當(dāng)前聚類(lèi)中心的差異
    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 分類(lèi)效果

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

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

4 GitHub

click me

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python網(wǎng)絡(luò)編程之多線程同時(shí)接受和發(fā)送

    python網(wǎng)絡(luò)編程之多線程同時(shí)接受和發(fā)送

    這篇文章主要為大家詳細(xì)介紹了python網(wǎng)絡(luò)編程之多線程同時(shí)接受和發(fā)送,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • python中日志logging模塊的性能及多進(jìn)程詳解

    python中日志logging模塊的性能及多進(jìn)程詳解

    使用Python來(lái)寫(xiě)后臺(tái)任務(wù)時(shí),時(shí)常需要使用輸出日志來(lái)記錄程序運(yùn)行的狀態(tài),并在發(fā)生錯(cuò)誤時(shí)將錯(cuò)誤的詳細(xì)信息保存下來(lái),以別調(diào)試和分析。Python的logging模塊就是這種情況下的好幫手。本文就介紹了python中日志logging模塊性能及多進(jìn)程的相關(guān)資料,需要的朋友可以參考下。
    2017-07-07
  • Python文件讀寫(xiě)open函數(shù)詳解

    Python文件讀寫(xiě)open函數(shù)詳解

    這篇文章主要介紹了Python文件讀寫(xiě)open函數(shù)詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • Pandas使用SQLite3實(shí)戰(zhàn)

    Pandas使用SQLite3實(shí)戰(zhàn)

    本文主要介紹了Pandas使用SQLite3實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • python中Mako庫(kù)實(shí)例用法

    python中Mako庫(kù)實(shí)例用法

    在本篇文章里小編給大家分享的是一篇關(guān)于python中Mako庫(kù)實(shí)例用法的相關(guān)文章,有需要的朋友們可以學(xué)習(xí)參考下。
    2020-12-12
  • Python高級(jí)特性切片(Slice)操作詳解

    Python高級(jí)特性切片(Slice)操作詳解

    在Python中對(duì)于具有序列結(jié)構(gòu)的數(shù)據(jù)來(lái)說(shuō)都可以使用切片操作,需注意的是序列對(duì)象某個(gè)索引位置返回的是一個(gè)元素,而切片操作返回是和被切片對(duì)象相同類(lèi)型對(duì)象的副本。
    2018-09-09
  • Python 多線程處理任務(wù)實(shí)例

    Python 多線程處理任務(wù)實(shí)例

    這篇文章主要介紹了Python 多線程處理任務(wù),下面文章利用一個(gè)真實(shí)實(shí)例圍繞Python 多線程處理任務(wù)的相關(guān)資料展開(kāi)內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • Python基于Dlib的人臉識(shí)別系統(tǒng)的實(shí)現(xiàn)

    Python基于Dlib的人臉識(shí)別系統(tǒng)的實(shí)現(xiàn)

    這篇文章主要介紹了Python基于Dlib的人臉識(shí)別系統(tǒng)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 使用Python合并Excel文件中的多個(gè)Sheet的實(shí)現(xiàn)過(guò)程

    使用Python合并Excel文件中的多個(gè)Sheet的實(shí)現(xiàn)過(guò)程

    在Python中,可以使用pandas庫(kù)來(lái)處理Excel文件,將多個(gè)工作表(sheets)合并為一個(gè)工作表,以下是一個(gè)詳細(xì)的代碼示例,展示了如何實(shí)現(xiàn)這一功能,文中有相關(guān)的代碼供大家參考,需要的朋友可以參考下
    2024-10-10
  • Python格式化日期時(shí)間操作示例

    Python格式化日期時(shí)間操作示例

    這篇文章主要介紹了Python格式化日期時(shí)間操作,結(jié)合實(shí)例形式分析了Python使用time模塊針對(duì)日期時(shí)間的獲取、轉(zhuǎn)換、格式化、判斷等相關(guān)操作技巧,需要的朋友可以參考下
    2018-06-06

最新評(píng)論

达州市| 濮阳市| 武川县| 临西县| 防城港市| 休宁县| 延边| 汕尾市| 昔阳县| 特克斯县| 景宁| 常德市| 卓尼县| 满洲里市| 九江市| 湘阴县| 民乐县| 陈巴尔虎旗| 浮山县| 黔西| 曲周县| 新余市| 夏津县| 全南县| 洞头县| 七台河市| 定远县| 清徐县| 康平县| 黄陵县| 海丰县| 平阳县| 高台县| 邹平县| 泾川县| 上高县| 永定县| 禄丰县| 滨海县| 博野县| 万年县|