丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號(hào)安全和更好的產(chǎn)品體驗(yàn),強(qiáng)烈建議使用更快更安全的瀏覽器
此為臨時(shí)鏈接,僅用于文章預(yù)覽,將在時(shí)失效
人工智能開(kāi)發(fā)者 正文
發(fā)私信給skura
發(fā)送

0

一文概述用 python 的 scikit-image 模塊進(jìn)行圖像分割

本文作者: skura 編輯:汪思穎 2019-02-19 10:37
導(dǎo)語(yǔ):scikit-image 庫(kù)的圖像分割方法綜述

雷鋒網(wǎng) AI 科技評(píng)論按,隨著人工智能技術(shù)的逐年火熱,越來(lái)越多的人投入到計(jì)算機(jī)視覺(jué)領(lǐng)域的相關(guān)研究中。而圖像分割是圖像處理中非常重要的一個(gè)步驟,它是把圖像分成若干個(gè)特定的、具有獨(dú)特性質(zhì)的區(qū)域,并提取出感興趣目標(biāo)的技術(shù)。

近日,工程師 Parul Pandey 發(fā)表了一篇博文,在博文中,她介紹了用 python 的 scikit-image 庫(kù)進(jìn)行圖像分割的方法。具體涉及 scikit-image 的安裝,圖像導(dǎo)入以及用監(jiān)督算法和無(wú)監(jiān)督算法進(jìn)行圖像分割的方法。雷鋒網(wǎng) AI 科技評(píng)論編譯整理如下。

一文概述用 python 的 scikit-image 模塊進(jìn)行圖像分割

遲早有一天,所有的一切都是數(shù)字,包括圖像。

看過(guò)《終結(jié)者》的人肯定會(huì)認(rèn)為這是那個(gè)時(shí)代最偉大的科幻電影。在這部電影中,James Cameron 引入了一個(gè)有趣的視覺(jué)效果概念,它可以使觀眾有可能躲在被稱為終結(jié)者的電子人的眼睛后面。這種效應(yīng)被稱為「終結(jié)者視覺(jué)」,在某種程度上,它將人與背景分割開(kāi)來(lái)。在當(dāng)時(shí),這聽(tīng)起來(lái)完全是天方夜譚,但在如今,圖像分割已經(jīng)成為了許多圖像處理技術(shù)的重要組成部分。

圖像分割

我們都很清楚,Photoshop 或類似的圖形編輯器提供了無(wú)限的可能性,可以將一個(gè)人從一張圖片中帶到另一張圖片中。然而,要這樣做,首先需要確定那個(gè)人在源圖像中的位置,這就需要用到圖像分割技術(shù)了。有許多庫(kù)是為圖像分析而編寫(xiě)的。在本文中,我們將詳細(xì)討論基于 python 的圖像處理庫(kù) scikit-image。

完整的代碼也可以從與本文關(guān)聯(lián)的 Github 存儲(chǔ)庫(kù)中訪問(wèn)。

Scikit-image

一文概述用 python 的 scikit-image 模塊進(jìn)行圖像分割

SciKit Image 是一個(gè)專門(mén)用于圖像處理的 python 包。

安裝

可以按如下方式安裝 scikit-image:

pip install -U scikit-image(Linux and OSX)

pip install scikit-image(Windows)


# For Conda-based distributions

conda install scikit-image

python 中的圖像處理概述

在使用圖像分割技術(shù)之前,有必要先了解 scikit image 以及它是如何處理圖像的。

從 skimage 庫(kù)導(dǎo)入灰度圖像

skimage 數(shù)據(jù)模塊包含一些內(nèi)置示例數(shù)據(jù)集,這些數(shù)據(jù)集通常以 jpeg 或 png 格式存儲(chǔ)。

from skimage import data

import numpy as np

import matplotlib.pyplot as plt


image = data.binary_blobs()

plt.imshow(image, cmap='gray')

一文概述用 python 的 scikit-image 模塊進(jìn)行圖像分割

從 skimage 庫(kù)導(dǎo)入彩色圖像

from skimage import data

import numpy as np

import matplotlib.pyplot as plt


image = data.astronaut()


plt.imshow(image)

一文概述用 python 的 scikit-image 模塊進(jìn)行圖像分割

從外部源導(dǎo)入圖像

