https://github.com/cran/spatstat
Tip revision: 97116a19ab5e4323b8c5566f016d2dc6d77b217b authored by Adrian Baddeley on 06 November 2009, 10:18:11 UTC
version 1.17-1
version 1.17-1
Tip revision: 97116a1
connect.c
/*
connected.c
Connected component transform of a discrete binary image
(8-connected topology)
$Revision: 1.1 $ $Date: 2009/05/14 03:48:40 $
*/
#include <math.h>
#include "raster.h"
void shape_raster();
void
comcommer(im)
Raster *im;
/* raster must have been dimensioned by shape_raster() */
/* Pixel values assumed to be 0 in background, and
distinct nonzero integers in foreground */
{
int j,k;
int rmin, rmax, cmin, cmax;
int label, curlabel, minlabel;
int nchanged;
/* image boundaries */
rmin = im->rmin;
rmax = im->rmax;
cmin = im->cmin;
cmax = im->cmax;
#define ENTRY(ROW, COL) Entry(*im, ROW, COL, int)
#define UPDATE(ROW,COL,BEST,NEW) \
NEW = ENTRY(ROW, COL); \
if(NEW != 0 && NEW < BEST) \
BEST = NEW
nchanged = 1;
while(nchanged >0) {
nchanged = 0;
for(j = rmin; j <= rmax; j++)
for(k = cmin; k <= cmax; k++) {
curlabel = ENTRY(j, k);
if(curlabel != 0) {
minlabel = curlabel;
UPDATE(j-1, k-1, minlabel, label);
UPDATE(j-1, k, minlabel, label);
UPDATE(j-1, k+1, minlabel, label);
UPDATE(j, k-1, minlabel, label);
UPDATE(j, k, minlabel, label);
UPDATE(j, k+1, minlabel, label);
UPDATE(j+1, k-1, minlabel, label);
UPDATE(j+1, k, minlabel, label);
UPDATE(j+1, k+1, minlabel, label);
if(minlabel < curlabel) {
ENTRY(j, k) = minlabel;
nchanged++;
}
}
}
}
}
/* R interface */
void concom(mat, nr, nc)
int *mat; /* input: binary image */
int *nr, *nc; /* raster dimensions
EXCLUDING margin of 1 on each side */
{
Raster im;
shape_raster( &im, (char *) mat,
(double) 1, (double) 1,
(double) *nc, (double) *nr,
*nr+2, *nc+2, 1, 1);
comcommer(&im);
}