圖像分割OWT-UCM Hierarchical Segmentation 算法代碼應用並提取分層分割結果

轉自:https://blog.csdn.net/skye1221/article/details/75125897

伯克利的一篇Contour Detection and Hierarchical Image Segmentation論文提出來一個新的圖像分割算法,本文將簡單介紹該算法對應代碼的應用。 

這篇博客中對該paper有介紹。 
伯克利資源,該網頁包括數據庫和代碼下載鏈接。 
這裏寫圖片描述 
下載源代碼,此代碼需要在Linux或Mac中的MATLAB下運行。最重要的是該代碼運行時要求5G的內存,所以當系統不足5G時有很大概率會不能正常運行。本人已在Ubuntu16.04和matalbr2014a下成功運行。

1. gcc降級

Ubuntu16.04自帶的gcc版本比MATLAB 2014支持的gcc版本高,所以要進行降級,降到4.7。若Linux系統自帶的gcc版本與你安裝的matlab支持的gcc版本匹配,就無需降級或升級。


 
  1. sudo apt-get install –y gcc-4.7

  2. sudo apt-get install –y g++-4.7

  3. cd /usr/bin

  4. sudo rm gcc

  5. sudo ln –s gcc-4.7 gcc

  6. sudo rm g++

  7. sudo ln –s g++-4.7 g++

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在終端輸入gcc –version 查看是否降級成功 
這裏寫圖片描述

2、準備

本部分參考 BSR_source/BSR/grouping/source/README_linux,默認已成功安裝好matlab,以及配置好mex。

確保系統安裝需要的圖像庫


 
  1. $ sudo apt-get install libjpeg-dev

  2. $ sudo apt-get install libpng-dev

  • 1
  • 2
  • 3

強制matlab加載系統的最新庫,而不是自己的舊版本

$ export LD_PRELOAD=/lib/x86_64-linux-gnu/libc.so.6:/usr/lib/x86_64-linux-gnu/libstdc++.so.6:/lib/x86_64-linux-gnu/libgcc_s.so.1
  • 1

3、編譯

在文件BSR_source/BAR/grouping/source/gpb_src/Rules.make中編輯以下行以指向安裝matlab的目錄

MATLAB_PATH := /usr/local/MATLAB/R2014a/ #設置自己的matlab安裝路徑

Matlab mex文件編譯設置,matlab架構 
32位系統設置以下語句 
MATLAB_ARCH := glnx86 
MEX_EXTN := mexglx 
64位系統設置以下語句

MATLAB_ARCH := glnxa64 
MEX_EXTN := mexa64

在終端中cd進入/BSR/grouping/source文件夾中,執行命令

$ source build.sh
  • 1

該命令會對所有源代碼進行編譯,編譯成功會在終端出現類似下圖情形: 
這裏寫圖片描述

4、運行

在grouping下有三個demo文件,然而直接運行很大機率會報錯。OWT-UCM算法的基本步驟是gPb——OWT——UCM,對於下載的代碼,我們只需要調用最重要的一個函數im2ucm並做適當修改即可。我在~/Data/VOC2012/test/下放了兩個圖片進行測試。 
這裏寫圖片描述


 
  1. imgDir='~/Data/VOC2012/test/'; %存放圖片的文件夾

  2. outDir='~/Data/VOC2012/UCMImages/' %存放結果的文件夾

  3. D=dir(fullfile(imgDir,'*.jpg'));

  4. tic

  5. for i=1:numel(D)

  6. outFile=[outDir D(i).name(1:end-4) '.bmp']; %輸出結果圖片的文件名,保存爲bmp格式

  7. imgFile=[imgDir D(i).name]; %輸入圖片的文件名

  8. im2ucm(imgFile,outFile); %調用im2ucm函數

  9. end

  10.  
  11. toc

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

!提示:輸出結果最好保存爲bmp,爲了後續提取分層分割結果。

同時,需要在im2ucm.m文件中修改部分代碼,修改保存方式,以適應bmp格式。


 
  1. function [ucm2] = im2ucm(imgFile, outFile)

  2.  
  3. gPb_orient = globalPb(imgFile, outFile);

  4. ucm2 = contours2ucm(gPb_orient, 'doubleSize');

  5. % save(outFile,'ucm2');

  6. imwrite(ucm2,outFile,'bmp');

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

運行成功,會在matlab命令行顯示一下類似內容 
這裏寫圖片描述

UCM結果如下圖 
這裏寫圖片描述

提取UCM的分層分割結果,附上代碼如下,該代碼可以在windows運行。


 
  1. str = 'F:\Data\VOC2012\test\'; %UCM結果存放路徑

  2. %ids.txt保存的是圖片id方便後面建立文件夾

  3. mIDfile = importdata('F:\Data\VOC2012\ids.txt');

  4. for i=1:2 %目前只有2個圖片,所以長度爲2

  5. str1=strcat(str,strcat(mIDfile(i),'.bmp'));

  6. str1=char(str1)

  7. img = imread(str1);

  8. idx = unique(img); %得到UCM結果圖中的pixel value的集合

  9. maxL = length(idx);

  10. mkdir(['D:\Data\VOC2012\UCM\' ...

  11. char(mIDfile(i))]);

  12. for j=1:maxL-1 %提取分層結果並保存

  13. im = uint8(img>idx(j));

  14. [pointy,pointx] = find(im==0);

  15. [pointy1,pointx1] = find(im==1);

  16. im(sub2ind(size(im),pointy,pointx)) = 255;

  17. im(sub2ind(size(im),pointy1,pointx1)) = 0;

  18.  
  19. imwrite(im, ['D:\Data\VOC2012\UCM\' ...

  20. char(mIDfile(i)) '\' num2str(j) '.bmp'],'BMP');

  21. end

  22. end

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

2007_000032的結果如下 
這裏寫圖片描述

對於上述情況,ids.txt的內容爲兩個圖片的編號 
這裏寫圖片描述

對於批量生成圖片的ids,提供以下技巧 
首先,進入windows的dos窗口,cd到要生成圖片存放的文件夾。 
然後輸入dir/s/on/b>F:/1.txt 該命名會圖片的路徑保存到F:/1.txt,當然txt的保存路徑可以隨意設置。 
這裏寫圖片描述

這裏寫圖片描述

可以使用Notepad++將 ‘F:\Data\VOC2012\test\’和‘.bmp’全部替換爲空,這樣只剩下圖片編號了。 
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章