# The I/O module is used for importing the image

from skimage import data

import numpy as np

import matplotlib.pyplot as plt

from skimage import io


image = io.imread('skimage_logo.png')


plt.imshow(image);

一文概述用 python 的 scikit-image 模塊進(jìn)行圖像分割

加載多個(gè)圖像

images = io.ImageCollection('../images/*.png:../images/*.jpg')


print('Type:', type(images))

images.files

Out[]: Type: <class 『skimage.io.collection.ImageCollection』>

保存圖像

#Saving file as 'logo.png'


io.imsave('logo.png', logo)

圖像分割

現(xiàn)在我們已經(jīng)了解了 scikit-image,接下來(lái)讓我們來(lái)詳細(xì)了解圖像分割。圖像分割本質(zhì)上是將數(shù)字圖像分割成多個(gè)片段的過(guò)程,以簡(jiǎn)化或?qū)D像的表示方式更改為更有意義和更易于分析的內(nèi)容。

在本文中,我們結(jié)合監(jiān)督算法和無(wú)監(jiān)督算法來(lái)處理分割過(guò)程。

一文概述用 python 的 scikit-image 模塊進(jìn)行圖像分割

scikit-image 庫(kù)中可用的一些分割算法

監(jiān)督分割算法:一些可能來(lái)自人類輸入的先驗(yàn)知識(shí)被用來(lái)指導(dǎo)算法。

無(wú)監(jiān)督分割算法:不需要先驗(yàn)知識(shí)。這些算法試圖將圖像自動(dòng)細(xì)分到有意義的區(qū)域。用戶仍然可以通過(guò)調(diào)整某些設(shè)置以獲得想要的輸出。

讓我們從最簡(jiǎn)單的閾值分割算法開(kāi)始吧。

閾值算法

通過(guò)選擇高于或低于某個(gè)閾值的像素,將對(duì)象從從背景中分割出來(lái)是最簡(jiǎn)單的方法。在北京分割中,這通常是一個(gè)非常有用的方法。了解更多可以查看:http://scikit-image.org/docs/dev/auto_examples/xx_applications/plot_thresholding.html

讓我們?cè)?scikit-image 數(shù)據(jù)集的一張教科書(shū)圖像上試試這個(gè)。

基本輸入

import numpy as np

import matplotlib.pyplot as plt


import skimage.data as data

import skimage.segmentation as seg

import skimage.filters as filters

import skimage.draw as draw

import skimage.color as color

繪制圖像的簡(jiǎn)單函數(shù):

def image_show(image, nrows=1, ncols=1, cmap='gray'):

fig, ax = plt.subplots(nrows=nrows, ncols=ncols, figsize=(14, 14))

ax.imshow(image, cmap='gray')

ax.axis('off')

return fig, ax

圖像

text = data.page()


image_show(text)

一文概述用 python 的 scikit-image 模塊進(jìn)行圖像分割

這個(gè)圖像有點(diǎn)暗,但我們?nèi)匀豢梢赃x擇一個(gè)值,它可以合理的分割圖像,而不需要用到任何先進(jìn)的算法。為了得到這個(gè)分割閾值,我們將使用直方圖。

直方圖是一種顯示圖像中不同強(qiáng)度值的像素?cái)?shù)的圖。簡(jiǎn)單地說(shuō),直方圖是一個(gè)圖表,其中 X 軸顯示圖像中的所有像素值,而 Y 軸顯示這些值的頻率。

fig, ax = plt.subplots(1, 1)

ax.hist(text.ravel(), bins=32, range=[0, 256])

ax.set_xlim(0, 256);

一文概述用 python 的 scikit-image 模塊進(jìn)行圖像分割

我們的示例恰好是一張 8-bit 圖像,因此在 X 軸上總共有 256 個(gè)可能的值。在圖像中,0 表示黑色,255 表示白色,我們觀察到有些像素值很集中。這很可能是由于我們的文本背景比較淡,而其他部分則有點(diǎn)模糊不清。一個(gè)理想的分割直方圖應(yīng)該是有兩個(gè)峰值,且兩個(gè)峰值隔的較遠(yuǎn),以便我們可以選擇在這兩個(gè)峰值中間選擇一個(gè)數(shù)字作為閾值?,F(xiàn)在,讓我們?cè)囍鶕?jù)簡(jiǎn)單的閾值法來(lái)分割圖像。

