图像分割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版本匹配,就无需降级或升级。

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’全部替换为空,这样只剩下图片编号了。 
这里写图片描述

猜你喜欢

转载自blog.csdn.net/hxg2006/article/details/79828532
今日推荐