伯克利的一篇Contour Detection and Hierarchical Image Segmentation论文提出来一个新的图像分割算法,本文将简单介绍该算法对应代码的应用。
这篇博客中对该paper有介绍。
伯克利资源,该网页包括数据库和代码下载链接。
下载源代码,此代码需要在Linux或Mac中的MATLAB下运行。最重要的是该代码运行时要求5G的内存,所以当系统不足5G时有很大概率会不能正常运行。本人已在Ubuntu16.04和matalbr2014a下成功运行。
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++
本部分参考 BSR_source/BSR/grouping/source/README_linux,默认已成功安装好matlab,以及配置好mex。
确保系统安装需要的图像库
$ sudo apt-get install libjpeg-dev
$ sudo apt-get install libpng-dev
强制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
在文件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
该命令会对所有源代码进行编译,编译成功会在终端出现类似下图情形:
在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
!提示:输出结果最好保存为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');
提取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
对于批量生成图片的ids,提供以下技巧
首先,进入windows的dos窗口,cd到要生成图片存放的文件夹。
然后输入dir/s/on/b>F:/1.txt 该命名会图片的路径保存到F:/1.txt,当然txt的保存路径可以随意设置。
可以使用Notepad++将 ‘F:\Data\VOC2012\test\’和‘.bmp’全部替换为空,这样只剩下图片编号了。