有監(jiān)督閾值

因?yàn)殚撝凳俏覀冏约哼x擇的,所以我們稱之為監(jiān)督閾值。

text_segmented = text > (value concluded from histogram i.e 50,70,120 )


image_show(text_segmented);

一文概述用 python 的 scikit-image 模塊進(jìn)行圖像分割

文本>50

一文概述用 python 的 scikit-image 模塊進(jìn)行圖像分割

文本>70

一文概述用 python 的 scikit-image 模塊進(jìn)行圖像分割

文本>120

我們沒(méi)有得到理想的結(jié)果,因?yàn)樽筮叺年幱皶?huì)造成問(wèn)題,接下來(lái)讓我們嘗試無(wú)監(jiān)督的閾值。

無(wú)監(jiān)督閾值

scikit-image 有許多自動(dòng)閾值設(shè)定方法,在選擇最佳閾值時(shí)不需要手動(dòng)輸入。其中常用的方法有 otsu, li, local 等等。

text_threshold = filters.threshold_ # Hit tab with the cursor after the underscore to get all the methods.


image_show(text < text_threshold);

一文概述用 python 的 scikit-image 模塊進(jìn)行圖像分割

otsu 算法分割效果圖

一文概述用 python 的 scikit-image 模塊進(jìn)行圖像分割

 li 算法分割效果圖

在 local 算法中,我們還需要指定 block 的大小。offset 有助于調(diào)整圖像,以獲得更好的效果。

text_threshold = filters.threshold_local(text,block_size=51, offset=10)


image_show(text > text_threshold);

一文概述用 python 的 scikit-image 模塊進(jìn)行圖像分割

local 閾值法分割效果圖

這是一種很好的方法,它在很大程度上消除了噪聲。

監(jiān)督分割

閾值分割是一個(gè)非?;镜姆指罘椒?,但是它在高對(duì)比度圖像中效果不是很好,因此我們需要采用更加先進(jìn)的算法。

在本節(jié)中,我們將使用一個(gè)免費(fèi)的示例圖像,并嘗試使用監(jiān)督分割技術(shù)分割圖像中人的頭部。

# import the image

from skimage import io

image = io.imread('girl.jpg')

plt.imshow(image);

一文概述用 python 的 scikit-image 模塊進(jìn)行圖像分割

源圖像

小 tip:在對(duì)圖像進(jìn)行任何分割之前,最好使用一些濾波器對(duì)其進(jìn)行去噪。

但是,在我們的例子中,圖像中的噪聲很小,因此我們直接對(duì)其進(jìn)行處理。接下來(lái)我們將要做的是使用 rgb2gray 將圖像轉(zhuǎn)換成灰度圖。

image_gray = color.rgb2gray(image)


image_show(image_gray);

一文概述用 python 的 scikit-image 模塊進(jìn)行圖像分割

我們將使用兩種原理完全不同的分割方法。

活動(dòng)輪廓分割(Active Contour segmentation)

活動(dòng)輪廓分割使用用戶定義的輪廓或線在感興趣的區(qū)域周?chē)M(jìn)行初始化,然后該輪廓慢慢收縮。

對(duì)于我們的示例圖像,讓我們圍繞人的頭部畫(huà)一個(gè)圈來(lái)初始化輪廓。

def circle_points(resolution, center, radius):


"""Generate points which define a circle on an image.Centre refers to the centre of the circle"""

radians = np.linspace(0, 2*np.pi, resolution)


c = center[1] + radius*np.cos(radians)#polar co-ordinates

r = center[0] + radius*np.sin(radians)


return np.array([c, r]).T


# Exclude last point because a closed path should not have duplicate points

points = circle_points(200, [80, 250], 80)[:-1]

上面對(duì)圓環(huán)邊緣點(diǎn)的 x 坐標(biāo)和 y 坐標(biāo)進(jìn)行了計(jì)算。我們?cè)O(shè)置分辨率值的為 200,那么將計(jì)算 200 個(gè)這樣的點(diǎn)。

fig, ax = image_show(image)

ax.plot(points[:, 0], points[:, 1], '--r', lw=3)

一文概述用 python 的 scikit-image 模塊進(jìn)行圖像分割

