0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于K-means聚類算法的圖像分割

新機(jī)器視覺 ? 來源:新機(jī)器視覺 ? 2023-09-07 16:59 ? 次閱讀

				

圖像分割:利用圖像的灰度、顏色、紋理、形狀等特征,把圖像分成若干個互不重疊的區(qū)域,并使這些特征在同一區(qū)域內(nèi)呈現(xiàn)相似性,在不同的區(qū)域之間存在明顯的差異性。然后就可以將分割的圖像中具有獨(dú)特性質(zhì)的區(qū)域提取出來用于不同的研究。

1. 應(yīng)用

  • 在機(jī)車檢驗領(lǐng)域,可以應(yīng)用到輪轂裂紋圖像的分割,及時發(fā)現(xiàn)裂紋,保證行車安全。

  • 在生物醫(yī)學(xué)工程方面,對肝臟CT圖像進(jìn)行分割,為臨床治療和病理學(xué)研究提供幫助。

2. 圖像分割常用方法

  • 閾值分割:對圖像灰度值進(jìn)行度量,設(shè)置不同類別的閾值,達(dá)到分割的目的。

  • 邊緣分割:對圖像邊緣進(jìn)行檢測,即檢測圖像中灰度值發(fā)生跳變的地方,則為一片區(qū)域的邊緣。

  • 直方圖法:對圖像的顏色建立直方圖,而直方圖的波峰波谷能夠表示一塊區(qū)域的顏色值的范圍,來達(dá)到分割的目的。

  • 特定理論:基于聚類分析小波變換等理論完成圖像分割。

3. 實例描述

  • 目標(biāo):利用K-means聚類算法對圖像像素點(diǎn)顏色進(jìn)行聚類。

  • 輸出:同一聚類中的點(diǎn)使用相同顏色標(biāo)記,不同聚類顏色不同。

  • 導(dǎo)入Python模塊:from sklearn.cluster import KMeans

  • 實例數(shù)據(jù):本實例中的數(shù)據(jù)可以是任意大小的圖片,為了使效果更佳直觀,可以采用區(qū)分度比較明顯的圖片。

4. 實驗過程

  • [ Step1 ] 建立工程并導(dǎo)入sklearn包

  • [ Step2 ] 加載圖片并進(jìn)行預(yù)處理

  • [ Step3 ] 加載K-means聚類算法

  • [ Step4 ] 對像素點(diǎn)進(jìn)行聚類并輸出

PIL包: 因為本實驗涉及圖像的加載和創(chuàng)建,因此需要使用到 PIL 包。

Step1: 建立工程并導(dǎo)入sklearn包
  • 創(chuàng)建Kmeans.py文件

  • 導(dǎo)入sklearn相關(guān)包

import numpy as np
from PIL import Image  #加載PIL包,用于加載創(chuàng)建圖片
from sklearn.cluster import KMeans  #加載Kmeans算法
import matplotlib.pyplot as plt  #繪制圖像
Step2: 加載圖片并進(jìn)行預(yù)處理
  • 加載訓(xùn)練數(shù)據(jù)

def loadData(filePath):
    f = open(filePath, 'rb') #以二進(jìn)制形式打開文件
    data = []
    img = Image.open(f)  #以列表的形式返回圖片像素值
    m, n = img.size   #獲取圖片的大小
    for i in range(m):  #將每個像素點(diǎn)的RGB顏色處理到0-1
        for j in range(n):
            x,y,z = img.getpixel((i,j))
            data.append([x/256.0, y/256.0, z/256.0]) #范圍內(nèi)并存入data
    f.close()
    return np.mat(data), m, n #以矩陣的形式返回data,以及圖片大小
Step3: 加載K-means聚類算法
  • 選取聚類中心個數(shù)

#加載Kmeans聚類算法
km = KMeans(n_clusters= 3) #其中n clusters屬性指定了聚類中心的個數(shù)為3
Step4: 對像素點(diǎn)進(jìn)行聚類并輸出
  • 對像素點(diǎn)進(jìn)行聚類并輸出心依據(jù)聚類中心,對屬于同一聚類的點(diǎn)使用同樣的顏色進(jìn)行標(biāo)記。

#聚類獲取每個像素所屬的類別
label = km.fit_predict(imgData)
label = label.reshape([row, col])
#創(chuàng)建一張新的灰度圖保存聚類后的結(jié)果
pic_new = Image.new('L', (row, col))
#根據(jù)所屬類別向圖片中添加灰度值
# 最終利用聚類中心點(diǎn)的RGB值替換原圖中每一個像素點(diǎn)的值,便得到了最終的分割后的圖片
for i in range(row):
    for j in range(col):
        pic_new.putpixel((i, j), int(256 / (label[i][j] + 1)))
