Ncut算法的MATLAB代码下载及实现在MATLAB上正常运行
这里我所使用的平台是:win7(64bit)+MATLAB2014a(64bit)
Ncut算法,又称为归一化割法(Normalized Cut),是图像分割算法。可以说是我目前研究生生涯使用到的分割效果比较理想的一种图像分割算法,
代码的下载地址:http://timotheecour.com/software/ncut_multiscale/ncut_multiscale.html
进入下载地址界面后,你会看到如下面截图所示的地方,这里我们下载最新的ncut_multiscale_1_6.zip.
下载完成后,我们将压缩文件进行解压,我们可以看到解压的文件中即有.m文件,也有.cpp文件,如下图所示(部分截图)。
因为.cpp文件需要我们进行编译才能调用,因此,接下来简述下最重要的编译环节,编译我们需要在解压的文件夹中创建complieDir_simple.m文件,代码如下所示:
function compileDir_simple(Cdir); if nargin<1 Cdir=pwd; end files = dir(fullfile(Cdir,'*.cpp')); oldDir=pwd; cd(Cdir); for j=1:length(files) try % cm = sprintf('mex %s',files(j).name); cm = sprintf('mex -largeArrayDims %s',files(j).name); disp(cm); eval(cm); catch disp(lasterr); disp('IGNORE if the file is a C++ file which is not a mex file (ie without a mexFunction inside)'); end end cd(oldDir);
创建完成后,我们之间点击MATLAB中的运行按钮就可以对cpp文件进行编译了,编译完成后你会发现文件夹中多了后缀为.mexw64的文件,这里w代表的是windows系统,64代表系统为64位的,如果你是在linux64bit下编译的话,会出现mexa64,它是linux64位下编译和使用的版本。
接下来我们测试下,是否可以对ncut算法进行调用,ncut算法的调用,我们只需调用ncut_multiscale.m文件就行(如下截图所示)。也就是调用这个[classes,X,lambda,Xr,W,C,timing] = ncut_multiscale(image,nsegs,options);
这里我给一个我使用的测试代码,先在当前存放ncut代码的文件夹里创建一个test.m 的文件,当然文件名你可以随意去了,代码如下所示:
image = imread('v48752.jpg'); ncut=10; im=image; n=ncut; region = ncut_multiscale(image,10); [x,y,c]=size(image); im1=region; for m=1:ncut for i=1:x for j=1:y if im1(i,j) ==m im(i,j,1)=255*abs(sin(255-m*60)); im(i,j,2)=255*abs(cos(m)); im(i,j,3)=255*abs(sin(m*20)); end end end end figure; imshow(im)
这里调用的图片为ncut算法解压后文件中自带的图片,你在文件中可以找到。
如果你使用的matlab版本为2013a及以上的版本,则运行后应该会报错说未找到cholinc函数,这是因为cholinc函数在MATLAB2012版本后就被弃用了,2013a以下的版本到这一步应该是可以运行成功了。对于遇到的cholinc函数报错问题可以用ichol函数代替,具体怎么代替,这里举一个代码中需替换的例子:
R = cholinc(C,'0'); 替换为 R = ichol(C,struct('type','ict','droptol',0,'shape','upper'));(想了解为何这样替换的可以查看这个链接:http://stackoverflow.com/questions/12895228/ichol-as-cholinc-replacement-nonpositive-pivot)
代码中另外两处的替换如下图所示:
解决了这个问题,我们就可以正常运行下载的ncut算法了。最终运行test.m文件结果如下图所示:
输入:
输出:
到此为止就实现了ncut代码的正常运行了。
这里再补充一下啊,ncut算法还可以用于聚类,具体代码的下载及bug的修复可以看以下链接:
http://www.cnblogs.com/Azhu/p/4145166.html作者给出了详细说明。
如果按上面的方法仍编译不成功的话,可以下载本人编译好的代码,直接调用运行就行
百度网盘:http://pan.baidu.com/s/1o7XKpq6
本人亲测成功
win+Matlab2014a_64位
win+Matlab2015b_32位
ubuntu64位+Matlab2015b_64bit
能否在matlab2014以上其他版本运行,各位可以亲测下