轉自: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版本匹配,就無需降級或升級。
-
sudo apt-get install –y gcc-4.7
-
sudo apt-get install –y g++-4.7
-
cd /usr/bin
-
sudo rm gcc
-
sudo ln –s gcc-4.7 gcc
-
sudo rm g++
-
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。
確保系統安裝需要的圖像庫
-
$ sudo apt-get install libjpeg-dev
-
$ 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/下放了兩個圖片進行測試。
-
imgDir='~/Data/VOC2012/test/'; %存放圖片的文件夾
-
outDir='~/Data/VOC2012/UCMImages/' %存放結果的文件夾
-
D=dir(fullfile(imgDir,'*.jpg'));
-
tic
-
for i=1:numel(D)
-
outFile=[outDir D(i).name(1:end-4) '.bmp']; %輸出結果圖片的文件名,保存爲bmp格式
-
imgFile=[imgDir D(i).name]; %輸入圖片的文件名
-
im2ucm(imgFile,outFile); %調用im2ucm函數
-
end
-
toc
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
!提示:輸出結果最好保存爲bmp,爲了後續提取分層分割結果。
同時,需要在im2ucm.m文件中修改部分代碼,修改保存方式,以適應bmp格式。
-
function [ucm2] = im2ucm(imgFile, outFile)
-
gPb_orient = globalPb(imgFile, outFile);
-
ucm2 = contours2ucm(gPb_orient, 'doubleSize');
-
% save(outFile,'ucm2');
-
imwrite(ucm2,outFile,'bmp');
- 1
- 2
- 3
- 4
- 5
- 6
- 7
運行成功,會在matlab命令行顯示一下類似內容
UCM結果如下圖
提取UCM的分層分割結果,附上代碼如下,該代碼可以在windows運行。
-
str = 'F:\Data\VOC2012\test\'; %UCM結果存放路徑
-
%ids.txt保存的是圖片id方便後面建立文件夾
-
mIDfile = importdata('F:\Data\VOC2012\ids.txt');
-
for i=1:2 %目前只有2個圖片,所以長度爲2
-
str1=strcat(str,strcat(mIDfile(i),'.bmp'));
-
str1=char(str1)
-
img = imread(str1);
-
idx = unique(img); %得到UCM結果圖中的pixel value的集合
-
maxL = length(idx);
-
mkdir(['D:\Data\VOC2012\UCM\' ...
-
char(mIDfile(i))]);
-
for j=1:maxL-1 %提取分層結果並保存
-
im = uint8(img>idx(j));
-
[pointy,pointx] = find(im==0);
-
[pointy1,pointx1] = find(im==1);
-
im(sub2ind(size(im),pointy,pointx)) = 255;
-
im(sub2ind(size(im),pointy1,pointx1)) = 0;
-
imwrite(im, ['D:\Data\VOC2012\UCM\' ...
-
char(mIDfile(i)) '\' num2str(j) '.bmp'],'BMP');
-
end
-
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’全部替換爲空,這樣只剩下圖片編號了。