然后,該算法通過(guò)將閉合曲線擬合到人臉的邊緣,將人臉與圖像的其余部分分割開(kāi)來(lái)。

snake = seg.active_contour(image_gray, points)


fig, ax = image_show(image)

ax.plot(points[:, 0], points[:, 1], '--r', lw=3)

ax.plot(snake[:, 0], snake[:, 1], '-b', lw=3);

一文概述用 python 的 scikit-image 模塊進(jìn)行圖像分割

我們可以調(diào)整參數(shù) alpha 和 beta。alpha 值越高,輪廓的收縮速度越快,而 beta 越大收縮越緩慢。

snake = seg.active_contour(image_gray, points,alpha=0.06,beta=0.3)


fig, ax = image_show(image)

ax.plot(points[:, 0], points[:, 1], '--r', lw=3)

ax.plot(snake[:, 0], snake[:, 1], '-b', lw=3);

一文概述用 python 的 scikit-image 模塊進(jìn)行圖像分割

隨機(jī) walker 分割

在這種方法中,用戶以交互方式標(biāo)記少量的像素,這些像素稱為標(biāo)簽。然后假設(shè)每個(gè)未標(biāo)記的像素釋放一個(gè)隨機(jī) walker,然后可以確定隨機(jī) walker 從每個(gè)未標(biāo)記像素開(kāi)始到達(dá)一個(gè)預(yù)標(biāo)記像素的概率。通過(guò)將每個(gè)像素分配給計(jì)算出來(lái)的概率值最大的標(biāo)簽,可以獲得高質(zhì)量的分割圖像。

更多相關(guān)資料可以閱讀參考文獻(xiàn):https://ieeexplore.ieee.org/document/1704833。

我們將在這里重新使用前面示例中的種子值。為了簡(jiǎn)單起見(jiàn),讓我們繼續(xù)使用圓。

image_labels = np.zeros(image_gray.shape, dtype=np.uint8)

隨機(jī) Walker 算法需要一個(gè)標(biāo)簽圖像作為輸入。所以我們會(huì)有一個(gè)更大的圓,它包圍了人的整個(gè)臉,還有一個(gè)靠近臉中間的小圓。

indices = draw.circle_perimeter(80, 250,20)#from here


image_labels[indices] = 1

image_labels[points[:, 1].astype(np.int), points[:, 0].astype(np.int)] = 2


image_show(image_labels);

一文概述用 python 的 scikit-image 模塊進(jìn)行圖像分割

現(xiàn)在,讓我們使用隨機(jī) walker,并觀察發(fā)生了什么。

image_segmented = seg.random_walker(image_gray, image_labels)


# Check our results

fig, ax = image_show(image_gray)

ax.imshow(image_segmented == 1, alpha=0.3);

一文概述用 python 的 scikit-image 模塊進(jìn)行圖像分割

它并沒(méi)有如我們所預(yù)期的那樣描繪出臉的邊緣。為了解決這個(gè)問(wèn)題,我們可以調(diào)整 beta 參數(shù),直到得到所需的結(jié)果。經(jīng)過(guò)幾次嘗試后,可以得到,當(dāng) beta 值為 3000 時(shí),分割效果不錯(cuò)。

image_segmented = seg.random_walker(image_gray, image_labels, beta = 3000)


# Check our results

fig, ax = image_show(image_gray)

ax.imshow(image_segmented == 1, alpha=0.3);

一文概述用 python 的 scikit-image 模塊進(jìn)行圖像分割

以上就是監(jiān)督分割,在這種算法中,我們必須提供某些輸入,也必須調(diào)整某些參數(shù)。然而,我們不可能總是讓人先看一張圖像,然后再?zèng)Q定輸入什么或者從哪里開(kāi)始。幸運(yùn)的是,對(duì)于這種情況,我們可以采用無(wú)監(jiān)督分割技術(shù)。

無(wú)監(jiān)督分割

無(wú)監(jiān)督分割不需要事先了解圖像。在一張圖像太大的情況下,同時(shí)考慮所有像素是不可能的。因此,在這種情況下,無(wú)監(jiān)督分割可以將圖像分解為幾個(gè)子區(qū)域,你可以使用數(shù)十到數(shù)百個(gè)區(qū)域來(lái)代替數(shù)百萬(wàn)像素。下面是兩個(gè)無(wú)監(jiān)督分割算法:

SLIC(簡(jiǎn)單線性迭代聚類)

SLIC 算法實(shí)際上使用了一種叫做 k-means 的機(jī)器學(xué)習(xí)算法。它接收?qǐng)D像的所有像素值,并嘗試將它們分離到給定數(shù)量的子區(qū)域中。

更多相關(guān)內(nèi)容可以閱讀相關(guān)資料:https://ieeexplore.ieee.org/document/6205760

SLIC 是處理彩色圖像的,所以我們將使用原始圖像。

image_slic = seg.slic(image,n_segments=155)

我們所做的只是將圖像的每個(gè)子圖像或子區(qū)域像素設(shè)置為該區(qū)域像素的平均值。

# label2rgb replaces each discrete label with the average interior color

image_show(color.label2rgb(image_slic, image, kind='avg'));

一文概述用 python 的 scikit-image 模塊進(jìn)行圖像分割

我們已經(jīng)將此圖像從 512*512=262000 個(gè)像素減少到 155 個(gè)區(qū)域。

Felzenszwalb 算法

該算法也使用了一種機(jī)器學(xué)習(xí)算法,即最小生成樹(shù)聚類算法。Felzenszwaib 算法并沒(méi)有告訴我們圖像將被分割成多少個(gè)集群。它將運(yùn)行并生成盡可能多的適合它的集群。相關(guān)的參考文件可以在這里查閱。

image_felzenszwalb = seg.felzenszwalb(image)

image_show(image_felzenszwalb);

一文概述用 python 的 scikit-image 模塊進(jìn)行圖像分割

有很多區(qū)域,我們計(jì)算相互獨(dú)立的區(qū)域數(shù)。

np.unique(image_felzenszwalb).size

3368

現(xiàn)在讓我們使用區(qū)域像素平均值對(duì)它們重新著色,就像我們?cè)?SLIC 算法中所做的那樣。

image_felzenszwalb_colored = color.label2rgb(image_felzenszwalb, image, kind='avg')

image_show(image_felzenszwalb_colored);

現(xiàn)在我們將圖像分成了合適的小區(qū)域。如果我們想要將圖像分成更少的區(qū)域,可以更改比例參數(shù)或者繼續(xù)組合它們。這種方法有時(shí)被稱為過(guò)度分割。

一文概述用 python 的 scikit-image 模塊進(jìn)行圖像分割

這看起來(lái)更像是一個(gè)拆分后的圖像,其本質(zhì)上只是減少了顏色的數(shù)量。要再次組合它們,可以使用區(qū)域鄰接圖(RAG),但這超出了本文的范圍。

結(jié)論

圖像分割是圖像處理中非常重要的一個(gè)步驟。它是一個(gè)熱門(mén)的研究領(lǐng)域,應(yīng)用非常廣泛,從計(jì)算機(jī)視覺(jué)到醫(yī)學(xué)圖像、從交通和視頻監(jiān)控等領(lǐng)域都有涉及。Python scikit-image 提供了一個(gè)非常強(qiáng)大的庫(kù),該庫(kù)具有大量用于圖像處理的算法。它是免費(fèi)的,沒(méi)有任何限制,在其背后有一個(gè)活躍的社區(qū)。你可以查看他們的文檔,了解關(guān)于庫(kù)及其用例的更多信息。

via:https://towardsdatascience.com/image-segmentation-using-pythons-scikit-image-module-533a61ecc980

雷鋒網(wǎng) AI 科技評(píng)論編譯。

雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知

一文概述用 python 的 scikit-image 模塊進(jìn)行圖像分割

分享:
相關(guān)文章
當(dāng)月熱門(mén)文章
最新文章
請(qǐng)?zhí)顚?xiě)申請(qǐng)人資料
姓名
電話
郵箱
微信號(hào)
作品鏈接
個(gè)人簡(jiǎn)介
為了您的賬戶安全,請(qǐng)驗(yàn)證郵箱
您的郵箱還未驗(yàn)證,完成可獲20積分喲!
請(qǐng)驗(yàn)證您的郵箱
立即驗(yàn)證
完善賬號(hào)信息
您的賬號(hào)已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說(shuō)