#以JPEG格式保存圖片
pic_new.save("result_demo1.jpg","JPEG")
plt.imshow(pic_new)
plt.show()
5. 用例數(shù)據(jù)及展示結(jié)果

6de7ea7c-4d5b-11ee-a25d-92fbcf53809c.png

6.K-means聚類算法-程序代碼

# -*- coding: utf-8 -*-
# @Time    : 2020/3/31 21:27
# @Author  : Zudy
# @FileName: course1.py
'''
1.進(jìn)行圖像中顏色的分類(K-means聚類算法對圖像像素點(diǎn)顏色進(jìn)行聚類實現(xiàn)間的圖像分割)
'''
import numpy as np
from PIL import Image
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
def loadData(filePath):
    f = open(filePath, 'rb') #以二進(jìn)制形式打開文件
    data = []
    img = Image.open(f)  #以列表的形式返回圖片像素值
    m, n = img.size   #獲取圖片的大小
for i in range(m):  #將每個像素點(diǎn)的RGB顏色處理到0-1
for j in range(n):
            x,y,z = img.getpixel((i,j))
            data.append([x/256.0, y/256.0, z/256.0]) #范圍內(nèi)并存入data
    f.close()
return np.mat(data), m, n #以矩陣的形式返回data,以及圖片大小
path='./基于聚類的整圖分割/demo1.jpg'
imgData, row, col = loadData(filePath= path)
print(imgData)
print(row)
print(col)
#加載Kmeans聚類算法
km = KMeans(n_clusters= 3)
#聚類獲取每個像素所屬的類別
label = km.fit_predict(imgData)
label = label.reshape([row, col])
#創(chuàng)建一張新的灰度圖保存聚類后的結(jié)果
pic_new = Image.new('L', (row, col))
#根據(jù)所屬類別向圖片中添加灰度值
# 最終利用聚類中心點(diǎn)的RGB值替換原圖中每一個像素點(diǎn)的值,便得到了最終的分割后的圖片
for i in range(row):
for j in range(col):
        pic_new.putpixel((i, j), int(256 / (label[i][j] + 1)))
#以JPEG格式保存圖片
pic_new.save("result_demo1.jpg","JPEG")
plt.imshow(pic_new)
plt.show()

驗分析

通過設(shè)置不同的k值,能夠得到不同的聚類結(jié)果。同時,k值的不確定也是Kmeans算法的一個缺點(diǎn)。往往為了達(dá)到好的實驗結(jié)果,需要進(jìn)行多次嘗試才能夠選取最優(yōu)的k值。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 圖像分割
    +關(guān)注

    關(guān)注

    4

    文章

    180

    瀏覽量

    17930
  • 聚類算法
    +關(guān)注

    關(guān)注

    2

    文章

    118

    瀏覽量

    12101
  • K-means
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    11267

原文標(biāo)題:[sklearn]基于K-means聚類算法的圖像分割

