SKlearn + Image 基于Kmeans的圖像分割

讀取圖片并縮放

讀取單個圖片,出于實(shí)際需要與減少工作量的考量,將圖片以100個像素的固定寬度按比例縮小寓涨。

def load_pic(pic_path):
    # 加載圖片并縮放

    with open(pic_path, 'rb') as f:
        pic = image.open(f)

        # 縮放
        m, n = pic.size
        S_x = 100
        S_y = int((S_x / m) * n)
        pic = pic.resize((S_x, S_y), image.ANTIALIAS)

    return pic

Kmeans圖像分割

直接對圖像利用k均值算法進(jìn)行分割

def km_pic(f):
    # 圖像分割

    # 讀取圖片
    pic = load_pic(f)
    row, col = pic.size

    # 圖片轉(zhuǎn)為矩陣
    data = []
    for i in range(row):
        for j in range(col):
            x, y, z = pic.getpixel((i, j))
            data.append([x / 256.0, y / 256.0, z / 256.0])

    pic = np.mat(data)

    # 聚類
    label = KMeans(n_clusters=3).fit_predict(pic)
    label = label.reshape([row, col])
    pic_new = image.new("L", (row, col))

    for i in range(row):
        for j in range(col):
            pic_new.putpixel((i, j), int(label[i][j]))

    return pic_new

對于四張測試圖片姆坚,其中第二嘶炭、三張得到了不錯的效果,但第一辖源、四張卻十分不理想竭缝,主體區(qū)分不明顯,噪點(diǎn)也很多傻粘。

直接聚類的效果.jpeg

加入濾波降噪

為了改進(jìn)程序每窖,修改了km_pic函數(shù),將圖片轉(zhuǎn)為矩陣的過程抽出弦悉,編寫一個新的函數(shù)用于圖像的預(yù)處理窒典,加入濾波處理降噪。

def pic_change(pic):
    # 預(yù)處理稽莉,濾波

    # 濾波
    pic = pic.filter(ImageFilter.RankFilter(3, 8))

    # 圖片轉(zhuǎn)為矩陣
    m, n = pic.size
    data = []
    for i in range(m):
        for j in range(n):
            x, y, z = pic.getpixel((i, j))
            data.append([x / 256.0, y / 256.0, z / 256.0])

    d = np.mat(data)

    return d, m, n

濾波后主體被明顯區(qū)分出來瀑志,噪點(diǎn)減少,但仔細(xì)觀察污秆,圖像的陰影部分效果仍有待提高(例如圖二右下角)劈猪。

加入濾波后的效果.jpeg

對數(shù)變換降低對比度

編寫對數(shù)變換的函數(shù)并加入到預(yù)處理的函數(shù)中。

def log_pic(pic_m, v):
    # 對數(shù)變換算法

    g = np.log2(1 + v * pic_m) / np.log2(v + 1)
    img_m = (g * 255)

    return img_m
對數(shù)變換后的效果.jpeg

根據(jù)結(jié)果摳圖

由于是采用的k=3的聚類良拼,對得到的結(jié)果二值化處理

# 二值化
back = pic_new.getpixel((0, 0))
pic_new = pic_new.point(lambda x: 0 if x == back else 1)

編寫函數(shù)根據(jù)最終的結(jié)果在原圖上摳圖岸霹。

def pic_split(f, p):
    # 由得到的結(jié)果在原圖上摳圖。

    # 加載原圖
    pic = load_pic(f)
    m, n = pic.size
    
    # 比較與摳圖
    for i in range(m):
        for j in range(n):
            if p.getpixel((i, j)) == 0:
                pic.putpixel((i, j), 0)

    return pic

最終效果

對代碼進(jìn)一步修改将饺,得到的最終結(jié)果如下:


最終結(jié)果.jpeg

完整代碼

import numpy as np
import PIL.Image as image
from PIL import ImageFilter
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt


def log_pic(pic_m, v):
    # 對數(shù)變換算法

    g = np.log2(1 + v * pic_m) / np.log2(v + 1)
    img_m = (g * 255)

    return img_m


