#include <math.h>
#include "mex.h"
/* Input Arguments */
#define maxiter_IN prhs[0]
#define npart_IN prhs[1]
#define nclass_IN prhs[2]
#define omega_IN prhs[3]
#define partnode_IN prhs[4]
#define slabel_IN prhs[5]
#define nsize_IN prhs[6]
#define nlist_IN prhs[7]
#define ndist_IN prhs[8]
#define pot_IN prhs[9]
/* Output Arguments */
#define ph2_ttiter_OUT plhs[0]
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray*prhs[] )
{
int maxiter, npart, nclass; // escalares int
unsigned int *partnode;
unsigned char *nsize;
unsigned short int *slabel;
unsigned int *nlist; // matrizes de int
double *ndist, *pot; // matrizes de double
int qtnode, neibmax;
double omega;
/* Check for proper number of arguments */
if (nrhs != 10) {
mexErrMsgTxt("10 argumentos de entrada requeridos.");
} else if (nlhs > 1) {
mexErrMsgTxt("Only 1 output argument allowed.");
}
maxiter = (int) mxGetScalar(maxiter_IN);
npart = (int) mxGetScalar(npart_IN);
nclass = (int) mxGetScalar(nclass_IN);
omega = mxGetScalar(omega_IN);
partnode = (unsigned int *) mxGetData(partnode_IN);
slabel = (unsigned short int *) mxGetData(slabel_IN);
nsize = (unsigned char *) mxGetData(nsize_IN);
nlist = (unsigned int *) mxGetData(nlist_IN);
ndist = mxGetPr(ndist_IN);
pot = mxGetPr(pot_IN);
qtnode = (int) mxGetM(slabel_IN);
neibmax = (int) mxGetN(nlist_IN);
// non-Windows users should probably use /dev/random or /dev/urandom instead of rand_s
//unsigned int seed;
//errno_t err;
//err = rand_s(&seed);
//if (err != 0) printf_s("The rand_s function failed!\n");
//srand(seed);
double maxmmpot = 0;
double *prob = malloc(sizeof(double)*neibmax); // vetor de probabilidades de visitar vizinho
double *nc = malloc(sizeof(double)*nclass);
double *newpot = malloc(sizeof(double)*qtnode*nclass);
for(int i=0; i<qtnode*nclass; i++) newpot[i]=pot[i];
bool *labeled = malloc(sizeof(bool)*npart);
for(int i=0; i<npart; i++) labeled[i]=false;
int labeledc = 0;
int i;
for(i=0; i<maxiter; i++)
{
for(int j=0; j<npart; j++)
{
for(int i2=0; i2<nclass; i2++) nc[i2]=0;
double sumweight=0;
for(int i2=0; i2<nsize[partnode[j]-1]; i2++)
{
for(int i3=0; i3<nclass; i3++)
nc[i3] = nc[i3] + pot[(i3*qtnode + nlist[(i2*qtnode + partnode[j]-1)]-1)] * ndist[(i2*qtnode + partnode[j]-1)];
sumweight += ndist[(i2*qtnode + partnode[j]-1)];
}
for(int i2=0; i2<nclass; i2++)
newpot[(i2*qtnode + partnode[j]-1)] = nc[i2] / sumweight;
}
for(int j=0; j<npart; j++)
for(int i2=0; i2<nclass; i2++)
pot[(i2*qtnode + partnode[j]-1)] = newpot[(i2*qtnode + partnode[j]-1)];
if (i % 10 == 0)
{
double mmpot = 0;
for(int i2=0; i2<qtnode; i2++)
{
double mpot=0;
for(int i3=0; i3<nclass; i3++)
if(pot[i3*qtnode + i2]>mpot) mpot = pot[i3*qtnode + i2];
mmpot += mpot;
}
mmpot /= qtnode;
// if (i % 10000 == 0)
// {
// printf("Iter: %i Meanpot: %0.4f\n",i,mmpot);
// mexEvalString("drawnow");
// }
if (mmpot - maxmmpot > omega) maxmmpot = mmpot;
else break;
}
}
free(prob);
free(nc);
free(newpot);
free(labeled);
ph2_ttiter_OUT = mxCreateDoubleScalar(i);
return;
}
example.m
% This is an usage example of the Interactive Image Segmentation using
% Label Propagation through Complex Networks method.
%
% Loading example image
img = imread('ralph.jpg');
% Loading scribbles image
imgslab = imread('ralph-scribble.png');
% Loading ground-truth image
gt = imread('ralph-gt.png');
% Calling method to segment the image with default parameters
disp('Running image segmentation...');
tStart = tic;
[owner, pot] = lpcn(img, imgslab);
tElapsed = toc(tStart);
% Converting output to image
imgres = own2img(owner,img,0);
% Calculating error rate
y = imgeval(imgres, gt, imgslab);
% Displaying numerical results
fprintf('Error Rate: %0.4f - Execution Time: %0.4fs\n',y,tElapsed);
% Applying mask to the original image
imgres3 = repmat(imgres,1,1,3)./255;
imgseg = img .* imgres3;
imgseg(imgres3==0)=255;
% Showing segmentation results
figure('units','normalized','outerposition',[0 0 1 1])
imgslabmix = imread('ralph-scribblemix.jpg');
subplot(2,3,1), imshow(img), title('Original image'),
subplot(2,3,2), imshow(imgslab), title('Scribbles (user-input)'),
subplot(2,3,3), imshow(imgslabmix), title('Scribbles overlaying original image'),
subplot(2,3,4), imshow(gt), title('Ground-truth'),
subplot(2,3,5), imshow(imgres), title('Segmentation results (mask)'),
subplot(2,3,6), imshow(imgseg); title('Segmentation results (extracted foreground)'),
本文分享自 图像处理与模式识别研究所 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!