Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <queue>
00019 #include "ipSegmentation.h"
00020
00021
00022 mitkIpPicDescriptor*
00023 ipMITKSegmentationCreateGrowerHistory( mitkIpPicDescriptor *seg, int startOfs, mitkIpPicDescriptor *histBuffer )
00024 {
00025 std::queue<int> ofsQueue;
00026
00027 if (!seg) return 0;
00028 if (!histBuffer) {
00029 histBuffer = mitkIpPicCopyHeader( seg, histBuffer );
00030 histBuffer->type = mitkIpPicUInt;
00031 histBuffer->bpe = 16;
00032 mitkIpUInt4_t size = _mitkIpPicSize( histBuffer );
00033 histBuffer->data = malloc( size );
00034 memset( histBuffer->data, 0, size );
00035 }
00036 else {
00037
00038 if (histBuffer->n[0] != seg->n[0] || histBuffer->n[1] != seg->n[1]) {
00039 histBuffer->n[0] = seg->n[0];
00040 histBuffer->n[1] = seg->n[1];
00041 mitkIpUInt4_t size = _mitkIpPicSize( histBuffer );
00042 histBuffer->data = realloc( histBuffer->data, size );
00043 if (histBuffer->data == 0) return 0;
00044 memset( histBuffer->data, 0, size );
00045 }
00046 }
00047
00048
00049
00050 mitkIpPicDescriptor *flagBuffer = mitkIpPicCopyHeader( seg, 0 );
00051 mitkIpUInt4_t size = _mitkIpPicSize( flagBuffer );
00052 flagBuffer->data = malloc( size );
00053 memset( flagBuffer->data, 0, size );
00054 *((mitkIpUInt1_t*)flagBuffer->data+startOfs) = 1;
00055
00056 int line = seg->n[0];
00057 int maxOfs = (int)(line * seg->n[1]);
00058 int testOfs;
00059 mitkIpUInt1_t segVal, flagVal;
00060 int iteration = 0;
00061 int currentWave = 1;
00062 int nextWave = 0;
00063
00064 ofsQueue.push( startOfs );
00065
00066 while (!ofsQueue.empty()) {
00067 int nextOfs = ofsQueue.front();
00068 ofsQueue.pop();
00069 currentWave--;
00070 *((mitkIpUInt2_t*)histBuffer->data+nextOfs) = (mitkIpUInt2_t)(iteration+1);
00071
00072
00073 testOfs = nextOfs+1;
00074 if (testOfs%line!=0) {
00075 segVal = *((mitkIpUInt1_t*)seg->data+testOfs);
00076 flagVal = *((mitkIpUInt1_t*)flagBuffer->data+testOfs);
00077 if ( segVal != 0 && flagVal == 0) {
00078 ofsQueue.push( testOfs );
00079 *((mitkIpUInt1_t*)flagBuffer->data+testOfs) = 1;
00080 nextWave++;
00081 }
00082 }
00083
00084 testOfs = nextOfs-line;
00085 if (testOfs > 0) {
00086 segVal = *((mitkIpUInt1_t*)seg->data+testOfs);
00087 flagVal = *((mitkIpUInt1_t*)flagBuffer->data+testOfs);
00088 if ( segVal != 0 && flagVal == 0) {
00089 ofsQueue.push( testOfs );
00090 *((mitkIpUInt1_t*)flagBuffer->data+testOfs) = 1;
00091 nextWave++;
00092 }
00093 }
00094
00095 testOfs = nextOfs-1;
00096 if (nextOfs%line!=0) {
00097 segVal = *((mitkIpUInt1_t*)seg->data+testOfs);
00098 flagVal = *((mitkIpUInt1_t*)flagBuffer->data+testOfs);
00099 if ( segVal != 0 && flagVal == 0) {
00100 ofsQueue.push( testOfs );
00101 *((mitkIpUInt1_t*)flagBuffer->data+testOfs) = 1;
00102 nextWave++;
00103 }
00104 }
00105
00106 testOfs = nextOfs+line;
00107 if (testOfs < maxOfs) {
00108 segVal = *((mitkIpUInt1_t*)seg->data+testOfs);
00109 flagVal = *((mitkIpUInt1_t*)flagBuffer->data+testOfs);
00110 if ( segVal != 0 && flagVal == 0) {
00111 ofsQueue.push( testOfs );
00112 *((mitkIpUInt1_t*)flagBuffer->data+testOfs) = 1;
00113 nextWave++;
00114 }
00115 }
00116
00117 if (currentWave == 0) {
00118 currentWave = nextWave;
00119 nextWave = 0;
00120 iteration++;
00121 }
00122 }
00123
00124 mitkIpPicFree( flagBuffer );
00125 return histBuffer;
00126 }