def load_pic(pic_path):
    # 加載圖片并縮放

    with open(pic_path, 'rb') as f:
        pic = image.open(f)

        # 縮放
        m, n = pic.size
        S_x = 100
        S_y = int((S_x / m) * n)
        pic = pic.resize((S_x, S_y), image.ANTIALIAS)

    return pic


def pic_change(pic):
    # 預(yù)處理贡避,濾波與對數(shù)變換

    # 濾波
    pic = pic.filter(ImageFilter.RankFilter(5, 24))

    m, n = pic.size
    data = []
    for i in range(m):
        for j in range(n):
            x, y, z = pic.getpixel((i, j))
            data.append([x / 256.0, y / 256.0, z / 256.0])

    d = np.mat(data)

    # 對數(shù)變換
    d = log_pic(d, 10)

    return d, m, n


def pic_split(f, p):
    # 由得到的結(jié)果在原圖上摳圖

    # 加載原圖
    pic = load_pic(f)
    m, n = pic.size

    # 比較與摳圖
    for i in range(m):
        for j in range(n):
            if p.getpixel((i, j)) == 0:
                pic.putpixel((i, j), 0)

    return pic


def km_pic(f):
    # 圖像分割

    pic = load_pic(f)
    img_data, row, col = pic_change(pic)

    # 聚類
    label = KMeans(n_clusters=3).fit_predict(img_data)
    label = label.reshape([row, col])
    pic_new = image.new("L", (row, col))

    for i in range(row):
        for j in range(col):
            pic_new.putpixel((i, j), int(256 / (label[i][j] + 1)))

    # 濾波
    pic_new = pic_new.filter(ImageFilter.ModeFilter(7))

    # 二值化
    back = pic_new.getpixel((0, 0))
    pic_new = pic_new.point(lambda x: 0 if x == back else 1)

    # 摳圖
    pic_new = pic_split(f,pic_new)

    return pic_new


f1 = 'F:/g.jpg'
f2 = 'F:/k.jpg'
f3 = 'F:/q.jpg'
f4 = 'F:/t.jpg'

p1 = image.open(f1)
p2 = image.open(f2)
p3 = image.open(f3)
p4 = image.open(f4)

plt.subplot(241)
plt.imshow(p1)
plt.subplot(242)
plt.imshow(p2)
plt.subplot(243)
plt.imshow(p3)
plt.subplot(244)
plt.imshow(p4)

plt.subplot(245)
plt.imshow(km_pic(f1))
plt.subplot(246)
plt.imshow(km_pic(f2))
plt.subplot(247)
plt.imshow(km_pic(f3))
plt.subplot(248)
plt.imshow(km_pic(f4))

plt.show()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市予弧,隨后出現(xiàn)的幾起案子刮吧,更是在濱河造成了極大的恐慌,老刑警劉巖掖蛤,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杀捻,死亡現(xiàn)場離奇詭異,居然都是意外死亡蚓庭,警方通過查閱死者的電腦和手機(jī)致讥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來器赞,“玉大人垢袱,你說我怎么就攤上這事「酃瘢” “怎么了请契?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵咳榜,是天一觀的道長。 經(jīng)常有香客問我爽锥,道長涌韩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任氯夷,我火速辦了婚禮臣樱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘腮考。我一直安慰自己擎淤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布秸仙。 她就那樣靜靜地躺著,像睡著了一般桩盲。 火紅的嫁衣襯著肌膚如雪寂纪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天赌结,我揣著相機(jī)與錄音捞蛋,去河邊找鬼。 笑死柬姚,一個胖子當(dāng)著我的面吹牛拟杉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播量承,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼搬设,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了撕捍?” 一聲冷哼從身側(cè)響起拿穴,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎忧风,沒想到半個月后默色,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狮腿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年腿宰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缘厢。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡吃度,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贴硫,到底是詐尸還是另有隱情规肴,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站拖刃,受9級特大地震影響删壮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜兑牡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一央碟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧均函,春花似錦亿虽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至如迟,卻和暖如春收毫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背殷勘。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工此再, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人玲销。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓输拇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親贤斜。 傳聞我的和親對象是個殘疾皇子策吠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容