文章出處:【微信號:vision263com,微信公眾號:新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    基于距離的算法K-means的設(shè)計實現(xiàn)

    K-means 算法是典型的基于距離的算法,采用距離作為相似性的評價指標(biāo),兩個對象的距離越近,其相似度就越大。而簇是由距離靠近的對象組成
    的頭像 發(fā)表于 07-18 09:19 ?2098次閱讀
    基于距離的<b class='flag-5'>聚</b><b class='flag-5'>類</b><b class='flag-5'>算法</b><b class='flag-5'>K-means</b>的設(shè)計實現(xiàn)

    一種增強(qiáng)的K-means算法在入侵檢測中的應(yīng)用

           異常檢測是入侵檢測中防范新型攻擊的基本手段,本文應(yīng)用增強(qiáng)的K-means 算法對檢測數(shù)據(jù)進(jìn)行分類。計算機(jī)仿
    發(fā)表于 09-03 10:21 ?14次下載

    Web文檔k-means算法的改進(jìn)

    Web文檔k-means算法的改進(jìn) 介紹了Web文檔中普遍使用的、基于
    發(fā)表于 09-19 09:17 ?1027次閱讀
    Web文檔<b class='flag-5'>聚</b><b class='flag-5'>類</b>中<b class='flag-5'>k-means</b><b class='flag-5'>算法</b>的改進(jìn)

    K-means+算法研究綜述

    介紹了K-means 算法的目標(biāo)函數(shù)、算法流程,并列舉了一個實例,指出了數(shù)據(jù)子集的數(shù)目K、初
    發(fā)表于 05-07 14:09 ?27次下載
    <b class='flag-5'>K-means</b>+<b class='flag-5'>聚</b><b class='flag-5'>類</b><b class='flag-5'>算法</b>研究綜述

    基于離散量改進(jìn)k-means初始中心選擇的算法

    傳統(tǒng)kmeans算法由于初始中心的選擇是隨機(jī)的,因此會使結(jié)果不穩(wěn)定。針對這個問題,提出一種基于離散量改進(jìn)
    發(fā)表于 11-20 10:03 ?2次下載

    基于密度的K-means算法數(shù)目中應(yīng)用

    針對傳統(tǒng)的K-means算法無法預(yù)先明確數(shù)目,對初始中心選取敏感且易受離群孤點(diǎn)影響導(dǎo)致
    發(fā)表于 11-25 11:35 ?0次下載

    K均值算法的MATLAB實現(xiàn)

    K-means算法是最簡單的一種算法。算法的目的是使各個樣本與所在
    發(fā)表于 12-01 14:07 ?2w次閱讀
    <b class='flag-5'>K</b>均值<b class='flag-5'>聚</b><b class='flag-5'>類</b><b class='flag-5'>算法</b>的MATLAB實現(xiàn)

    K-Means算法改進(jìn)及優(yōu)化

    傳統(tǒng)的k-means算法采用的是隨機(jī)數(shù)初始化中心的方法,這種方法的主要優(yōu)點(diǎn)是能夠快速的產(chǎn)生初始化的
    發(fā)表于 12-05 18:32 ?0次下載
    <b class='flag-5'>K-Means</b><b class='flag-5'>算法</b>改進(jìn)及優(yōu)化

    基于布谷鳥搜索的K-means算法

    針對原始K-means算法受初始中心影響過大以及容易陷入局部最優(yōu)的不足,提出一種基于改進(jìn)
    發(fā)表于 12-13 17:24 ?3次下載

    大數(shù)據(jù)處理的優(yōu)化抽樣K-means算法

    針對大數(shù)據(jù)環(huán)境下K-means算法精度不足和收斂速度慢的問題,提出一種基于優(yōu)化抽樣
    發(fā)表于 12-22 15:47 ?4次下載
    大數(shù)據(jù)處理的優(yōu)化抽樣<b class='flag-5'>聚</b><b class='flag-5'>類</b><b class='flag-5'>K-means</b><b class='flag-5'>算法</b>

    K-Means算法的簡單介紹

    K-Means是十大經(jīng)典數(shù)據(jù)挖掘算法之一。K-Means和KNN(K鄰近)看上去都是K打頭,但卻是不同種類的
    發(fā)表于 07-05 14:18 ?4837次閱讀

    如何使用K-Means算法改進(jìn)的特征加權(quán)算法詳細(xì)資料概述

    聚類分析是將研究對象分為相對同質(zhì)的群組的統(tǒng)計分析技術(shù),聚類分析的核心就是發(fā)現(xiàn)有用的對象簇。K-means算法由于具有出色的速度和良好的可擴(kuò)展性,一直備受廣大學(xué)者的關(guān)注。然而,傳統(tǒng)的
    發(fā)表于 12-20 10:28 ?10次下載

    K-MEANS算法概述及工作原理

    K-means 是一種算法,且對于數(shù)據(jù)科學(xué)家而言,是簡單且熱門的無監(jiān)督式機(jī)器學(xué)習(xí)(ML)算法之一。
    的頭像 發(fā)表于 06-06 11:53 ?3763次閱讀

    K-means算法指南

    技術(shù)領(lǐng)域中,K-means可能是最常見和經(jīng)常使用的技術(shù)之一。K-means使用迭代細(xì)化方法,基于用戶定義的集群數(shù)量(由變量K表示)和數(shù)
    的頭像 發(fā)表于 10-28 14:25 ?1255次閱讀

    大學(xué)課程 數(shù)據(jù)分析 實戰(zhàn)之K-means算法(2)算法代碼

    繼續(xù)講解! 程序來啦! 最后看一下程序示例!看看如何用K-means算法實現(xiàn)數(shù)據(jù)的過程。程序很簡單,側(cè)重讓大家了解和掌握 K-means
    的頭像 發(fā)表于 02-11 07:20 ?386次閱讀