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 int
00022 ipMITKSegmentationReplaceRegion4N( mitkIpPicDescriptor *seg, int startOfs, mitkIpInt1_t newValue )
00023 {
00024 mitkIpPicTSV_t* tag;
00025
00026 std::queue<int> ofsQueue;
00027
00028 if (ipMITKSegmentationUndoIsEnabled (seg)) {
00029 ipMITKSegmentationUndoSave (seg);
00030 }
00031 tag = mitkIpPicDelTag (seg, tagSEGMENTATION_EMPTY);
00032 if (tag) {
00033 mitkIpPicFreeTag (tag);
00034 }
00035
00036 if (seg->bpe != 8) return 0;
00037
00038 int line = seg->n[0];
00039 int maxOfs = (int)(line * seg->n[1]);
00040 int testOfs;
00041 mitkIpInt1_t replaceMe = *((mitkIpInt1_t*)seg->data + startOfs);
00042 if (replaceMe == newValue) return 0;
00043
00044 mitkIpInt1_t segVal;
00045 ofsQueue.push( startOfs );
00046 *((mitkIpInt1_t*)seg->data+startOfs) = newValue;
00047 int regionSize = 0;
00048
00049 while (!ofsQueue.empty()) {
00050 int nextOfs = ofsQueue.front();
00051 ofsQueue.pop();
00052 regionSize++;
00053
00054 testOfs = nextOfs+1;
00055 if (testOfs%line!=0) {
00056 segVal = *((mitkIpInt1_t*)seg->data+testOfs);
00057 if ( segVal == replaceMe ) {
00058 ofsQueue.push( testOfs );
00059 *((mitkIpInt1_t*)seg->data+testOfs) = newValue;
00060 }
00061 }
00062
00063 testOfs = nextOfs-line;
00064 if (testOfs >= 0) {
00065 segVal = *((mitkIpInt1_t*)seg->data+testOfs);
00066 if ( segVal == replaceMe ) {
00067 ofsQueue.push( testOfs );
00068 *((mitkIpInt1_t*)seg->data+testOfs) = newValue;
00069 }
00070 }
00071
00072 testOfs = nextOfs-1;
00073 if (nextOfs%line!=0) {
00074 segVal = *((mitkIpInt1_t*)seg->data+testOfs);
00075 if ( segVal == replaceMe ) {
00076 ofsQueue.push( testOfs );
00077 *((mitkIpInt1_t*)seg->data+testOfs) = newValue;
00078 }
00079 }
00080
00081 testOfs = nextOfs+line;
00082 if (testOfs < maxOfs) {
00083 segVal = *((mitkIpInt1_t*)seg->data+testOfs);
00084 if ( segVal == replaceMe ) {
00085 ofsQueue.push( testOfs );
00086 *((mitkIpInt1_t*)seg->data+testOfs) = newValue;
00087 }
00088 }
00089 }
00090 return regionSize;
00091 }