使用 Python 的基于邊緣和基于區(qū)域的分割
在本文中,我們將重點(diǎn)討論基于邊緣和基于區(qū)域的分割技術(shù)。在討論細(xì)節(jié)之前,我們需要了解細(xì)分它們分別是什么以及它們是如何工作的。

分割
圖像分割是一種將數(shù)字圖像分割成各種圖像對(duì)象的技術(shù)。
區(qū)域中的每個(gè)像素(圖像對(duì)象)在某些屬性(如顏色、亮度、位置或紋理)上是相似的,這可以降低圖像的復(fù)雜性以便于分析。
在分割的幫助下,還可以從圖像中檢測(cè)隱藏信息。
分割算法基于圖像的兩個(gè)基本屬性:
- 像素強(qiáng)度值(邊界方法)
- 像素相似性(區(qū)域方法)
在下圖中,我們有一張以椅子、桌子、窗戶等為特征的圖像。我們可以借助分割來(lái)分別獲取這些對(duì)象。中間的圖像有一張椅子、一張桌子和一個(gè)窗戶作為我們的分割圖像對(duì)象。在最右邊的圖像中,通過(guò)標(biāo)記圖像對(duì)象來(lái)使用實(shí)例分割。

隨著 Python 機(jī)器學(xué)習(xí)的到來(lái),分割變得非常容易。
對(duì)圖像分割的需求
將一個(gè)圖像分割成不同的圖像對(duì)象,從中提取信息,然后進(jìn)行標(biāo)記,以訓(xùn)練各種機(jī)器學(xué)習(xí)模型來(lái)解決業(yè)務(wù)問(wèn)題。
一個(gè)例子是在分割的幫助下自動(dòng)標(biāo)記出勤的面部識(shí)別系統(tǒng)。
分割的另一個(gè)應(yīng)用是在醫(yī)學(xué)領(lǐng)域,在檢測(cè)到腫瘤、癌癥等嚴(yán)重疾病后進(jìn)行高效和快速的診斷。
圖像分割在機(jī)器人等領(lǐng)域也有巨大的應(yīng)用。
基于邊緣的圖像分割
在這種方法中,區(qū)域的邊界彼此之間以及與背景之間的差異很大,允許基于強(qiáng)度(灰度級(jí))的局部不連續(xù)性進(jìn)行邊界檢測(cè)。
換句話說(shuō),它是在圖像中定位邊緣的過(guò)程。這是理解圖像特征的非常重要的一步,因?yàn)槲覀冎肋吘売捎幸饬x的特征組成并且具有重要的信息。

基于區(qū)域的圖像分割
這種方法包括根據(jù)一組特定的標(biāo)準(zhǔn)將圖像劃分為相似的區(qū)域。
基于區(qū)域的分割技術(shù)包括一種通過(guò)將圖像分割成具有相似像素特征的不同部分來(lái)進(jìn)行分割的算法。這種技術(shù)搜索輸入圖像中的小塊或大塊,以便進(jìn)行分割。
它將為選定的塊添加更多的像素,或者進(jìn)一步將塊點(diǎn)縮小為更小的段,并將它們與其他更小的塊點(diǎn)合并。因此,基于這種方法還有兩種基本的技術(shù): 區(qū)域生長(zhǎng)和區(qū)域合并與分裂。

Python 實(shí)現(xiàn)
import numpy as np
import matplotlib.pyplot as plt
from skimage import data
coins = data.coins()
hist = np.histogram(coins, bins=np.arange(0, 256))
fig, (ax1) = plt.subplots()
ax1.imshow(coins, cmap=plt.cm.gray,interpolation='nearest')
基于邊緣的圖像分割
from skimage.feature import canny
edges = canny(coins/255.)
fig, ax = plt.subplots(figsize=(4, 3))
ax.imshow(edges, cmap=plt.cm.gray, interpolation='nearest')
ax.axis('off')
ax.set_title('Canny detector')
Text(0.5, 1.0, 'Canny detector')在該代碼中,我們使用了 canny 庫(kù),這是一種流行的邊緣檢測(cè)算法來(lái)檢測(cè)輸入圖像的邊緣。

通過(guò)設(shè)置有效對(duì)象的最小大小,可以輕松去除小的虛假對(duì)象:
from scipy import ndimage as ndi
fill_coins = ndi.binary_fill_holes(edges)
fig, ax = plt.subplots(figsize=(4, 3))
ax.imshow(fill_coins, cmap=plt.cm.gray, interpolation='nearest')
ax.axis('off')
ax.set_title('Filling the holes')
Text(0.5, 1.0, 'Filling the holes')
基于區(qū)域的分割
from skimage.filters import sobel
elevation_map = sobel(coins)
fig, ax = plt.subplots(figsize=(4, 3))
ax.imshow(elevation_map, cmap=plt.cm.gray, interpolation='nearest')
ax.axis('off')
ax.set_title('elevation_map')
Text(0.5, 1.0, 'elevation_map')這里,我們從 skimage.filters 中導(dǎo)入 sobel 模塊,它用于在輸入圖像中查找邊緣。
Sobel 變換還幫助我們找到輸入圖像中的垂直和水平邊緣。

總結(jié)
本文通過(guò) Python 實(shí)現(xiàn),深入闡述了分割及其兩個(gè)重要技術(shù)(基于邊緣的分割和基于區(qū)域的分割)。






























