int main(int argc, char **argv) { if(argc <5) { std::cout<<"Usage: mixture_segment <MixtureLabelImageFileName> <OutputMixtureLabelImageFileName> <volume1> <volume2>\n"; return 0; } // read the parameters // std::string ifName = argv[1]; std::string ofName = argv[2]; unsigned int volume1 = atoi(argv[3]); // minimum area1 of the large components unsigned int volume2 = atoi(argv[4]); // minimum area2 of the small components ( heads of the cells ) printf("volume1: %d\t",volume1); printf("volume2: %d\n",volume2); // read input image: LabelImageType::Pointer mixtureLabelImage = readImage<LabelImageType>(ifName.c_str()); LabelPixelType nr = mixtureLabelImage->GetLargestPossibleRegion().GetSize()[0]; LabelPixelType nc = mixtureLabelImage->GetLargestPossibleRegion().GetSize()[1]; LabelPixelType ns = mixtureLabelImage->GetLargestPossibleRegion().GetSize()[2]; LabelPixelType * mixtureLabelImagePtr = mixtureLabelImage->GetBufferPointer(); //generate label image LabelImageType::SizeType size; size[0] = nr; size[1] = nc; size[2] = ns; LabelImageType::Pointer outputImage = GetITKImageOfSize<LabelImageType>(size); LabelPixelType * outputImagePtr = outputImage->GetBufferPointer(); // parameters for 2D image LabelImageType::SizeType sz2; sz2[0] = nr; sz2[1] = nc; sz2[2] = 1; unsigned int sz = nr*nc; //bool FoundLabel = true; omp_set_num_threads(1); itk::MultiThreader::SetGlobalDefaultNumberOfThreads(1); #pragma omp parallel for num_threads(80) for(size_t t = 0; t<ns; ++t) { LabelImageType::Pointer output2DImage = GetITKImageOfSize<LabelImageType>(sz2); LabelPixelType * output2DImagePtr = output2DImage->GetBufferPointer(); unsigned int i; LabelImageType::Pointer binaryLabelImage = GetITKImageOfSize<LabelImageType>(sz2); LabelPixelType * binaryLabelImagePtr = binaryLabelImage->GetBufferPointer(); size_t offset = t*((nr*nc)); // first mixture for(i = 0; i < sz; ++i) { if(mixtureLabelImagePtr[i+offset]>0) { binaryLabelImagePtr[i] = 1; //printf("set pixel to one\n"); } else { binaryLabelImagePtr[i] = 0; } } // well size is 90x90: if any of the connected components is larger than that it meas something went wrong with the segmnetation // bool isEmpty = CleanImage(binaryLabelImage,6000); bool isEmpty = false; if(!isEmpty) { RemoveSmallComponents(binaryLabelImage, volume1); // copy the clean image to the output for(i = 0; i < sz; ++i) { if(binaryLabelImagePtr[i]>0) { output2DImagePtr[i] +=1; //printf("added\n"); } } // second mixture for(i = 0; i < sz; ++i) { if(mixtureLabelImagePtr[i+offset]>1) { binaryLabelImagePtr[i] = 1; } else { binaryLabelImagePtr[i] = 0; } } RemoveSmallComponents(binaryLabelImage, volume2); // copy the clean image to the output for(i = 0; i < sz; ++i) { if(binaryLabelImagePtr[i]>0) { output2DImagePtr[i] +=1; //printf("added2\n"); } } }// end of if statement for(i=0 ; i<sz ; ++i) outputImagePtr[i+offset] = output2DImagePtr[i]; } // end of time loop writeImage<LabelImageType>(outputImage, ofName.c_str()); return 0; }