❶ 圖像分割的分割方法
灰度閾值分割 法是一種最常用的並行區域技術,它是圖像分割中應用數量最多的一類。閾值分割方法實際上是輸入圖像f到輸出圖像g的如下變換:
其中,T為閾值,對於物體的圖像元素g(i,j)=1,對於背景的圖像元素g(i,j)=0。
由此可見,閾值分割演算法的關鍵是確定閾值,如果能確定一個合適的閾值就可准確地將圖像分割開來。閾值確定後,將閾值與像素點的灰度值逐個進行比較,而且像素分割可對各像素並行地進行,分割的結果直接給出圖像區域。
閾值分割的優點是計算簡單、運算效率較高、速度快。在重視運算效率的應用場合(如用於硬體實現),它得到了廣泛應用。
人們發展了各種各樣的閾值處理技術,包括全局閾值、自適應閾值、最佳閾值等等。
全局閾值是指整幅圖像使用同一個閾值做分割處理,適用於背景和前景有明顯對比的圖像。它是根據整幅圖像確定的:T=T(f)。但是這種方法只考慮像素本身的灰度值,一般不考慮空間特徵,因而對雜訊很敏感。常用的全局閾值選取方法有利用圖像灰度直方圖的峰谷法、最小誤差法、最大類間方差法、最大熵自動閾值法以及其它一些方法。
在許多情況下,物體和背景的對比度在圖像中的各處不是一樣的,這時很難用一個統一的閾值將物體與背景分開。這時可以根據圖像的局部特徵分別採用不同的閾值進行分割。實際處理時,需要按照具體問題將圖像分成若乾子區域分別選擇閾值,或者動態地根據一定的鄰域范圍選擇每點處的閾值,進行圖像分割。這時的閾值為自適應閾值。
閾值的選擇需要根據具體問題來確定,一般通過實驗來確定。對於給定的圖像,可以通過分析直方圖的方法確定最佳的閾值,例如當直方圖明顯呈現雙峰情況時,可以選擇兩個峰值的中點作為最佳閾值。
圖1(a)和(b)分別為用全局閾值和自適應閾值對經典的Lena圖像進行分割的結果。
區域生長和分裂合並法是兩種典型的串列區域技術,其分割過程後續步驟的處理要根據前面步驟的結果進行判斷而確定。 區域生長 區域生長的基本思想是將具有相似性質的像素集合起來構成區域。具體先對每個需要分割的區域找一個種子像素作為生長的起點,然後將種子像素周圍鄰域中與種子像素有相同或相似性質的像素(根據某種事先確定的生長或相似准則來判定)合並到種子像素所在的區域中。將這些新像素當作新的種子像素繼續進行上面的過程,直到再沒有滿足條件的像素可被包括進來。這樣一個區域就長成了。
區域生長需要選擇一組能正確代表所需區域的種子像素,確定在生長過程中的相似性准則,制定讓生長停止的條件或准則。相似性准則可以是灰度級、彩色、紋理、梯度等特性。選取的種子像素可以是單個像素,也可以是包含若干個像素的小區域。大部分區域生長准則使用圖像的局部性質。生長准則可根據不同原則制定,而使用不同的生長准則會影響區域生長的過程。區域生長法的優點是計算簡單,對於較均勻的連通目標有較好的分割效果。它的缺點是需要人為確定種子點,對雜訊敏感,可能導致區域內有空洞。另外,它是一種串列演算法,當目標較大時,分割速度較慢,因此在設計演算法時,要盡量提高效率。
區域分裂合並
區域生長是從某個或者某些像素點出發,最後得到整個區域,進而實現目標提取。分裂合並差不多是區域生長的逆過程:從整個圖像出發,不斷分裂得到各個子區域,然後再把前景區域合並,實現目標提取。分裂合並的假設是對於一幅圖像,前景區域由一些相互連通的像素組成的,因此,如果把一幅圖像分裂到像素級,那麼就可以判定該像素是否為前景像素。當所有像素點或者子區域完成判斷以後,把前景區域或者像素合並就可得到前景目標。
在這類方法中,最常用的方法是四叉樹分解法(如圖3所示)。設R代表整個正方形圖像區域,P代表邏輯謂詞。基本分裂合並演算法步驟如下:(1)對任一個區域,如果H(Ri)=FALSE就將其分裂成不重疊的四等份;
(2)對相鄰的兩個區域Ri和Rj,它們也可以大小不同(即不在同一層),如果條件H(Ri∪Rj)=TRUE滿足,就將它們合並起來。
(3)如果進一步的分裂或合並都不可能,則結束。
分裂合並法的關鍵是分裂合並准則的設計。這種方法對復雜圖像的分割效果較好,但演算法較復雜,計算量大,分裂還可能破壞區域的邊界。 圖像分割的一種重要途徑是通過邊緣檢測,即檢測灰度級或者結構具有突變的地方,表明一個區域的終結,也是另一個區域開始的地方。這種不連續性稱為邊緣。不同的圖像灰度不同,邊界處一般有明顯的邊緣,利用此特徵可以分割圖像。
圖像中邊緣處像素的灰度值不連續,這種不連續性可通過求導數來檢測到。對於階躍狀邊緣,其位置對應一階導數的極值點,對應二階導數的過零點(零交叉點)。因此常用微分運算元進行邊緣檢測。常用的一階微分運算元有Roberts運算元、Prewitt運算元和Sobel運算元,二階微分運算元有Laplace運算元和Kirsh運算元等。在實際中各種微分運算元常用小區域模板來表示,微分運算是利用模板和圖像卷積來實現。這些運算元對雜訊敏感,只適合於雜訊較小不太復雜的圖像。
由於邊緣和雜訊都是灰度不連續點,在頻域均為高頻分量,直接採用微分運算難以克服雜訊的影響。因此用微分運算元檢測邊緣前要對圖像進行平滑濾波。LoG運算元和Canny運算元是具有平滑功能的二階和一階微分運算元,邊緣檢測效果較好,如圖4所示。其中loG運算元是採用Laplacian運算元求高斯函數的二階導數,Canny運算元是高斯函數的一階導數,它在雜訊抑制和邊緣檢測之間取得了較好的平衡。關於微分運算元的邊緣檢測的詳細內容可參考文獻 。 與其他圖像分割方法相比,基於直方圖的方法是非常有效的圖像分割方法,因為他們通常只需要一個通過像素。在這種方法中,直方圖是從圖像中的像素的計算,並在直方圖的波峰和波谷是用於定點陣圖像中的簇。顏色和強度可以作為衡量。
這種技術的一種改進是遞歸應用直方圖求法的集群中的形象以分成更小的簇。重復此操作,使用更小的簇直到沒有更多的集群的形成。
基於直方圖的方法也能很快適應於多個幀,同時保持他們的單通效率。直方圖可以在多個幀被考慮的時候採取多種方式。同樣的方法是採取一個框架可以應用到多個,和之後的結果合並,山峰和山谷在以前很難識別,但現在更容易區分。直方圖也可以應用於每一個像素的基礎上,將得到的信息被用來確定的像素點的位置最常見的顏色。這種方法部分基於主動對象和一個靜態的環境,導致在不同類型的視頻分割提供跟蹤。
❷ 圖像分割演算法那麼多 如何正確的使用適合的演算法
從學術角度講圖像分割主要分成3大類,一是基於邊緣的,二是基於區域的,三是基於紋理的。由於基於紋理的也可以看成是基於區域的,所以有些專家也把分割方法分成基於邊緣和基於區域兩大類。
選擇演算法的時候主要參考你要分割的圖像樣本的特點。
如果圖像的邊界特別分明,比如綠葉和紅花,在邊界處紅綠明顯不同,可以精確提取到邊界,這時候用基於邊緣的方法就可行。但如果是像醫學圖像一樣,輪廓不是特別明顯,比如心臟圖像,左心房和左心室顏色比較接近,它們之間的隔膜僅僅是顏色比它們深一些,但是色彩上來說很接近,這時候用基於邊緣的方法就不合適了,用基於區域的方法更好。再比如帶紋理的圖像,例如條紋衫,如果用基於邊緣的方法很可能就把每一條紋都分割成一個物體,但實際上衣服是一個整體,這時候用基於紋理的方法就能把紋理相同或相似的區域分成一個整體。
不過總體來說,基於區域的方法近些年更熱一些,如Meanshift分割方法、測地線活動輪廓模型、JSEG等。
❸ 我所了解的圖像分割
圖像分割是我大二2019年做的東西,這篇文章用來總結。
分語義【像素級別圖像】,實例【分割物體有進一步分類】。
基於圖像的灰度特徵來計算一個或多個灰度閾值,並將圖像中每個像素的灰度值與閾值作比較,最後將像素根據比較結果分到合適的類別中。
確定某個准則函數來求解最佳灰度閾值。【閾值法特別適用於目標和背景占據不同灰度級范圍的圖。】
值得一提的是:特徵點檢測也有此方法
直接尋找區域。有兩種基本形式:一種是區域生長,從單個像素出發,逐步合並以形成所需要的分割區域;另一種是從全局出發,逐步切割至所需的分割區域。
基於邊緣檢測的圖像分割演算法試圖通過檢測包含不同區域的邊緣來解決分割問題。它可以說是人們最先想到也是研究最多的方法之一。通常不同區域的邊界上像素的灰度值變化比較劇烈,如果將圖片從空間域通過傅里葉變換到頻率域,邊緣就對應著高頻部分,這是一種非常簡單的邊緣檢測演算法。
常規卷積
常規卷積+殘差【解決梯度消失,網路變深】
Efficient Neural Network(ENet)
ResNet-38
full-resolution resial network(FRRN)
AdapNey
由目標檢測發展而來(R-CNN、Fast R-CNN)
在Faster R-CNN的結構基礎上加上了Mask預測分支,並且改良了ROI Pooling,提出了ROI Align。
評價函數只對目標檢測的候選框進行打分,而不是分割模板
(1)ReSeg模型【FCN改進】
FCN的不足:沒有考慮到局部或者全局的上下文依賴關系,而在語義分割中這種依賴關系是非常有用的。所以在ReSeg中作者使用RNN去檢索上下文信息,以此作為分割的一部分依據。
卷積神經網路在進行采樣的時候會丟失部分細節信息,這樣的目的是得到更具特徵的價值。但是這個過程是不可逆的,有的時候會導致後面進行操作的時候圖像的 解析度太低 ,出現 細節丟失 等問題。因此我們通過上采樣在一定程度上可以不全一些丟失的信息,從而得到更加准確的分割邊界。
卷積後進行一次上采樣,得到segment map。
優點:
FCN對圖像進行了像素級的分類,從而解決了 語義級別 的圖像分割問題;
FCN可以 接受任意尺寸的輸入圖像 ,可以保留下原始輸入圖像中的空間信息;
缺點:
得到的結果由於上采樣的原因比較模糊和平滑,對圖像中的 細節不敏感 ;
對各個像素分別進行分類,沒有充分考慮 像素與像素的關系,缺乏空間一致性。
恢復在深度卷積神經網路中下降的解析度,從而獲取更多的上下文信息。
DeepLab是結合了深度卷積神經網路和概率圖模型的方法,應用在語義分割的任務上,目的是做逐像素分類,其先進性體現在DenseCRFs(概率圖模型)和DCNN的結合。是將每個像素視為CRF節點,利用遠程依賴關系並使用CRF推理直接優化DCNN的損失函數。
在圖像分割領域,FCN的一個眾所周知的操作就是平滑以後再填充,就是先進行卷積再進行pooling,這樣在降低圖像尺寸的同時增大感受野,但是在先減小圖片尺寸(卷積)再增大尺寸(上采樣)的過程中一定有一些信息損失掉了,所以這里就有可以提高的空間。
DeepLab提出空洞卷積解決這一問題
(1)常規圖像分割
交叉熵Loss
Focal Loss【解決難易樣本不均衡】
(2)醫療影像分割
Dice Loss(該損失函數的提出有一個背景,直接優化性能度量,涉及到我的另一個課題非凸優化)
IOU(常做為評價指標)
基於以上幾個基本的Loss還有各種各樣的改進
因為相鄰臨的像素對應感受野內的圖像信息太過相似了,如果臨近的像素都屬於所需分割區域的內部,那麼這種『相似』是有利的,但是如果相鄰 像素剛好處在所需分割區域的邊界上,那麼這種相似就是有害的了。
上下文特徵是很常見的,其實上下文大概去理解就是圖像中的每一個像素點不可能是孤立的,一個像素一定和周圍像素是有一定的關系的,大量像素的互相聯系才產生了圖像中的各種物體,所以上下文特徵就指像素以及周邊像素的某種聯系。
1、對網路輸出的分割的邊界增加額外的損失,或者讓網路對邊界的特徵和區域內部的特徵分開建模學習。其本質上的思想還是讓網路同時做兩個任務:分割和邊緣檢測。另外,提高輸入圖像的輸入解析度和中間層特徵圖的解析度同樣也是簡單有效的。
2、利用loss動態加權或者在圖像二維空間上采樣來解決同一張圖像中不同語義的像素個數不均衡以及學習的難易程度不同的問題。
3、利用半監督或者弱監督學習的方法減少標注昂貴的問題。利用多個標簽有雜訊的樣本或其特徵構建虛擬的標簽干凈的虛擬樣本或特徵來減少標簽的雜訊。
4、利用合理的上下文的建模機制,幫助網路猜測遮擋部分的語義信息。
5、在網路中構建不同圖像之間損失或者特徵交互模塊。
❹ 圖象分割有哪三種不同的途徑
圖象分割有三種不同的途徑,其一是將各象素劃歸到相應物體或區域的象素聚類方法即區域法,其二是通過直接確定區域間的邊界來實現分割的邊界方法,其三是首先檢測邊緣象素再將邊緣象素連接起來構成邊界形成分割。早期的圖像分割方法可以分為兩大類。一類是邊界方法,這種方法假設圖像分割結果的某個子區域在原來圖像中一定會有邊緣存在;一類是區域方法,這種方法假設圖像分割結果的某個子區域一定會有相同的性質,而不同區域的像素則沒有共同的性質。這兩種方法都有優點和缺點,有的學者考慮把兩者結合起來進行研究。現在,隨著計算機處理能力的提高,很多方法不斷涌現,如基於彩色分量分割、紋理圖像分割。所使用的數學工具和分析手段也是不斷的擴展,從時域信號到頻域信號處理,小波變換等等。
圖像分割主要包括4種技術:並行邊界分割技術、串列邊界分割技術、並行區域分割技術和串列區域分割技術。下面是分別對每一項做簡單的介紹。
❺ 圖像分割——分水嶺演算法
姓名:謝意遠
學號:19021110366T
嵌牛導讀:圖像中的目標物體是連接在一起的,則分割起來很困難,分水嶺分割演算法經常用於處理這類問題,通常會取得比較好的效果。
嵌牛鼻子:圖像分割、分水嶺演算法
嵌牛提問:分水嶺演算法具體有哪些步驟?
嵌牛正文:
一、綜述
分水嶺分割演算法把圖像看成一幅「地形圖」,其中亮度比較強的區域像素值較大,而比較暗的區域像素值較小,通過尋找「匯水盆地」和「分水嶺界限」,對圖像進行分割。而直接應用分水嶺分割演算法的效果往往並不好,如果在圖像中對前景對象和背景對象進行標注區別,再應用分水嶺演算法會取得較好的分割效果。基於標記控制的分水嶺分割方法有以下基本步驟:
1 綜述
分水嶺分割演算法把圖像看成一幅「地形圖」,其中亮度比較強的區域像素值較大,而比較暗的區域像素值較小,通過尋找「匯水盆地」和「分水嶺界限」,對圖像進行分割。直接應用分水嶺分割演算法的效果往往並不好,如果在圖像中對前景對象和背景對象進行標注區別,再應用分水嶺演算法會取得較好的分割效果。基於標記控制的分水嶺分割方法有以下基本步驟:
1.計算分割函數。圖像中較暗的區域是要分割的對象
2.計算前景標志。這些是每個對象內部連接的斑點像素。
3.計算背景標志。這些是不屬於任何對象的要素。
4.修改分割函數,使其僅在前景和後景標記位置有極小值。
5.對修改後的分割函數做分水嶺變換計算。
使用MATLAB圖像處理工具箱
註:期間用到了很多圖像處理工具箱的函數,例如fspecial、imfilter、watershed、label2rgb、imopen、imclose、imreconstruct、imcomplement、imregionalmax、bwareaopen、graythresh和imimposemin函數等。
2 步驟
第一步:讀入彩色圖像,將其轉化成灰度圖像
clc; clear all; close all;
rgb = imread('pears.png');
if ndims(rgb) == 3
I = rgb2gray(rgb);
else
I = rgb;
end
figure('units', 'normalized', 'position', [0 0 1 1]);
第2步:將梯度幅值作為分割函數
使用Sobel邊緣運算元對圖像進行水平和垂直方向的濾波,然後求取模值,sobel運算元濾波後的圖像在邊界處會顯示比較大的值,在沒有邊界處的值會很小。
hy = fspecial('sobel');
hx = hy';
Iy = imfilter(double(I), hy, 'replicate');
Ix = imfilter(double(I), hx, 'replicate');
gradmag = sqrt(Ix.^2 + Iy.^2);
figure('units', 'normalized', 'position', [0 0 1 1]);
subplot(1, 2, 1); imshow(I,[]), title('灰度圖像')
subplot(1, 2, 2); imshow(gradmag,[]), title('梯度幅值圖像')
可否直接對梯度幅值圖像使用分水嶺演算法?
L = watershed(gradmag);
Lrgb = label2rgb(L);
figure('units', 'normalized', 'position', [0 0 1 1]);
subplot(1, 2, 1); imshow(gradmag,[]), title('梯度幅值圖像')
subplot(1, 2, 2); imshow(Lrgb); title('梯度幅值做分水嶺變換')
直接使用梯度模值圖像進行分水嶺演算法得到的結果往往會存在過度分割的現象。因此通常需要分別對前景對象和背景對象進行標記,以獲得更好的分割效果。
第3步:標記前景對象
有多種方法可以應用在這里來獲得前景標記,這些標記必須是前景對象內部的連接斑點像素。這個例子中,將使用形態學技術「基於開的重建」和「基於閉的重建」來清理圖像。這些操作將會在每個對象內部創建單位極大值,使得可以使用imregionalmax來定位。
開運算和閉運算:先腐蝕後膨脹稱為開;先膨脹後腐蝕稱為閉。開和閉這兩種運算可以除去比結構元素小的特定圖像細節,同時保證不產生全局幾何失真。開運算可以把比結構元素小的突刺濾掉,切斷細長搭接而起到分離作用;閉運算可以把比結構元素小的缺口或孔填充上,搭接短的間隔而起到連接作用。
開操作是腐蝕後膨脹,基於開的重建(基於重建的開操作)是腐蝕後進行形態學重建。下面比較這兩種方式。首先,用imopen做開操作。
se = strel('disk', 20);
Io = imopen(I, se);
figure('units', 'normalized', 'position', [0 0 1 1]);
subplot(1, 2, 1); imshow(I, []); title('灰度圖像');
subplot(1, 2, 2); imshow(Io), title('圖像開操作')
接下來,通過腐蝕後重建來做基於開的重建計算。
Ie = imerode(I,se)
Iobr = imreconstruct(Ie,I);
figure('units', 'normalized', 'position', [0 0 1 1]);
subplot(1, 2, 1); imshow(I, []); title('灰度圖像');
subplot(1, 2, 2); imshow(Iobr, []), title('基於開的重建圖像')
開操作後,接著進行閉操作,可以移除較暗的斑點和枝幹標記。對比常規的形態學閉操作和基於閉的重建操作。首先,使用imclose:
Ioc = imclose(Io, se);
Ic = inclose(I,se);
figure('units', 'normalized', 'position', [0 0 1 1]);
subplot(2, 2, 1); imshow(I, []); title('灰度圖像');
subplot(2, 2, 2); imshow(Io, []); title('開操作圖像');
subplot(2, 2, 3); imshow(Ic, []); title('閉操作圖像');
subplot(2, 2, 4); imshow(Ioc, []), title('開閉操作');
現在使用imdilate,然後使用imreconstruct。注意必須對輸入圖像求補,對imreconstruct輸出圖像求補。IM2 = imcomplement(IM)計算圖像IM的補集。IM可以是二值圖像,或者RGB圖像。IM2與IM有著相同的數據類型和大小。
Iobrd = imdilate(Iobr, se);
Iobrcbr = imreconstruct(imcomplement(Iobrd), imcomplement(Iobr));
Iobrcbr = imcomplement(Iobrcbr);
figure('units', 'normalized', 'position', [0 0 1 1]);
subplot(2, 2, 1); imshow(I, []); title('灰度圖像');
subplot(2, 2, 2); imshow(Ioc, []); title('開閉操作');
subplot(2, 2, 3); imshow(Iobr, []); title('基於開的重建圖像');
subplot(2, 2, 4); imshow(Iobrcbr, []), title('基於閉的重建圖像');
通過比較Iobrcbr和loc可以看到,在移除小污點同時不影響對象全局形狀的應用下,基於重建的開閉操作要比標準的開閉重建更加有效。計算Iobrcbr的局部極大來得到更好的前景標記。
fgm = imregionalmax(Iobrcbr);
figure('units', 'normalized', 'position', [0 0 1 1]);
subplot(1, 3, 1); imshow(I, []); title('灰度圖像');
subplot(1, 3, 2); imshow(Iobrcbr, []); title('基於重建的開閉操作');
subplot(1, 3, 3); imshow(fgm, []); title('局部極大圖像');
為了幫助理解這個結果,疊加前景標記到原圖上。
It1 = rgb(:, :, 1);
It2 = rgb(:, :, 2);
It3 = rgb(:, :, 3);
It1(fgm) = 255; It2(fgm) = 0; It3(fgm) = 0;
I2 = cat(3, It1, It2, It3);
figure('units', 'normalized', 'position', [0 0 1 1]);
subplot(2, 2, 1); imshow(rgb, []); title('原圖像');
subplot(2, 2, 2); imshow(Iobrcbr, []); title('基於重建的開閉操作');
subplot(2, 2, 3); imshow(fgm, []); title('局部極大圖像');
subplot(2, 2, 4); imshow(I2); title('局部極大疊加到原圖像');
注意到大多閉塞處和陰影對象沒有被標記,這就意味著這些對象在結果中將不會得到合理的分割。而且,一些對象的前景標記會一直到對象的邊緣。這就意味著應該清理標記斑點的邊緣,然後收縮它們。可以通過閉操作和腐蝕操作來完成。
se2 = strel(ones(5,5));
fgm2 = imclose(fgm, se2);
fgm3 = imerode(fgm2, se2);
figure('units', 'normalized', 'position', [0 0 1 1]);
subplot(2, 2, 1); imshow(Iobrcbr, []); title('基於重建的開閉操作');
subplot(2, 2, 2); imshow(fgm, []); title('局部極大圖像');
subplot(2, 2, 3); imshow(fgm2, []); title('閉操作');
subplot(2, 2, 4); imshow(fgm3, []); title('腐蝕操作');
這個過程將會留下一些偏離的孤立像素,應該移除它們。可以使用bwareaopen,用來移除少於特定像素個數的斑點。BW2 = bwareaopen(BW,P)從二值圖像中移除所以少於P像素值的連通塊,得到另外的二值圖像BW2。
fgm4 = bwareaopen(fgm3, 20);
It1 = rgb(:, :, 1);
It2 = rgb(:, :, 2);
It3 = rgb(:, :, 3);
It1(fgm4) = 255; It2(fgm4) = 0; It3(fgm4) = 0;
I3 = cat(3, It1, It2, It3);
figure('units', 'normalized', 'position', [0 0 1 1]);
subplot(2, 2, 1); imshow(I2, []); title('局部極大疊加到原圖像');
subplot(2, 2, 2); imshow(fgm3, []); title('閉腐蝕操作');
subplot(2, 2, 3); imshow(fgm4, []); title('去除小斑點操作');
subplot(2, 2, 4); imshow(I3, []); title('修改局部極大疊加到原圖像');
第4步:計算背景標記
現在,需要標記背景。在清理後的圖像Iobrcbr中,暗像素屬於背景,所以可以從閾值操作開始。
bw =im2bw(Iobrcbr, graythresh(Iobrcbr));
figure('units', 'normalized', 'position', [0 0 1 1]);
subplot(1, 2, 1); imshow(Iobrcbr, []); title('基於重建的開閉操作');
subplot(1, 2, 2); imshow(bw, []); title('閾值分割');
背景像素在黑色區域,但是理想情形下,不必要求背景標記太接近於要分割的對象邊緣。通過計算「骨架影響范圍」來「細化」背景,或者SKIZ,bw的前景。這個可以通過計算bw的距離變換的分水嶺變換來實現,然後尋找結果的分水嶺脊線(DL==0)。D = bwdist(BW)計算二值圖像BW的歐幾里得矩陣。對BW的每一個像素,距離變換指定像素和最近的BW非零像素的距離。bwdist默認使用歐幾里得距離公式。BW可以由任意維數,D與BW有同樣的大小。
D = bwdist(bw);
DL = watershed(D);
bgm = DL == 0;
figure('units', 'normalized', 'position', [0 0 1 1]);
subplot(2, 2, 1); imshow(Iobrcbr, []); title('基於重建的開閉操作');
subplot(2, 2, 2); imshow(bw, []); title('閾值分割');
subplot(2, 2, 3); imshow(label2rgb(DL), []); title('分水嶺變換示意圖');
subplot(2, 2, 4); imshow(bgm, []); title('分水嶺變換脊線圖');
第5步:計算分割函數的分水嶺變換
函數imimposemin可以用來修改圖像,使其只是在特定的要求位置有局部極小。這里可以使用imimposemin來修改梯度幅值圖像,使其只在前景和後景標記像素有局部極小。
gradmag2 = imimposemin(gradmag, bgm | fgm4);
figure('units', 'normalized', 'position', [0 0 1 1]);
subplot(2,2,1)imshow(bgm,[]);title('分水嶺變換脊線圖');
subplot(2, 2, 2); imshow(fgm4, []); title('前景標記');
subplot(2, 2, 3); imshow(gradmag, []); title('梯度幅值圖像');
subplot(2, 2, 4); imshow(gradmag2, []); title('修改梯度幅值圖像');
最後,可以做基於分水嶺的圖像分割計算。
第6步:查看結果
一個可視化技術是疊加前景標記、背景標記、分割對象邊界到初始圖像。可以使用膨脹來實現某些要求,比如對象邊界,更加清晰可見。對象邊界定位於L==0的位置。
It1 = rgb(:, :, 1);
It2 = rgb(:, :, 2);
It3 = rgb(:, :, 3);
fgm5 = imdilate(L == 0, ones(3, 3)) | bgm | fgm4;
It1(fgm5) = 255; It2(fgm5) = 0; It3(fgm5) = 0;
I4 = cat(3, It1, It2, It3);
figure('units', 'normalized', 'position', [0 0 1 1]);
subplot(1, 2, 1); imshow(rgb, []); title('原圖像');
subplot(1, 2, 2); imshow(I4, []); title('標記和對象邊緣疊加到原圖像');
可視化說明了前景和後景標記如何影響結果。在幾個位置,部分的較暗對象與它們相鄰的較亮的鄰接對象相融合,這是因為受遮擋的對象沒有前景標記。
另外一個有用的可視化技術是將標記矩陣作為彩色圖像進行顯示。標記矩陣,比如通過watershed和bwlabel得到的,可以使用label2rgb轉換到真彩圖像來顯示。
Lrgb = label2rgb(L,'jet', 'w', 'shuffle');
figure('units', 'normalized', 'position', [0 0 1 1]);
subplot(1, 2, 1); imshow(rgb, []); title('原圖像');
subplot(1, 2, 2); imshow(Lrgb); title('彩色分水嶺標記矩陣');
可以使用透明度來疊加這個偽彩色標記矩陣在原亮度圖像上進行顯示。
figure('units', 'normalized', 'position', [0 0 1 1]);
subplot(1, 2, 1); imshow(rgb, []); title('原圖像');
subplot(1, 2, 2); imshow(rgb, []); hold on;
himage = imshow(Lrgb);
set(himage, 'AlphaData', 0.3);
title('標記矩陣疊加到原圖像');
❻ 如何分析一個圖像分割演算法
論文閱讀筆記:圖像分割方法deeplab以及Hole演算法解析
deeplab發表在ICLR
2015上。論文下載地址:Semantic
Image
Segmentation
with
Deep
Convolutional
Nets
and
Fully
Connected
CRFS.
deeplab方法概述
deeplab方法分為兩步走,第一步仍然採用了FCN得到
coarse
score
map並插值到原圖像大小,然後第二步借用fully
connected
CRF對從FCN得到的分割結果進行細節上的refine。
下面這張圖很清楚地展示了整個結構:
然後這張圖展示了CRF處理前後的效果對比,可以看出用了CRF以後,細節確實改善了很多:
deeplab對FCN更加優雅的處理方式
在第一步中,deeplab仍然採用了FCN來得到score
map,並且也是在VGG網路上進行fine-tuning。但是在得到score
map的處理方式上,要比原FCN處理的優雅很多。
還記得CVPR
2015的FCN中是怎麼得到一個更加dense的score
map的嗎?
是一張500x500的輸入圖像,直接在第一個卷積層上conv1_1來了一個100的大padding。最終在fc7層勉強得到一個16x16的score
map。雖然處理上稍顯粗糙,但是畢竟人家是第一次將圖像分割在CNN上搞成end-to-end,並且在當時performance是state-of-the-art,也很理解。
deeplab摒棄了這種做法,取而代之的是對VGG的網路結構上做了小改動:將VGG網路的pool4和pool5層的stride由原來的2改為了1。就是這樣一個改動,使得vgg網路總的stride由原來的32變成8,進而使得在輸入圖像為514x514,正常的padding時,fc7能得到67x67的score
map,
要比FCN確實要dense很多很多。
但是這種改變網路結果的做法也帶來了一個問題:
stride改變以後,如果想繼續利用vgg
model進行fine
tuning,會導致後面filter作用的區域發生改變,換句話說就是感受野發生變化。這個問題在下圖(a)
(b)中通過花括弧體現出來了:
Hole演算法
於是乎,作者想出了一招,來解決兩個看似有點矛盾的問題:
既想利用已經訓練好的模型進行fine-tuning,又想改變網路結構得到更加dense的score
map.
這個解決辦法就是採用Hole演算法。如下圖(a)
(b)所示,在以往的卷積或者pooling中,一個filter中相鄰的權重作用在feature
map上的位置都是物理上連續的。如下圖(c)所示,為了保證感受野不發生變化,某一層的stride由2變為1以後,後面的層需要採用hole演算法,具體來講就是將連續的連接關系是根據hole
size大小變成skip連接的(圖(c)為了顯示方便直接畫在本層上了)。不要被(c)中的padding為2嚇著了,其實2個padding不會同時和一個filter相連。
pool4的stride由2變為1,則緊接著的conv5_1,
conv5_2和conv5_3中hole
size為2。接著pool5由2變為1,
則後面的fc6中hole
size為4。
代碼
主要是im2col(前傳)和col2im(反傳)中做了改動
(增加了hole_w,
hole_h),這里只貼cpu的用於理解:
❼ 圖像分割
圖像閾值化分割是一種傳統的最常用的圖像分割方法,因其實現簡單、計算量小、性能較穩定而成為圖像分割中最基本和應用最廣泛的分割技術。它特別適用於目標和背景占據不同灰度級范圍的圖像。它不僅可以極大的壓縮數據量,而且也大大簡化了分析和處理步驟,因此在很多情況下,是進行圖像分析、特徵提取與模式識別之前的必要的圖像預處理過程。
圖像閾值化的目的是要按照灰度級,對像素集合進行一個劃分,得到的每個子集形成一個與現實景物相對應的區域,各個區域內部具有一致的屬性,而相鄰區域不具有這種一致屬性。這樣的劃分可以通過從灰度級出發選取一個或多個閾值來實現。
基本原理是:通過設定不同的特徵閾值,把圖像象素點分為若干類。
常用的特徵包括:直接來自原始圖像的灰度或彩色特徵;由原始灰度或彩色值變換得到的特徵。
設原始圖像為f(x,y),按照一定的准則f(x,y)中找到特徵值T,將圖像分割為兩個部分,分割後的圖像為:
若取:b0=0(黑),b1=1(白),即為我們通常所說的圖像二值化。
閾值分割方法實際上是輸入圖像f到輸出圖像g的如下變換:
其中,T為閾值,對於物體的圖像元素g(i,j)=1,對於背景的圖像元素g(i,j)=0。
由此可見,閾值分割演算法的關鍵是確定閾值,如果能確定一個合適的閾值就可准確地將圖像分割開來。閾值確定後,將閾值與像素點的灰度值逐個進行比較,而且像素分割可對各像素並行地進行,分割的結果直接給出圖像區域。
閾值分割的優點是計算簡單、運算效率較高、速度快。有著各種各樣的閾值處理技術,包括全局閾值、自適應閾值、最佳閾值等等。
閾值處理技術參看:
區域分割是講圖像按照相似性准則分成不同的區域,主要包括區域增長,區域分裂合並和分水嶺等幾種類型。
區域生長是一種串列區域分割的圖像分割方法。區域生長是指從某個像素出發,按照一定的准則,逐步加入鄰近像素,當滿足一定的條件時,區域生長終止。區域生長的好壞決定於1. 初始點(種子點)的選取。 2. 生長准則。 3. 終止條件 。區域生長是從某個或者某些像素點出發,最後得到整個區域,進而實現目標的提取。
區域生長的基本思想是將具有相似性質的像素集合起來構成區域。具體先對每個需要分割的區域找一個種子像素作為生長的起點,然後將種子像素周圍鄰域中與種子像素有相同或相似性質的像素(根據某種事先確定的生長或相似准則來判定)合並到種子像素所在的區域中。將這些新像素當作新的種子像素繼續進行上面的過程,直到再沒有滿足條件的像素可被包括進來。這樣一個區域就長成了。
區域生長需要選擇一組能正確代表所需區域的種子像素,確定在生長過程中的相似性准則,制定讓生長停止的條件或准則。相似性准則可以是灰度級、彩色、紋理、梯度等特性。選取的種子像素可以是單個像素,也可以是包含若干個像素的小區域。大部分區域生長准則使用圖像的局部性質。生長准則可根據不同原則制定,而使用不同的生長准則會影響區域生長的過程。
圖1是區域增長的示例。
區域生長是一種古老的圖像分割方法,最早的區域生長圖像分割方法是由Levine等人提出的。該方法一般有兩種方式,一種是先給定圖像中要分割的目標物體內的一個小塊或者說種子區域(seed point),再在種子區域基礎上不斷將其周圍的像素點以一定的規則加入其中,達到最終將代表該物體的所有像素點結合成一個區域的目的;另一種是先將圖像分割成很多的一致性較強,如區域內像素灰度值相同的小區域,再按一定的規則將小區域融合成大區域,達到分割圖像的目的,典型的區域生長法如T. C. Pong等人提出的基於小面(facet)模型的區域生長法,區域生長法固有的缺點是往往會造成過度分割,即將圖像分割成過多的區域
區域生長實現的步驟如下:
區域分裂合並演算法的基本思想是先確定一個分裂合並的准則,即區域特徵一致性的測度,當圖像中某個區域的特徵不一致時就將該區域分裂成4個相等的子區域,當相鄰的子區域滿足一致性特徵時則將它們合成一個大區域,直至所有區域不再滿足分裂合並的條件為止。當分裂到不能再分的情況時,分裂結束,然後它將查找相鄰區域有沒有相似的特徵,如果有就將相似區域進行合並,最後達到分割的作用。在一定程度上區域生長和區域分裂合並演算法有異曲同工之妙,互相促進相輔相成的,區域分裂到極致就是分割成單一像素點,然後按照一定的測量准則進行合並,在一定程度上可以認為是單一像素點的區域生長方法。區域生長比區域分裂合並的方法節省了分裂的過程,而區域分裂合並的方法可以在較大的一個相似區域基礎上再進行相似合並,而區域生長只能從單一像素點出發進行生長(合並)。
反復進行拆分和聚合以滿足限制條件的演算法。
令R表示整幅圖像區域並選擇一個謂詞P。對R進行分割的一種方法是反復將分割得到的結果圖像再次分為四個區域,直到對任何區域Ri,有P(Ri)=TRUE。這里是從整幅圖像開始。如果P(R)=FALSE,就將圖像分割為4個區域。對任何區域如果P的值是FALSE.就將這4個區域的每個區域再次分別分為4個區域,如此不斷繼續下去。這種特殊的分割技術用所謂的四叉樹形式表示最為方便(就是說,每個非葉子節點正好有4個子樹),這正如圖10.42中說明的樹那樣。注意,樹的根對應於整幅圖像,每個節點對應於劃分的子部分。此時,只有R4進行了進一步的再細分。
如果只使用拆分,最後的分區可能會包含具有相同性質的相鄰區域。這種缺陷可以通過進行拆分的同時也允許進行區域聚合來得到矯正。就是說,只有在P(Rj∪Rk)=TRUE時,兩個相鄰的區域Rj和Rk才能聚合。
前面的討論可以總結為如下過程。在反復操作的每一步,我們需要做:
可以對前面講述的基本思想進行幾種變化。例如,一種可能的變化是開始時將圖像拆分為一組圖象塊。然後對每個塊進一步進行上述拆分,但聚合操作開始時受只能將4個塊並為一組的限制。這4個塊是四叉樹表示法中節點的後代且都滿足謂詞P。當不能再進行此類聚合時,這個過程終止於滿足步驟2的最後的區域聚合。在這種情況下,聚合的區域可能會大小不同。這種方法的主要優點是對於拆分和聚合都使用同樣的四叉樹,直到聚合的最後一步。
分水嶺分割方法,是一種基於拓撲理論的數學形態學的分割方法,其基本思想是把圖像看作是測地學上的拓撲地貌,圖像中每一點像素的灰度值表示該點的海拔高度,每一個局部極小值及其影響區域稱為集水盆,而集水盆的邊界則形成分水嶺。分水嶺的概念和形成可以通過模擬浸入過程來說明。在每一個局部極小值表面,刺穿一個小孔,然後把整個模型慢慢浸入水中,隨著浸入的加深,每一個局部極小值的影響域慢慢向外擴展,在兩個集水盆匯合處構築大壩,即形成分水嶺。
分水嶺的計算過程是一個迭代標注過程。分水嶺比較經典的計算方法是L. Vincent提出的。在該演算法中,分水嶺計算分兩個步驟,一個是排序過程,一個是淹沒過程。首先對每個像素的灰度級進行從低到高排序,然後在從低到高實現淹沒過程中,對每一個局部極小值在h階高度的影響域採用先進先出(FIFO)結構進行判斷及標注。
分水嶺變換得到的是輸入圖像的集水盆圖像,集水盆之間的邊界點,即為分水嶺。顯然,分水嶺表示的是輸入圖像極大值點。因此,為得到圖像的邊緣信息,通常把梯度圖像作為輸入圖像,即
分水嶺演算法對微弱邊緣具有良好的響應,圖像中的雜訊、物體表面細微的灰度變化,都會產生過度分割的現象。但同時應當看出,分水嶺演算法對微弱邊緣具有良好的響應,是得到封閉連續邊緣的保證的。另外,分水嶺演算法所得到的封閉的集水盆,為分析圖像的區域特徵提供了可能。
為消除分水嶺演算法產生的過度分割,通常可以採用兩種處理方法,一是利用先驗知識去除無關邊緣信息。二是修改梯度函數使得集水盆只響應想要探測的目標。
為降低分水嶺演算法產生的過度分割,通常要對梯度函數進行修改,一個簡單的方法是對梯度圖像進行閾值處理,以消除灰度的微小變化產生的過度分割。即
程序可採用方法:用閾值限制梯度圖像以達到消除灰度值的微小變化產生的過度分割,獲得適量的區域,再對這些區域的邊緣點的灰度級進行從低到高排序,然後在從低到高實現淹沒的過程,梯度圖像用Sobel運算元計算獲得。對梯度圖像進行閾值處理時,選取合適的閾值對最終分割的圖像有很大影響,因此閾值的選取是圖像分割效果好壞的一個關鍵。缺點:實際圖像中可能含有微弱的邊緣,灰度變化的數值差別不是特別明顯,選取閾值過大可能會消去這些微弱邊緣。
參考文章:
圖像分割的一種重要途徑是通過邊緣檢測,即檢測灰度級或者結構具有突變的地方,表明一個區域的終結,也是另一個區域開始的地方。這種不連續性稱為邊緣。不同的圖像灰度不同,邊界處一般有明顯的邊緣,利用此特徵可以分割圖像。
圖像中邊緣處像素的灰度值不連續,這種不連續性可通過求導數來檢測到。對於階躍狀邊緣,其位置對應一階導數的極值點,對應二階導數的過零點(零交叉點)。因此常用微分運算元進行邊緣檢測。常用的一階微分運算元有Roberts運算元、Prewitt運算元和Sobel運算元,二階微分運算元有Laplace運算元和Kirsh運算元等。在實際中各種微分運算元常用小區域模板來表示,微分運算是利用模板和圖像卷積來實現。這些運算元對雜訊敏感,只適合於雜訊較小不太復雜的圖像。
由於邊緣和雜訊都是灰度不連續點,在頻域均為高頻分量,直接採用微分運算難以克服雜訊的影響。因此用微分運算元檢測邊緣前要對圖像進行平滑濾波。LoG運算元和Canny運算元是具有平滑功能的二階和一階微分運算元,邊緣檢測效果較好,
在邊緣檢測演算法中,前三個步驟用得十分普遍。這是因為大多數場合下,僅僅需要邊緣檢測器指出邊緣出現在圖像某一像素點的附近,而沒有必要指出邊緣的精確位置或方向.邊緣檢測誤差通常是指邊緣誤分類誤差,即把假邊緣判別成邊緣而保留,而把真邊緣判別成假邊緣而去掉.邊緣估計誤差是用概率統計模型來描述邊緣的位置和方向誤差的.我們將邊緣檢測誤差和邊緣估計誤差區分開,是因為它們的計算方法完全不同,其誤差模型也完全不同.
Roberts運算元 :邊緣定位準,但是對雜訊敏感。適用於邊緣明顯且雜訊較少的圖像分割。Roberts邊緣檢測運算元是一種利用局部差分運算元尋找邊緣的運算元,Robert運算元圖像處理後結果邊緣不是很平滑。經分析,由於Robert運算元通常會在圖像邊緣附近的區域內產生較寬的響應,故採用上述運算元檢測的邊緣圖像常需做細化處理,邊緣定位的精度不是很高。
Prewitt運算元 :對雜訊有抑製作用,抑制雜訊的原理是通過像素平均,但是像素平均相當於對圖像的低通濾波,所以Prewitt運算元對邊緣的定位不如Roberts運算元。
Sobel運算元 :Sobel運算元和Prewitt運算元都是加權平均,但是Sobel運算元認為,鄰域的像素對當前像素產生的影響不是等價的,所以距離不同的像素具有不同的權值,對運算元結果產生的影響也不同。一般來說,距離越遠,產生的影響越小。
Isotropic Sobel運算元 :加權平均運算元,權值反比於鄰點與中心點的距離,當沿不同方向檢測邊緣時梯度幅度一致,就是通常所說的各向同性。
在邊沿檢測中,常用的一種模板是Sobel 運算元。Sobel 運算元有兩個,一個是檢測水平邊沿的;另一個是檢測垂直平邊沿的 。Sobel運算元另一種形式是各向同性Sobel(Isotropic Sobel)運算元,也有兩個,一個是檢測水平邊沿的,另一個是檢測垂直平邊沿的 。各向同性Sobel運算元和普通Sobel運算元相比,它的位置加權系數更為准確,在檢測不同方向的邊沿時梯度的幅度一致。由於建築物圖像的特殊性,我們可以發現,處理該類型圖像輪廓時,並不需要對梯度方向進行運算,所以程序並沒有給出各向同性Sobel運算元的處理方法。
1971年,R.Kirsch[34]提出了一種能檢測邊緣方向的Kirsch運算元新方法:它使用了8個模板來確定梯度幅度值和梯度的方向。
圖像中的每個點都用8個掩模進行卷積,每個掩模對某個特定邊緣方向作出最大響應。所有8個方向中的最大值作為邊緣幅度圖像的輸出。最大響應掩模的序號構成了對邊緣方向的編碼。
Kirsch運算元的梯度幅度值用如下公式:
不同檢測運算元的對比:
參考文章:
文章引用於 木夜溯
編輯 Lornatang
校準 Lornatang
❽ 如何用區域生長法實現圖像分割
區域生長法圖像分割是直接根據像素的相似性和連通性來對圖像進行聚類的演算法。基本原理是,給出若干種子點,然後依次對這些種子點進行如下操作,直到種子點集合為空:判斷種子點四鄰域或八鄰域的像素點是否和種子點相似(灰度相似或其他測度相似),如果相似則將該點加入種子點集合,否則不作處理。
該演算法原理很簡單,但在數據結構的組織上卻需要技巧,本文介紹一種簡易的數據組織方式實現該演算法。
如上圖所示,左圖為一幅W*H大小的圖像示意圖,利用區域生長法圖像分割演算法,該圖像被分割(聚類)為7塊;右圖為相應的數據結構,圖像分割的結果屬於圖像空間數據,其實就是一系列的像素點坐標數組或與像素點坐標直接關聯的屬性數組如FLAG的數組等,這個數組的維度一定是W*H,而分割結果體現在數組元素的排列順序:同一類別的元素連續存儲。然而類別的界限無法用該數組表明,而只能用另外一個描述數組,這里我們稱之為圖像空間數據的「元數據」數據,這個數組的有效維度為空間數據的類別數,即7,每個元素代表的是空間數據數組中每個類別的元素個數,其實也就相應地表明了每個類別的指針位置。