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
00019 #include "mitkAngleCorrectByPointFilter.h"
00020 #include "mitkImageTimeSelector.h"
00021 #include "mitkProperties.h"
00022
00023 mitk::AngleCorrectByPointFilter::AngleCorrectByPointFilter() : m_PreferTransducerPositionFromProperty(true)
00024 {
00025 m_Center.Fill(0);
00026 m_TransducerPosition.Fill(0);
00027 }
00028
00029 mitk::AngleCorrectByPointFilter::~AngleCorrectByPointFilter()
00030 {
00031
00032 }
00033
00034 void mitk::AngleCorrectByPointFilter::GenerateOutputInformation()
00035 {
00036 mitk::Image::ConstPointer input = this->GetInput();
00037 mitk::Image::Pointer output = this->GetOutput();
00038
00039 if ((output->IsInitialized()) && (this->GetMTime() <= m_TimeOfHeaderInitialization.GetMTime()))
00040 return;
00041
00042 itkDebugMacro(<<"GenerateOutputInformation()");
00043
00044 unsigned int i;
00045 unsigned int *tmpDimensions = new unsigned int[input->GetDimension()];
00046
00047 for(i=0;i<input->GetDimension();++i)
00048 tmpDimensions[i]=input->GetDimension(i);
00049
00050
00051 output->Initialize(PixelType(typeid(ScalarType)),
00052 input->GetDimension(),
00053 tmpDimensions,
00054 input->GetNumberOfChannels());
00055
00056 output->GetSlicedGeometry()->SetSpacing(input->GetSlicedGeometry()->GetSpacing());
00057
00058
00059
00060
00061
00062 output->GetSlicedGeometry()->SetTimeBounds(input->GetSlicedGeometry()->GetTimeBounds());
00063
00064 output->GetTimeSlicedGeometry()->InitializeEvenlyTimed(output->GetSlicedGeometry(), output->GetTimeSlicedGeometry()->GetTimeSteps());
00065
00066 output->SetPropertyList(input->GetPropertyList()->Clone());
00067
00068
00069 delete [] tmpDimensions;
00070
00071 m_TimeOfHeaderInitialization.Modified();
00072 }
00073
00074 void mitk::AngleCorrectByPointFilter::GenerateData()
00075 {
00076 mitk::Image::ConstPointer input = this->GetInput();
00077 mitk::Image::Pointer output = this->GetOutput();
00078
00079
00080 if(m_PreferTransducerPositionFromProperty)
00081 {
00082 mitk::Point3iProperty::Pointer pointProp;
00083 pointProp = dynamic_cast<mitk::Point3iProperty*>(input->GetProperty("ORIGIN").GetPointer());
00084 if (pointProp.IsNotNull() )
00085 {
00086 const itk::Point<int, 3> & p = pointProp->GetValue();
00087 m_TransducerPosition[0] = p[0];
00088 m_TransducerPosition[1] = p[1];
00089 m_TransducerPosition[2] = p[2];
00090 }
00091 }
00092
00093 itkDebugMacro( << "compute angle corrected image .... " );
00094 itkDebugMacro( << " Center[0]=" << m_Center[0] << " Center[1]=" << m_Center[1] << " Center[2]=" << m_Center[2] );
00095 itkDebugMacro( << " TransducerPosition[0]=" << m_TransducerPosition[0] << " TransducerPosition[1]=" << m_TransducerPosition[1] << " TransducerPosition[2]=" << m_TransducerPosition[2] );
00096
00097 const Vector3D & spacing = input->GetSlicedGeometry()->GetSpacing();
00098
00099
00100 if((spacing[0]!=spacing[1]) || (spacing[0]!=spacing[2]))
00101 {
00102 itkExceptionMacro("filter does not work for uninsotropic data: spacing: ("<< spacing[0] << "," << spacing[1] << "," << spacing[2] << ")");
00103 }
00104
00105 Vector3D p;
00106 Vector3D tx_direction;
00107 Vector3D tx_position = m_TransducerPosition.GetVectorFromOrigin();
00108 Vector3D center = m_Center.GetVectorFromOrigin();
00109 Vector3D assumed_direction;
00110 ScalarType &x=p[0];
00111 ScalarType &y=p[1];
00112 ScalarType &z=p[2];
00113 Vector3D down;
00114 FillVector3D(down,0.0,0.0,-1.0);
00115
00116 int xDim = input->GetDimension(0);
00117 int yDim = input->GetDimension(1);
00118 int zDim = input->GetDimension(2);
00119
00120 mitkIpPicDescriptor* pic_out;
00121 pic_out = mitkIpPicNew();
00122 pic_out->dim = 3;
00123 pic_out->bpe = output->GetPixelType().GetBpe();
00124 pic_out->type = output->GetPixelType().GetType();
00125 pic_out->n[0] = xDim;
00126 pic_out->n[1] = yDim;
00127 pic_out->n[2] = zDim;
00128 pic_out->data = malloc(_mitkIpPicSize(pic_out));
00129
00130
00131 mitk::ImageTimeSelector::Pointer timeSelector=mitk::ImageTimeSelector::New();
00132 timeSelector->SetInput(input);
00133
00134 int nstart, nmax;
00135 int tstart, tmax;
00136
00137 tstart=output->GetRequestedRegion().GetIndex(3);
00138 nstart=output->GetRequestedRegion().GetIndex(4);
00139
00140 tmax=tstart+output->GetRequestedRegion().GetSize(3);
00141 nmax=nstart+output->GetRequestedRegion().GetSize(4);
00142
00143 int n,t;
00144 for(n=nstart;n<nmax;++n)
00145 {
00146 timeSelector->SetChannelNr(n);
00147
00148 for(t=tstart;t<tmax;++t)
00149 {
00150 timeSelector->SetTimeNr(t);
00151
00152 timeSelector->Update();
00153
00154 typedef unsigned char InputImagePixelType;
00155 typedef ScalarType OutputImagePixelType;
00156
00157 if(*input->GetPixelType().GetTypeId()!=typeid(InputImagePixelType))
00158 {
00159 itkExceptionMacro("only implemented for " << typeid(PixelType).name() );
00160 }
00161
00162 InputImagePixelType *in;
00163 OutputImagePixelType *out;
00164
00165 in = (InputImagePixelType *)timeSelector->GetOutput()->GetData();
00166 out = (OutputImagePixelType*)pic_out->data;
00167
00168 for (z=0 ; z<zDim ; ++z)
00169 {
00170 for (y=0; y<yDim; ++y)
00171 {
00172 for (x=0; x<xDim; ++x, ++in, ++out)
00173 {
00174 tx_direction = tx_position-p;
00175 tx_direction.Normalize();
00176
00177
00178
00179 {
00180 assumed_direction = center-p;
00181 assumed_direction.Normalize();
00182 ScalarType cos_factor = tx_direction*assumed_direction;
00183
00184 if(fabs(cos_factor)>eps)
00185 *out=((ScalarType)(*in)-128.0)/cos_factor;
00186 else
00187 *out=((ScalarType)(*in)-128.0)/eps;
00188 }
00189
00190
00191 }
00192 }
00193 }
00194 output->SetPicVolume(pic_out, t, n);
00195 }
00196 }
00197 }
00198
00199 void mitk::AngleCorrectByPointFilter::GenerateInputRequestedRegion()
00200 {
00201 Superclass::GenerateInputRequestedRegion();
00202
00203 mitk::ImageToImageFilter::InputImagePointer input =
00204 const_cast< mitk::ImageToImageFilter::InputImageType * > ( this->GetInput() );
00205 mitk::Image::Pointer output = this->GetOutput();
00206
00207 Image::RegionType requestedRegion;
00208 requestedRegion = output->GetRequestedRegion();
00209 requestedRegion.SetIndex(0, 0);
00210 requestedRegion.SetIndex(1, 0);
00211 requestedRegion.SetIndex(2, 0);
00212
00213
00214 requestedRegion.SetSize(0, input->GetDimension(0));
00215 requestedRegion.SetSize(1, input->GetDimension(1));
00216 requestedRegion.SetSize(2, input->GetDimension(2));
00217
00218
00219
00220 input->SetRequestedRegion( & requestedRegion );
00221 }