Python实现超像素分割
目錄
- 一、什么是超像素?
- 二、超像素具有哪些特點?
- 三、Simple Linear Iterative Clustering (SLIC)算法實現步驟
- 四、SLIC算法代碼實現
- 五、效果展示和分析
- 六、基于超像素的邊緣檢測代碼
- 七、基于超像素的邊緣檢測效果展示與分析
- 八、思維擴展
- 參考資料
- 注意事項
一、什么是超像素?
??超像素概念是2003年Xiaofeng Ren提出和發展起來的圖像分割技術,它是指具有相似紋理、顏色、亮度等特征的相鄰像素構成的有一定視覺意義的不規則像素塊。它利用像素之間特征的相似性將像素分組,用少量的超像素代替大量的像素來表達圖片特征,很大程度上降低了圖像后處理的復雜度,所以通常作為分割算法的預處理步驟。該技術已經被廣泛的應用到圖像分割、姿勢估計、目標跟蹤、目標識別等多個計算機視覺任務等。下圖展示了幾種不同的超像素分割算法的分割結果。
二、超像素具有哪些特點?
- 計算效率比較高。 雖然計算實際的超像素組可能很昂貴,但它允許我們將圖像本身的復雜性從幾十萬像素降低到幾百像素。這些超級像素中的每一個都將包含某種感知的、理想的語義值。
- 含有更多的感知信息。 單個的像素網格其實并沒有太大的感知意義,而超像素組中的像素具有共性,例如相似的顏色或紋理分布。下圖展示了這種情況,單單將圖中箭頭所指的圖像像素網格進行放大后并不能得到什么感知信息。
- 過度分割可以減少像素損失。 大多數的超像素算法都會使圖像失真。這意味著圖像中的大部分重要邊界都被找到了;但是它的代價是生成許多無關緊要的邊界。雖然這聽起來像是使用超級像素的問題,但實際上它會帶來優點,這種過度擴張的最終結果是-從像素網格到超級像素映射的像素損失非常小。
- **超像素上表示圖形更加高效。**在50000 x 50000像素的網格上構建一個圖形,其中每個像素表示圖形中的一個節點,這將會導致非常大的表示量。但是,假設我們將超像素應用到像素網格空間,留下(任意)200個超像素塊。在這種表示中,在200個超級像素上構建一個圖實際上更加有效。
三、Simple Linear Iterative Clustering (SLIC)算法實現步驟
- 步驟1-初始化種子點(聚類中心):按照設定的超像素組個數,在圖像內均勻的分配一些種子點。假設圖片總共有含有N 個像素點,預分割為 K 個相同尺寸的超像素,那么每個超像素的大小為N/ K ,則相鄰種子點的距離或者步長近似可以表示為S=sqrt(N/K)。
- 步驟2-在種子點的n*n鄰域內重新選擇種子點(一般取n=3)。首先計算該鄰域內所有像素點的梯度值;然后將種子點移到該鄰域內梯度最小的地方。這樣做的目的是為了避免種子點落在梯度較大的輪廓邊界上,以免影響后續聚類效果。
- 步驟3-在每個種子點周圍的鄰域內為每個像素點分配類標簽(即屬于哪個聚類中心)。和標準的k-means在整張圖中搜索不同,SLIC的搜索范圍限制為2S2S,可以加速算法收斂,具體的區別如下圖所示。需要注意的是,期望的超像素尺寸為SS,但是搜索的范圍是2S*2S。
- 步驟4-距離度量。具體包括顏色和空間距離。對于每個搜索到的像素點,分別計算它到該種子點之間的距離。具體的距離公式如下所示:
四、SLIC算法代碼實現
# coding=utf-8 # 導入相應的python包 import argparse from skimage import io import matplotlib.pyplot as plt from skimage.segmentation import slic from skimage.util import img_as_float from skimage.segmentation import mark_boundaries# 設置并解析參數 ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", required = True, help = "Path to the image") args = vars(ap.parse_args())# 讀取圖片并將其轉化為浮點型 image = img_as_float(io.imread(args["image"]))# 循環設置不同的超像素組 for numSegments in (100, 200, 300):# 應用slic算法并獲取分割結果segments = slic(image, n_segments = numSegments, sigma = 5)# 繪制結果fig = plt.figure("Superpixels -- %d segments" % (numSegments))ax = fig.add_subplot(1, 1, 1)ax.imshow(mark_boundaries(image, segments))plt.axis("off")# 顯示結果 plt.show()五、效果展示和分析
??上圖展示了SLIC超像素分割算法的分割結果。上圖展示了兩個測試圖片的效果,第1行表示的是原始的輸入圖片;第2行表示的是設置了100個超像素組的分割結果;第2行表示的是設置了200個超像素組的分割結果;第3行表示的是設置了300個像素的分割結果。通過上面的結果我們可以獲得一些信息,即通過超像素分割我們可以將整個圖像劃分為含有固定個超像素組的感知塊,具體如圖中的黃色塊所示。
六、基于超像素的邊緣檢測代碼
%% Clean up clear all close all clc%Generate image img = imread('test.jpg'); img = double(rgb2gray(img));%Invert circle brightness img = abs(img-1);%Blur original image with Gaussian kernel with a blur width (standard %deviaion) of 0.9 pixels BlurGaussian = 0.9; G = fspecial('Gaussian',5,BlurGaussian); img = imfilter(img,G,'replicate');%Blurring occurs from quantization and from Gaussian BlurQuantization = 1/sqrt(12); BlurWidth = sqrt( BlurQuantization^2 + BlurGaussian^2);%% Create mask %Only consider edges on columns 35-50 M = true(size(img));%% Perform edge localization %Get pixel-level edges with Sobel operator [E] = edge(img,'sobel');%Refine to subpixel accuracy edges = SubpixelEdge(img,E,BlurWidth,M);%% Plot results %Show image figure(1); imshow(uint8(img)),hold on, axis on; plot(edges.u,edges.v,'co')figure(2); imshow(uint8(M)),hold on, axis on; plot(edges.u,edges.v,'co')% p1 = [edges.u(1), edges.v(1), 0]; % p2 = [edges.u(100), edges.v(100), 0]; % p3 = [edges.u(500), edges.v(500), 0]; % p = CircleCenter(p1, p2, p3); % % disp('當前圓的半徑為%d', p);x=edges.u; y=edges.v; [R,x0,y0]=circ(x,y,edges.NumPts-1); disp(['第一個圓的半徑是: ' num2str(R),' mm' ]); disp(['第一個圓的圓心坐標:( ' num2str(x0) ,',',num2str(y0),')']); plot(x0, y0, 'gx');七、基于超像素的邊緣檢測效果展示與分析
??上圖展示了超像素邊緣檢測的結果。第1行表示的是原始的輸入圖像;第2行表示的是超像素檢測的結果,藍色表示超像素塊,整個結果是疊加在原始圖像上面的,我們可以發現超像素可以準確的檢測出齒輪的邊緣信息,包括它的內環和外環信息;第3行含表示的是單純的超像素檢測結果,整個結果疊加在一個全黑的圖像中,中心的綠色的x表示整個圓環的中心點,上述的代碼可以計算出圓環的中心和半徑值,這在機器視覺領域中具有較多的應用。
八、思維擴展
??對于圖中的齒輪而言,我們一般會對該齒輪的外半徑、內半徑、模數和齒數目比較感興趣。那么如何通過算法來獲取到這些參數,聰明的你肯定能想出一些比較好的方案。
參考資料
[1] 參考資料
注意事項
[1] 該博客是本人原創博客,如果您對該博客感興趣,想要轉載該博客,請與我聯系(qq郵箱:1575262785@qq.com),我會在第一時間回復大家,謝謝大家的關注.
[2] 由于個人能力有限,該博客可能存在很多的問題,希望大家能夠提出改進意見。
[3] 如果您在閱讀本博客時遇到不理解的地方,希望您可以聯系我,我會及時的回復您,和您交流想法和意見,謝謝。
[4] 本文測試的圖片可以通過該鏈接進行下載。網盤鏈接- 提取碼:hd2x。
[5] 本人業余時間承接各種本科畢設設計和各種小項目,包括圖像處理(數據挖掘、機器學習、深度學習等)、matlab仿真、python算法及仿真等,有需要的請加QQ:1575262785詳聊!!!
總結
以上是生活随笔為你收集整理的Python实现超像素分割的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 免费下载外文文献
- 下一篇: Kali Linux终端命令大全(建议收