#include <queue>#include "ipSegmentation.h"Go to the source code of this file.
Functions | |
| mitkIpPicDescriptor * | ipMITKSegmentationCreateGrowerHistory (mitkIpPicDescriptor *seg, int startOfs, mitkIpPicDescriptor *histBuffer) |
| mitkIpPicDescriptor* ipMITKSegmentationCreateGrowerHistory | ( | mitkIpPicDescriptor * | seg, |
| int | startOfs, | ||
| mitkIpPicDescriptor * | histBuffer | ||
| ) |
Creates a grower history (i.e. the order in which a region grower would have segmented the area) of the given segmentation, origin of the grower is startOfs. histBuffer must be a 16bit unsigned int or 0, in the latter case the pic is created.
Definition at line 23 of file ipSegmentationGrowerHistory.cpp.
References int(), and mitkIpPicDescriptor.
Referenced by mitk::RegionGrowingTool::OnMousePressedInside().
{
std::queue<int> ofsQueue;
if (!seg) return 0;
if (!histBuffer) {
histBuffer = mitkIpPicCopyHeader( seg, histBuffer );
histBuffer->type = mitkIpPicUInt;
histBuffer->bpe = 16;
mitkIpUInt4_t size = _mitkIpPicSize( histBuffer );
histBuffer->data = malloc( size );
memset( histBuffer->data, 0, size ); // clear buffer
}
else {
// check if dimension of histBuffer is valid, if not: change it!
if (histBuffer->n[0] != seg->n[0] || histBuffer->n[1] != seg->n[1]) {
histBuffer->n[0] = seg->n[0];
histBuffer->n[1] = seg->n[1];
mitkIpUInt4_t size = _mitkIpPicSize( histBuffer );
histBuffer->data = realloc( histBuffer->data, size );
if (histBuffer->data == 0) return 0;
memset( histBuffer->data, 0, size ); // clear buffer
}
}
// create a clear buffer to check wether a point has already been visited
// (seg cannot be modifier and histBuffer can contain any value)
mitkIpPicDescriptor *flagBuffer = mitkIpPicCopyHeader( seg, 0 );
mitkIpUInt4_t size = _mitkIpPicSize( flagBuffer );
flagBuffer->data = malloc( size );
memset( flagBuffer->data, 0, size );
*((mitkIpUInt1_t*)flagBuffer->data+startOfs) = 1; // flag pixel as visited
int line = seg->n[0];
int maxOfs = (int)(line * seg->n[1]);
int testOfs;
mitkIpUInt1_t segVal, flagVal;
int iteration = 0;
int currentWave = 1;
int nextWave = 0;
ofsQueue.push( startOfs );
while (!ofsQueue.empty()) {
int nextOfs = ofsQueue.front();
ofsQueue.pop();
currentWave--;
*((mitkIpUInt2_t*)histBuffer->data+nextOfs) = (mitkIpUInt2_t)(iteration+1); // seed point should get history = 1
// check right:
testOfs = nextOfs+1;
if (testOfs%line!=0) {
segVal = *((mitkIpUInt1_t*)seg->data+testOfs);
flagVal = *((mitkIpUInt1_t*)flagBuffer->data+testOfs);
if ( segVal != 0 && flagVal == 0) {
ofsQueue.push( testOfs );
*((mitkIpUInt1_t*)flagBuffer->data+testOfs) = 1; // flag pixel as visited
nextWave++;
}
}
// check top:
testOfs = nextOfs-line;
if (testOfs > 0) {
segVal = *((mitkIpUInt1_t*)seg->data+testOfs);
flagVal = *((mitkIpUInt1_t*)flagBuffer->data+testOfs);
if ( segVal != 0 && flagVal == 0) {
ofsQueue.push( testOfs );
*((mitkIpUInt1_t*)flagBuffer->data+testOfs) = 1; // flag pixel as visited
nextWave++;
}
}
// check left:
testOfs = nextOfs-1;
if (nextOfs%line!=0) {
segVal = *((mitkIpUInt1_t*)seg->data+testOfs);
flagVal = *((mitkIpUInt1_t*)flagBuffer->data+testOfs);
if ( segVal != 0 && flagVal == 0) {
ofsQueue.push( testOfs );
*((mitkIpUInt1_t*)flagBuffer->data+testOfs) = 1; // flag pixel as visited
nextWave++;
}
}
// check bottom:
testOfs = nextOfs+line;
if (testOfs < maxOfs) {
segVal = *((mitkIpUInt1_t*)seg->data+testOfs);
flagVal = *((mitkIpUInt1_t*)flagBuffer->data+testOfs);
if ( segVal != 0 && flagVal == 0) {
ofsQueue.push( testOfs );
*((mitkIpUInt1_t*)flagBuffer->data+testOfs) = 1; // flag pixel as visited
nextWave++;
}
}
// check for number of iterations:
if (currentWave == 0) {
currentWave = nextWave;
nextWave = 0;
iteration++;
}
}
mitkIpPicFree( flagBuffer );
return histBuffer;
}
1.7.2