00001 #include "mitkBoundingObjectToSegmentationFilter.h" 00002 #include "mitkImageCast.h" 00003 00004 mitk::BoundingObjectToSegmentationFilter::BoundingObjectToSegmentationFilter() 00005 { 00006 this->SetNumberOfRequiredInputs(1); 00007 00008 } 00009 00010 mitk::BoundingObjectToSegmentationFilter::~BoundingObjectToSegmentationFilter() 00011 { 00012 00013 } 00014 00015 void mitk::BoundingObjectToSegmentationFilter::SetBoundingObject(mitk::BoundingObject::Pointer boundingObject) 00016 { 00017 mitk::BoundingObjectGroup* testgroup = dynamic_cast<mitk::BoundingObjectGroup*> (boundingObject.GetPointer()); 00018 if (testgroup) 00019 m_boundingObjectGroup = testgroup; 00020 else 00021 { 00022 m_boundingObjectGroup = mitk::BoundingObjectGroup::New(); 00023 m_boundingObjectGroup->AddBoundingObject(boundingObject); 00024 } 00025 } 00026 00027 void mitk::BoundingObjectToSegmentationFilter::GenerateData() 00028 { 00029 typedef itk::Image<unsigned char, 3> itkImageType; 00030 mitk::Image::Pointer outputImage = this->GetOutput(); 00031 mitk::Image::Pointer inputImage = const_cast<mitk::Image*> (this->GetInput()); 00032 outputImage->Initialize(this->GetInput()); 00033 00034 itkImageType::Pointer itkImage; 00035 CastToItkImage(outputImage, itkImage); 00036 itkImage->FillBuffer(0); 00037 00038 for (unsigned int i=0; i<m_boundingObjectGroup->GetCount(); i++) 00039 { 00040 //create region for boundingobject 00041 mitk::BoundingObject* boundingObject = m_boundingObjectGroup->GetBoundingObjects().at(i); 00042 mitk::Geometry3D* boGeometry = boundingObject->GetGeometry(); 00043 mitk::Geometry3D* inputImageGeometry = inputImage->GetSlicedGeometry(); 00044 mitk::BoundingBox::Pointer boToIm = boGeometry->CalculateBoundingBoxRelativeToTransform(inputImageGeometry->GetIndexToWorldTransform()); 00045 00046 itkImageType::IndexType boIndex; 00047 mitk::BoundingBox::PointType min = boToIm->GetMinimum(); 00048 boIndex[0] = (mitk::SlicedData::IndexType::IndexValueType)(min[0]); 00049 boIndex[1] = (mitk::SlicedData::IndexType::IndexValueType)(min[1]); 00050 boIndex[2] = (mitk::SlicedData::IndexType::IndexValueType)(min[2]); 00051 00052 00053 itkImageType::SizeType boSize; 00054 mitk::BoundingBox::PointType max = boToIm->GetMaximum(); 00055 boSize[0] = (mitk::SlicedData::IndexType::IndexValueType) (max[0]-min[0]+1); 00056 boSize[1] = (mitk::SlicedData::IndexType::IndexValueType) (max[1]-min[1]+1); 00057 boSize[2] = (mitk::SlicedData::IndexType::IndexValueType) (max[2]-min[2]+1); 00058 00059 itkImageType::RegionType region(boIndex, boSize); 00060 00061 //create region iterator 00062 itk::ImageRegionIteratorWithIndex<itkImageType> itBoundingObject = itk::ImageRegionIteratorWithIndex<itkImageType>(itkImage, region ); 00063 itBoundingObject.GoToBegin(); 00064 00065 while(!itBoundingObject.IsAtEnd()) 00066 { 00067 itkImageType::IndexType index = itBoundingObject.GetIndex(); 00068 mitk::Point3D p; 00069 p[0] = index[0]; 00070 p[1] = index[1]; 00071 p[2] = index[2]; 00072 inputImageGeometry->IndexToWorld(p,p); 00073 00074 if (boundingObject->IsInside(p) && boundingObject->GetPositive()) 00075 itBoundingObject.Set(1); 00076 else if (boundingObject->IsInside(p) && !boundingObject->GetPositive()) 00077 itBoundingObject.Set(0); 00078 00079 ++itBoundingObject; 00080 } 00081 } 00082 CastToMitkImage(itkImage, outputImage); 00083 }