圖像分割的演算法
A. 目前應用最廣的圖像分割演算法是什麼
小波變換是近年來得到了廣泛應用的數學工具,它在時域和頻域都具有良好的局部化性質,而且小波變換具有多尺度特性,能夠在不同尺度上對信號進行分析,因此在圖像處理和分析等許多方面得到應用。
基於小波變換的閾值圖像分割方法的基本思想是首先由二進小波變換將圖像的直方圖分解為不同層次的小波系數,然後依據給定的分割准則和小波系數選擇閾值門限,最後利用閾值標出圖像分割的區域。整個分割過程是從粗到細,有尺度變化來控制,即起始分割由粗略的L2(R)子空間上投影的直方圖來實現,如果分割不理想,則利用直方圖在精細的子空間上的小波系數逐步細化圖像分割。分割演算法的計算饋與圖像尺寸大小呈線性變化。
B. 圖像分割最好方法
1.基於閾值的分割方法
閾值法的基本思想是基於圖像的灰度特徵來計算一個或多個灰度閾值,並將圖像中每個像素的灰度值與閾值作比較,最後將像素根據比較結果分到合適的類別中。因此,該方法最為關鍵的一步就是按照某個准則函數來求解最佳灰度閾值。
閾值法特別適用於目標和背景占據不同灰度級范圍的圖。圖像若只有目標和背景兩大類,那麼只需要選取一個閾值進行分割,此方法成為單閾值分割;但是如果圖像中有多個目標需要提取,單一閾值的分割就會出現作物,在這種情況下就需要選取多個閾值將每個目標分隔開,這種分割方法相應的成為多閾值分割。
2.基於區域的圖像分割方法
基於區域的分割方法是以直接尋找區域為基礎的分割技術,基於區域提取方法有兩種基本形式:一種是區域生長,從單個像素出發,逐步合並以形成所需要的分割區域;另一種是從全局出發,逐步切割至所需的分割區域。
分水嶺演算法
分水嶺演算法是一個非常好理解的演算法,它根據分水嶺的構成來考慮圖像的分割,現實中我們可以想像成有山和湖的景象,那麼一定是水繞山山圍水的景象。
分水嶺分割方法,是一種基於拓撲理論的數學形態學的分割方法,其基本思想是把圖像看作是測地學上的拓撲地貌,圖像中每一點像素的灰度值表示該點的海拔高度,每一個局部極小值及其影響區域稱為集水盆,而集水盆的邊界則形成分水嶺。分水嶺的概念和形成可以通過模擬浸入過程來說明。在每一個局部極小值表面,刺穿一個小孔,然後把整個模型慢慢浸入水中,隨著浸入的加深,每一個局部極小值的影響域慢慢向外擴展,在兩個集水盆匯合處構築大壩,即形成分水嶺。
C. 圖像分割——分水嶺演算法
姓名:謝意遠
學號: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('標記矩陣疊加到原圖像');
D. 跪求圖像分割snake演算法詳細解釋_基於遺傳演算法的圖像分割
這個不太熟悉,下面是轉載,希望能幫到你:
圖像分割有那些方法區別如何
圖像分割有那些方法區別如何?
圖像分割是圖像處理領域中的一個基本問題。從大的方面來說,圖像分割方法可大致分為基於區域的方法、基於邊緣的方法、區域與邊緣相結合的方法,以及在此基礎上的、採用多解析度圖像處理理論的多尺度分割方法。基於區域的方法採用某種准則,直接將圖像劃分為多個區域,基於邊緣的方法則通過檢測包含不同區域的邊緣,獲得關於各區域的邊界輪廓描述,達到圖像分割的目的,而區域與邊緣相結合的方法通過區域分割與邊緣檢測的相互作用,得到分割結果。
·1基於區域的圖像分割兄旅螞
圖像分割中常用的直方圖門限法、區域生長法、基於圖像的隨機場模型法、鬆弛標記區域分割法等均屬於基於區域的方法。
(1)直方圖門限分割就是在一定的准則下,用一個或幾個門限值將圖像的灰度直方圖(一維的或多維的)分成幾個類,認為圖像中灰度值在同一個灰度類內的象素屬於同一個物體,可以採用的准則包括直方圖的谷底、最小類內方差(或最大類間方差)、最大熵(可使用各種形式的熵)、最小錯誤率、矩不變、最大繁忙度(由共生矩陣定義)等。門限法的缺陷在於它僅僅考慮了圖像的灰度信息,而忽略了圖像中的空間信息,對於圖像中不存在明顯的灰度差異或各物體的灰度值范圍有較大重疊的圖像分割問題難以得到准確的結果。
(2)區域生長是一種古老的圖像分割方法,最早的區域生長圖像分割方法是由Levine等人提出的。該方法一般有兩種方式,一種是先給定圖像中要分割的目標物體內的一個小塊或者說種子區域,再在鎮悶種子區域基礎上不斷將其周圍的像素點以一定的規則加入其中,達到最終將代表該物體的所有像素點結合成一個區域的目的;另一種是先將圖像分割成很多的一致性較強,如區域內像素灰度值相同的小區域,再按一定的規則將小區域融合成大區域,達到分割圖像的目的,典型的區域生長法如T.C.Pong等人提出的基於小面(facet)模型的區域生長法,區域生長法固有的缺點是往往會造成過度分割,即將圖像分割成過多的區域。
(3)基於圖像的隨機場模型法主要以Markov隨機場作為圖像模型,並假定該隨機場符合Gibbs分布。使用MRF模型進行圖像分割的問題包括:鄰域系統的定義;能量函數的選擇及其參數的估計;極小化能量函數從而獲得最大後驗概率的策略。鄰域系統一般是事先定義的,因而主要是後面兩個問題。S.Geman,首次將基於Gibbs分布的Markov隨機場模型用於圖像處理,詳細討論了MRF模型的鄰域系統,能量函數,Gibbs采樣方法等各種問題,提出用模擬退火演算法來極小化能量函數的方法,並給出了模擬退火演算法收斂性的證明,同時給出了MRF模型在圖像恢復中的應用實例。在此基礎上,人們提出了大量的基於MRF模型的圖像分割演算法。
(4)標記法(labeling)就是將圖像欲分割成的幾個區域各以一個不同的標號來表示,對圖像中的每一個象素,用一定的方式賦之以這些標記中的某一個,標記相同的連通象素就組成該標記所代表的區域。標記法常採用鬆弛技術來給圖像中的各個象素賦予標記,一般可分為離散鬆弛、概率鬆弛、模糊鬆弛等三種。Smith等人最先採用鬆弛標記技術進行圖像分割,以後人們又提出了大量的圖像鬆弛分割演算法。另外,鬆弛標記不僅可用於圖像分割,還可用於邊緣檢測、目標識別等。
·2基於邊緣的圖像分割
基於邊緣的分割方法則與邊緣檢測理論緊密相關,此類方法大多是基於局部信息的,一般利用圖像—階導數的極大值或二階導數的過零點信息來提供判斷邊緣點的基本依據,進一步還可以採用各種曲線擬合技術獲得劃分不同區域邊界的連續曲線。根據檢測邊緣所採用的方式的不同,邊緣檢測方法可大致分為以下幾類:基於局部圖像函數的方法、圖像濾波法、基於反應—擴散方程的方法、基於邊界曲線擬合的方法及活動輪廊(activecontour)法等。
(1)基於局部圖像函數羨埋法的基本思想是將灰度看成高度,用一個曲面來擬合一個小窗口內的數據,然後根據該曲面來決定邊緣點.
(2)圖像濾波法是基於如下理論的:即對濾波運算元與圖像的卷積結果求導,相當於用運算元的同階導數與圖像做卷積。於是,只要事先給出運算元的一階或二階導數,就可以將圖像平滑濾波與對平滑後的圖像求一階或二階導數在一步完成。因而,這種方法的核心問題是濾波器的設計問題。
常用的濾波器主要是高斯(Gaussian)函數的一階和二階層數,Canny認為高斯函數的一階導數是他求得的最優濾波器的較好似近,一般採用Laplacian運算元求高斯函數的二階導數得到LOG(LaplacianofGaussian)濾波運算元,該運算元由計算機視覺的創始人Marr首先提出.近年來研究的濾波器還有可控濾波器(steerable),B-樣條濾波器等。
問題提出:圖像濾波的方法是基於對平滑濾波後的圖像求其一階導數的極大值或二階導數的過零點來決定邊緣的,必然遇到的問題是,一階的極大值或二階導數的過零點對應的像素點是否真的就是邊緣點?
(3)基於反應—擴散方程的方法是從傳統意義上的Gaussian核函數多尺度濾波來的。由於本人閱讀文獻有限,這里不多做介紹了。
(4)基於邊界曲線擬合的方法用平面曲線來表示不同區域之間的圖像邊界線,試圖根據圖像梯度等信息找出能正確表示邊界的曲線從而得到圖像分割的目的,而且由於它直接給出的是邊界曲線而不象一般的方法找出的是離散的、不相關的邊緣點,因而對圖像分割的後繼處理如物體識別等高層處理有很大幫助。即使是用一般的方法找出的邊緣點,用曲線來描述它們以便於高層處理也是經常被採用的一種有效的方式。L.H.Staib等人在文獻中給出了一種用Fourier參數模型來描述曲線的方法,並根據Bayes定理,按極大後驗概率的原則給出了一個目標函數,通過極大化該目標函數來決定Fourier系數。實際應用中,先根據對同類圖像的分割經驗,給出一條初始曲線,再在具體分割例子中根據像數據優化目標函數來改變初始曲線的參數,擬合圖像數據,得到由圖像數據決定的具體曲線。這種方法比較適合於醫學圖像的分割。除了用Fourier模型來描述曲線外,近年來還研究了一些其它的曲線描述方法,如A.Goshtasby詳細介紹了用有理Gaussian曲線和曲面來設計和擬合二維及三維形狀的方法。R.Legault等人給出了一種曲線平滑的方法。M.F.Wu等人給出了一種雙變數三維Fourier描述子來描述三維曲面。
(5)活動輪廓(又稱Snake模型)是一種可變形模型(或稱彈性模型),最初由Kass等人提出。活動輪廓法邊緣檢測認為圖像中各區域的輪廓線應為平滑曲線,各輪廓線的能量由內部能量及外部能量(包括圖像能量及控制能量)兩部分組成,其中內部能量表徵了輪廓線的光滑約束,圖像能量由輪廓線上對應點的灰度、梯度和角點曲率半徑(若該點為角點)等決定,而控制能量則代表了圖像平面上固定點對輪廓線的吸引或排斥作用。採用變分法求解該能量函數的極小值就可得到與區域邊界相對應的輪廓線。
E. 圖像分割演算法總結
圖像處理的很多任務都離不開圖像分割。因為圖像分割在cv中實在太重要(有用)了,就先把圖像分割的常用演算法做個總結。
接觸機器學習和深度學習時間已經不短了。期間看過各種相關知識但從未總結過。本文過後我會盡可能詳細的從工程角度來總結,從傳統機器學習演算法,傳統計算機視覺庫演算法到深度學習目前常用演算法和論文,以及模型在各平台的轉化,量化,服務化部署等相關知識總結。
圖像分割常用演算法大致分為下面幾類。由於圖像的能量范函,邊緣追蹤等方法的效果往往只能解決特定問題,效果並不理想,這里不再闡述。當然二值化本身也可以分割一些簡單圖像的。但是二值化演算法較多,我會專門做一個文章來總結。這里不再贅述。
1.基於邊緣的圖像分割演算法:
有利用圖像梯度的傳統演算法運算元的sobel,roberts,prewitt,拉普拉斯以及canny等。
這些演算法的基本思想都是採用合適的卷積運算元,對圖像做卷積。從而求出圖像對應的梯度圖像。(至於為什麼通過如圖1這樣的運算元卷積,即可得到圖像的梯度圖像,請讀者復習下卷積和倒數的概念自行推導)由於圖像的邊緣處往往是圖像像素差異較大,梯度較大地方。因此我們通過合適的卷積核得到圖像的梯度圖像,即得到了圖像的邊緣圖像。至於二階運算元的推導,與一階類似。優點:傳統運算元梯度檢測,只需要用合適的卷積核做卷積,即可快速得出對應的邊緣圖像。缺點:圖像邊緣不一定準確,復雜圖像的梯度不僅僅出現在圖像邊緣,可以能出現在圖像內部的色彩和紋理上。
也有基於深度學習方法hed,rcf等。由於這類網路都有同一個比較嚴重的缺陷,這里只舉例hed網路。hed是基於FCN和VGG改進,同時引出6個loss進行優化訓練,通過多個層輸出不同scale的粒度的邊緣,然後通過一個訓練權重融合各個層的邊緣結果。hed網路結構如下:
可以得到一個比較完整的梯度圖像,可參考github的hed實現。優點:圖像的梯度細節和邊緣完整性,相比傳統的邊緣運算元要好很多。但是hed對於邊緣的圖像內部的邊緣並不能很好的區分。當然我們可以自行更改loss來嘗試只擬合外部的圖像邊緣。但最致命的問題在於,基於vgg的hed的網路表達能力有限,對於圖像和背景接近,或者圖像和背景部分相融的圖片,hed似乎就有點無能為力了。
2.基於區域分割的演算法:
區域分割比較常用的如傳統的演算法結合遺傳演算法,區域生長演算法,區域分裂合並,分水嶺演算法等。這里傳統演算法的思路是比較簡單易懂的,如果有無法理解的地方,歡迎大家一起討論學習。這里不再做過多的分析。
基於區域和語意的深度學習分割演算法,是目前圖像分割成果較多和研究的主要方向。例如FCN系列的全卷積網路,以及經典的醫學圖像分割常用的unet系列,以及rcnn系列發展下的maskrcnn,以及18年底的PAnet。基於語意的圖像分割技術,無疑會成為圖像分割技術的主流。
其中,基於深度學習語意的其他相關演算法也可以間接或直接的應用到圖像分割。如經典的圖像matting問題。18年又出現了許多非常優秀的演算法和論文。如Deep-Image-Matting,以及效果非常優秀的MIT的 semantic soft segmentation(sss).
基於語意的圖像分割效果明顯要好於其他的傳統演算法。我在解決圖像分割的問題時,首先嘗試用了hed網路。最後的效果並不理想。雖然也參考github,做了hed的一些fine-tune,但是還是上面提到的原因,在我多次嘗試後,最終放棄。轉而適用FCN系列的網路。但是fcn也無法解決圖像和背景相融的問題。圖片相融的分割,感覺即需要大的感受野,又需要未相融部分原圖像細節,所以單原FCN的網路,很難做出准確的分割。中間還測試過很多其他相關的網路,但都效果不佳。考慮到感受野和原圖像細節,嘗試了resnet和densenet作為圖像特徵提取的底層。最終我測試了unet系列的網路:
unet的原始模型如圖所示。在自己拍照爬蟲等手段採集了將近1000張圖片。去掉了圖片質量太差的,圖片內容太過類似的。爬蟲最終收集160多張,自己拍照收集200張圖片後,又用ps手動p了邊緣圖像,採用圖像增強變換,大約有300*24張圖片。原生unet網路的表現比較一般。在將unet普通的卷積層改為resnet後,網路的表達能力明顯提升。在將resnet改為resnet101,此時,即使對於部分相融的圖像,也能較好的分割了。但是unet的模型體積已經不能接受。
在最後階段,看到maskrcnn的實例分割。maskrcnn一路由rcnn,fasterrcnn發展過來。於是用maskrcnn來加入自己的訓練數據和label圖像進行訓練。maskrcnn的結果表現並不令人滿意,對於邊緣的定位,相比於其他演算法,略顯粗糙。在產品應用中,明顯還不合適。
3.基於圖的分割演算法
基於深度學習的deepgrab,效果表現並不是十分理想。deepgrab的git作者backbone採用了deeplabv2的網路結構。並沒有完全安裝原論文來做。
論文原地址參考: https://arxiv.org/pdf/1707.00243.pdf
整體結構類似於encode和decoder。並沒有太仔細的研究,因為基於resent101的結構,在模型體積,速度以及deeplab的分割精度上,都不能滿足當前的需求。之前大致總結過計算機視覺的相關知識點,既然目前在討論移動端模型,那後面就分模塊總結下移動端模型的應用落地吧。
由於時間實在有限。這里並沒有針對每個演算法進行詳細的講解。後續我會從基礎的機器學習演算法開始總結。
F. 圖像分割演算法分為幾類
從學術角度講圖像分割主要分成3大類,一是基於邊緣的,二是基於區域的,三是基於紋理的。由於基於紋理的也可以看成是基於區域的,所以有些專家也把分割方法分成基於邊緣和基於區域兩大類。
選擇演算法的時候主要參考你要分割的圖像樣本的特點。
如果圖像的邊界特別分明,比如綠葉和紅花,在邊界處紅綠明顯不同,可以精確提取到邊界,這時候用基於邊緣的方法就可行。但如果是像醫學圖像一樣,輪廓不是特別明顯,比如心臟圖像,左心房和左心室顏色比較接近,它們之間的隔膜僅僅是顏色比它們深一些,但是色彩上來說很接近,這時候用基於邊緣的方法就不合適了,用基於區域的方法更好。再比如帶紋理的圖像,例如條紋衫,如果用基於邊緣的方法很可能就把每一條紋都分割成一個物體,但實際上衣服是一個整體,這時候用基於紋理的方法就能把紋理相同或相似的區域分成一個整體。
不過總體來說,基於區域的方法近些年更熱一些,如Meanshift分割方法、測地線活動輪廓模型、JSEG等。