00001 #include "QmitkAutocropAction.h" 00002 00003 #include "mitkAutoCropImageFilter.h" 00004 #include "mitkImageCast.h" 00005 00006 #include "mitkProgressBar.h" 00007 00008 #include <itkConstantPadImageFilter.h> 00009 00010 //needed for qApp 00011 #include <qcoreapplication.h> 00012 00013 QmitkAutocropAction::QmitkAutocropAction() 00014 { 00015 } 00016 00017 QmitkAutocropAction::~QmitkAutocropAction() 00018 { 00019 } 00020 00021 void QmitkAutocropAction::Run( const std::vector<mitk::DataNode*>& selectedNodes ) 00022 { 00023 NodeList selection = selectedNodes; 00024 00025 for ( NodeList::iterator iter = selection.begin(); iter != selection.end(); ++iter ) 00026 { 00027 mitk::DataNode* node = *iter; 00028 00029 if (node) 00030 { 00031 mitk::Image::Pointer image = dynamic_cast<mitk::Image*>( node->GetData() ); 00032 if (image.IsNull()) return; 00033 00034 mitk::ProgressBar::GetInstance()->AddStepsToDo(10); 00035 mitk::ProgressBar::GetInstance()->Progress(2); 00036 00037 qApp->processEvents(); 00038 00039 mitk::AutoCropImageFilter::Pointer cropFilter = mitk::AutoCropImageFilter::New(); 00040 cropFilter->SetInput( image ); 00041 cropFilter->SetBackgroundValue( 0 ); 00042 try 00043 { 00044 cropFilter->Update(); 00045 00046 image = cropFilter->GetOutput(); 00047 00048 if (image.IsNotNull()) 00049 { 00050 node->SetData( this->IncreaseCroppedImageSize(image) ); // bug fix 3145 00051 } 00052 } 00053 catch(...) 00054 { 00055 MITK_ERROR << "Cropping image failed..."; 00056 } 00057 mitk::ProgressBar::GetInstance()->Progress(8); 00058 } 00059 else 00060 { 00061 MITK_INFO << " a NULL node selected"; 00062 } 00063 } 00064 } 00065 00066 mitk::Image::Pointer QmitkAutocropAction::IncreaseCroppedImageSize( mitk::Image::Pointer image ) 00067 { 00068 typedef itk::Image< short, 3 > ImageType; 00069 typedef itk::Image< unsigned char, 3 > PADOutputImageType; 00070 ImageType::Pointer itkTransformImage = ImageType::New(); 00071 mitk::CastToItkImage( image, itkTransformImage ); 00072 00073 typedef itk::ConstantPadImageFilter< ImageType, PADOutputImageType > PadFilterType; 00074 PadFilterType::Pointer padFilter = PadFilterType::New(); 00075 00076 unsigned long upperPad[3]; 00077 unsigned long lowerPad[3]; 00078 int borderLiner = 6; 00079 00080 mitk::Point3D mitkOriginPoint; 00081 double origin[3]; 00082 origin[0]=0; 00083 origin[1]=0; 00084 origin[2]=0; 00085 itkTransformImage->SetOrigin(origin); 00086 00087 lowerPad[0]=borderLiner/2; 00088 lowerPad[1]=borderLiner/2; 00089 lowerPad[2]=borderLiner/2; 00090 00091 upperPad[0]=borderLiner/2; 00092 upperPad[1]=borderLiner/2; 00093 upperPad[2]=borderLiner/2; 00094 00095 padFilter->SetInput(itkTransformImage); 00096 padFilter->SetConstant(0); 00097 padFilter->SetPadUpperBound(upperPad); 00098 padFilter->SetPadLowerBound(lowerPad); 00099 padFilter->UpdateLargestPossibleRegion(); 00100 00101 00102 mitk::Image::Pointer paddedImage = mitk::Image::New(); 00103 mitk::CastToMitkImage(padFilter->GetOutput(), paddedImage); 00104 00105 paddedImage->SetGeometry(image->GetGeometry()); 00106 00107 //calculate translation vector according to padding to get the new origin 00108 mitk::Vector3D transVector = image->GetGeometry()->GetSpacing(); 00109 transVector[0] = -(borderLiner/2); 00110 transVector[1] = -(borderLiner/2); 00111 transVector[2] = -(borderLiner/2); 00112 00113 mitk::Vector3D newTransVectorInmm = image->GetGeometry()->GetSpacing(); 00114 00115 image->GetGeometry()->IndexToWorld(mitkOriginPoint, transVector, newTransVectorInmm); 00116 paddedImage->GetGeometry()->Translate(newTransVectorInmm); 00117 //paddedImage->SetRequestedRegionToLargestPossibleRegion(); 00118 00119 return paddedImage; 00120 } 00121 00122 void QmitkAutocropAction::SetSmoothed(bool smoothed) 00123 { 00124 //not needed 00125 } 00126 00127 void QmitkAutocropAction::SetDataStorage(mitk::DataStorage* dataStorage) 00128 { 00129 //not needed 00130 } 00131 00132 void QmitkAutocropAction::SetFunctionality(berry::QtViewPart *functionality) 00133 { 00134 //not needed 00135 }