使用 OpenCV 進行影象分割

重磅乾貨,第一時間送達

使用 OpenCV 進行影象分割

什麼是影象分割?

影象分割是將數字影象劃分互不相交的區域的過程,它可以降低影象的複雜性,從而使分析影象變得更簡單。

分割在實際應用中的使用

在癌細胞檢測系統中可以看到獨特而著名的應用之一,其中影象分割被證明在從影象中更快地檢測疾病組織和細胞方面發揮了關鍵作用,從而使醫生能夠提供及時的治療。

製造制業現在高度依賴於影象識別技術來檢測人眼所忽略掉的異常,因此增加了產品的效率。

影象分割技術

我們有以下影象分割技術:

閾值法

基於邊緣的分割

基於區域的分割

基於聚類的分割

基於分水嶺的方法

基於人工神經網路的分割

不同技術之間的比較

在這裡,我們選擇了基於聚類的分割。

基於聚類的分割方法

與分類演算法不同,聚類演算法是無監督演算法。在分類演算法中,使用者沒有預定義的一組特徵、類或組。聚類演算法有助於從資料中獲取潛在的、隱藏的資訊,例如從啟發式的角度來看通常是未知的結構、聚類和分組。

基於聚類的技術將影象分割成具有相似特徵的叢集或不相交的畫素組。憑藉基本的資料聚類特性,資料元素被分割成叢集,使得同一叢集中的元素與其他叢集相比更加相似。一些更有效的聚類演算法,如 k 均值、改進的 k 均值、模糊 c 均值 (FCM) 和改進的模糊 c 均值演算法 (IFCM) 被廣泛用於所提出的基於聚類的方法中。

K 均值聚類演算法是一種精選的、流行的方法,因為它的簡單性和計算效率。改進的 K 均值演算法可以最小化 k 均值演算法中通常涉及的迭代次數。

由於某些相似性,叢集指的是聚合在一起的資料點集合。對於影象分割,這裡的叢集是不同的影象顏色。

程式碼實現

匯入庫

使用 OpenCV 進行影象分割

載入輸入影象並在 OpenCV 上進行處理

使用 OpenCV 進行影象分割

執行分段的步驟:

將影象轉換為RGB格式

將影象重塑為由畫素和 3 個顏色值 (RGB) 組成的二維陣列

cv2。kmeans() 函式將二維陣列作為輸入,因此我們必須將影象展平

定義叢集形成的停止標準

轉換回原始影象形狀並顯示分割後的影象

K均值是最簡單的無監督學習演算法之一,通常可以解決聚類問題。該過程遵循一種簡單易行的方法,透過一定數量的先驗固定的叢集對給定影象進行分類。

該演算法實際上從影象空間被劃分為 k 個畫素的開始,表示 k 個組質心。然後根據每個物件與叢集的距離將其分配給該組,當所有畫素都分配給所有叢集時,質心現在移動並重新分配。重複這些步驟,直到質心不再移動。

在該演算法收斂時,我們將影象中的區域分割為“K”組,其中組成畫素顯示出一定程度的相似性。

使用 OpenCV 進行影象分割

瞭解OpenCV中 K 均值聚類的引數

輸入引數

samples:它應該是np。float32資料型別,每個特徵應該放在一個列中。

nclusters(K) : 結束時所需的叢集數量。

criteria:它是迭代終止標準。當滿足此條件時,演算法迭代停止。實際上,它應該是一個包含 3 個引數的元組,它們是“( type, max_iter, epsilon )”。

a。終止標準的型別,它有 3 個標誌,如下所示:

cv。TERM_CRITERIA_EPS — 如果達到指定的精度epsilon,則停止演算法迭代。

cv。TERM_CRITERIA_MAX_ITER — 在指定的迭代次數max_iter後停止演算法。

cv。TERM_CRITERIA_EPS + cv。TERM_CRITERIA_MAX_ITER — 當滿足上述任何條件時停止迭代。

b。max_iter — 指定最大迭代次數的整數。

c。epsilon - 所需的準確性。

attempts :標記以指定使用不同的初始標籤執行演算法的次數。該演算法返回產生最佳緊湊性的標籤,這種緊湊性作為輸出返回。

flags:此標誌用於指定初始中心的使用方式。通常使用兩個標誌:cv。KMEANS_PP_CENTERS和cv。KMEANS_RANDOM_CENTERS。

輸出引數

compactness :它是每個點到其相應中心的距離平方和。

labels :這是標籤陣列,其中每個元素都標記為“0”、“1”……

centers:這是一系列叢集中心。

在這裡,當我們看到影象時,有三種主要顏色(綠色代表樹木,藍色代表海洋/湖泊,白色到橙色代表天空),所以我們考慮叢集的數量為 3。

因此,我們將為這張圖片使用三個叢集

標籤儲存每個畫素的叢集標籤(0/1/2)。

中心儲存到叢集的中心點。

cv2。KMEANS_RANDOM_CENTERS 只是指示 OpenCV 最初隨機分配叢集的值。

構建分割後的影象

將所有畫素轉換為質心的顏色

重塑回原始影象尺寸

顯示影象

使用 OpenCV 進行影象分割

使用 OpenCV 進行影象分割

禁用某些叢集以視覺化它們所代表的段。

使用 OpenCV 進行影象分割

輸出:

使用 OpenCV 進行影象分割

叢集 1 表示綠色,因為禁用叢集 1 或將其設為黑色在影象中很明顯

類似地嘗試將要分割的叢集的數量分割為8並可視化影象

使用 OpenCV 進行影象分割

輸出:

使用 OpenCV 進行影象分割

與每個叢集關聯的計數

使用 OpenCV 進行影象分割

禁用叢集 4,為代表段 4 的畫素分配黑色

輸出:

使用 OpenCV 進行影象分割

同樣禁用叢集 2

使用 OpenCV 進行影象分割

基於聚類的 ML 演算法的巨大價值在於我們可以透過使用多個統計引數來衡量生成的片段的質量,例如:輪廓係數、蘭德指數 (RI) 等。

結論:

影象分割是一組很有前景的技能,因為它在醫學成像中發揮著重要作用,並且各種組織正在努力建立一個有效的醫學影象主動診斷系統。

影象處理一般以各種程式語言實現——Java、matplotlib、C++ 等。Python 庫像scikit-image、OpenCV、Mahotas、Pillow、matplotlib、SimplelTK 等,被廣泛用於實現影象處理,尤其是影象分割。

使用 Python 實現影象分割是廣受歡迎的技能,並且有很多相關的培訓可供使用。使用 python 庫是一種更簡單的實現方式,它在使用之前不需要任何複雜的要求——當然除了 Python 程式設計和 Pandas 的基本知識。

好訊息,小白學視覺團隊的知識星球開通啦,為了感謝大家的支援與厚愛,團隊決定將價值149元的知識星球現時免費加入。各位小夥伴們要抓住機會哦!

下載1:OpenCV-Contrib擴充套件模組中文版教程

下載2:Python視覺實戰專案52講

下載3:OpenCV實戰專案20講

交流群