使用 Python 的基于邊緣和基于區(qū)域的分割
點擊上方“小白學視覺”,選擇加"星標"或“置頂”
重磅干貨,第一時間送達

在這篇文章中,我將重點介紹基于邊緣和基于區(qū)域的分割技術,在進入細節(jié)之前,我們需要了解什么是分割以及它是如何工作的。
圖像分割是一種將數(shù)字圖像分割成各種圖像對象的技術。
一個區(qū)域(圖像對象)中的每個像素在某些屬性上是相似的,例如顏色、強度、位置或紋理,這可以降低圖像的復雜性,以便于分析。在分割的幫助下,還可以從圖像中檢測出隱藏信息。
分割算法處理圖像的兩個基本屬性:
強度值,例如不連續(xù)性(邊界法)
相似性(區(qū)域法)
在下圖中,我們看到了一張以椅子、桌子、窗戶等為特征的圖像。我們可以通過分割來分別獲取這些對象。中間的圖像有一把椅子、一張桌子和窗戶作為我們的分割圖像對象。在最右邊的圖像中,通過標記圖像對象來使用實例分割。
在使用 Python 進行機器學習之后,分割變得非常容易。

將圖像劃分為不同的圖像對象,從中獲取信息,然后使用標簽來訓練各種 ML 模型以解決業(yè)務問題,其中一個例子是一個面部識別系統(tǒng),該系統(tǒng)通過分割自動標記出勤情況。
分割的另一個應用是在醫(yī)學領域中,在檢測到腫瘤、癌癥等嚴重疾病后進行高效和快速的診斷,以及查看由射線照相、MRI、熱成像、內(nèi)窺鏡檢查、細胞和組織的超聲檢查生成的醫(yī)學圖像中的模式。圖像分割在機器人等領域也有巨大的應用。
圖像分類是一種流行的分割應用,算法只能從圖像中捕獲所需的成分。在 Python 中實現(xiàn)圖像分割很容易,以獲得快速的結(jié)果。
在這種方法中,區(qū)域的邊界彼此之間以及與背景之間的差異很大,允許基于強度(灰度級)的局部不連續(xù)性進行邊界檢測。
換句話說,它是在圖像中定位邊緣的過程。這是理解圖像特征的非常重要的一步,因為我們知道邊緣由有意義的特征組成并且具有重要的信息。

這種方法包括根據(jù)一組特定的標準將圖像劃分為相似的區(qū)域。
基于區(qū)域的分割技術涉及一種算法,該算法通過將圖像劃分為具有相似像素特征的各種組件來進行分割,該技術在輸入圖像中搜索小塊或大塊以進行分割。
它將向選定的塊添加更多像素,或者將塊點進一步縮小為更小的段,并將它們與其他更小的塊點合并。因此,基于該方法還有兩種更基本的技術:區(qū)域生長和區(qū)域合并與分割。

重大疾病檢測
人臉識別系統(tǒng)
自動駕駛汽車
機器人學
import numpy as npimport matplotlib.pyplot as pltfrom skimage import datacoins = 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 cannyedges = 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 庫,這是一種流行的邊緣檢測算法來檢測輸入圖像的邊緣。

通過設置有效對象的最小大小,可以輕松去除小的虛假對象:
from scipy import ndimage as ndifill_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')
我們使用ndimage as ndi,這意味著一個n維圖像,它是處理圖像處理操作的子模塊,如輸入、輸出、裁剪、過濾等。
Ndi.binary_fill_holes用于填充連接到邊界的n維二進制陣列孔和侵入孔。
from skimage.filters import sobelelevation_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導入sobel模塊,該模塊用于查找輸入圖像中的邊緣。
Sobel transform 還可以幫助我們找到輸入圖像中的垂直和水平邊緣。

這篇文章用 Python 實現(xiàn)詳細解釋了分割及其兩種重要技術(基于邊緣的分割和基于區(qū)域的分割)。
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~

