3
* $Id: filtronulo.cpp 3526 2011-03-16 19:56:19Z carlos $
6
* Copyright 2008-10 MetaEmotion S.L. All rights reserved.
7
* http://ginkgo-cadx.com
9
* This file is licensed under LGPL v3 license.
10
* See License.txt for details
16
#include <vtkPointData.h>
17
#include <itkExceptionObject.h>
18
#include <itkImageRegionIterator.h>
19
#include <api/icontextoestudio.h>
22
GNC::FiltroNulo::FiltroNulo(Implementacion implementacion, bool filtro3D) : IFiltro(implementacion, filtro3D)
26
GNC::FiltroNulo::~FiltroNulo ()
31
void GNC::FiltroNulo::Configurar()
36
void GNC::FiltroNulo::Procesar(GNC::GCS::IVista* /*pVista*/)
38
vtkImageData* pImagenOriginal = NULL;
44
//pVista->AsignarConexionesDeFiltrado(&pImagenOriginal, &slice);
46
if (pImagenOriginal == NULL) {
50
m_pImagen = pImagenOriginal;
52
int* dims = m_pImagen->GetDimensions();
53
int numComponentes = m_pImagen->GetNumberOfScalarComponents();
56
if(implementacion == IF_ITK) {
57
double* spacing = m_pImagen->GetSpacing();
58
double* origin = m_pImagen->GetOrigin();
62
double tval[3] = {0.0f, 0.0f, 0.0f};
63
vtkDataArray* scalars = m_pImagen->GetPointData()->GetScalars();
64
unsigned long off = 0;
65
if (numComponentes == 1) {
66
TImagenITKIntensidad3D::Pointer entrada = TImagenITKIntensidad3D::New();
68
TImagenITKIntensidad3D::IndexType inputIndex;
73
TImagenITKIntensidad3D::SizeType inputSize;
74
inputSize[0] = dims[0];
75
inputSize[1] = dims[1];
76
inputSize[2] = dims[2];
78
TImagenITKIntensidad3D::RegionType regionEntrada;
79
regionEntrada.SetIndex(inputIndex);
80
regionEntrada.SetSize(inputSize);
82
entrada->SetRegions(regionEntrada);
84
double inputSpacing[3];
85
inputSpacing[0] = spacing[0];
86
inputSpacing[1] = spacing[1];
87
inputSpacing[2] = spacing[2];
89
entrada->SetSpacing(inputSpacing);
91
double inputOrigin[3];
92
inputOrigin[0] = origin[0];
93
inputOrigin[1] = origin[1];
94
inputOrigin[2] = origin[2];
96
entrada->SetOrigin(inputOrigin);
100
itk::ImageRegionIterator<TImagenITKIntensidad3D> itEntrada (entrada, regionEntrada);
103
for (itEntrada.GoToBegin(); !itEntrada.IsAtEnd(); ++itEntrada) {
104
scalars->GetTuple(off++, tval);
105
itEntrada.Set(tval[0]);
108
TImagenITKIntensidad3D::Pointer salida = ProcesarImagen(entrada);
110
if (salida.IsNull()) {
111
std::cerr << "Filtro Nulo. Accion ignorada." << std::endl;
117
TImagenITKIntensidad3D::RegionType regionSalida = salida->GetLargestPossibleRegion();
118
outputSize[0] = regionSalida.GetSize()[0];
119
outputSize[1] = regionSalida.GetSize()[1];
120
outputSize[2] = regionSalida.GetSize()[2];
122
if (outputSize[0] != dims[0] || outputSize[1] != dims[1] || outputSize[2] != dims[2]) {
123
std::cerr << "Error. El filtro ha modicado las dimensiones de la imagen. Accion ignorada." << std::endl;
127
TImagenITKIntensidad3D::SpacingType outputSpacingitk = salida->GetSpacing();
128
double outputSpacingvtk[3];
130
outputSpacingvtk[0] = outputSpacingitk[0];
131
outputSpacingvtk[1] = outputSpacingitk[1];
132
outputSpacingvtk[2] = spacing[2];
133
m_pImagen->SetSpacing(outputSpacingvtk);
135
TImagenITKIntensidad3D::PointType outputOriginitk = salida->GetOrigin();
136
double outputOriginvtk[3];
137
outputOriginvtk[0] = outputOriginitk[0];
138
outputOriginvtk[1] = outputOriginitk[1];
139
outputOriginvtk[2] = outputOriginitk[2];
140
m_pImagen->SetOrigin(outputOriginvtk);
142
itk::ImageRegionIterator<TImagenITKIntensidad3D> itSalida (salida, regionSalida);
144
for (itSalida.GoToBegin(); !itSalida.IsAtEnd(); ++itSalida) {
145
tval[0] = itSalida.Get();
146
scalars->SetTuple(off++, tval);
152
else if (numComponentes == 3) {
157
std::cerr << "Error al aplicar el filtro 3D: Numero de componentes no soportado. Accion ignorada" << std::endl;
162
else if (implementacion == IF_MEF) {
163
std::cerr << "Error al procesar: MEF no soporta imagenes 3D." << std::endl;
172
if (implementacion == IF_ITK) {
174
if (slice > dims[2]) {
176
std::cerr << "Error: No se pudo aplicar el filtro. Indice de slice fuera de rango" << std::endl;
185
sliceEnd = slice + 1;
188
for (slice = sliceStart; slice < sliceEnd; ++slice) {
190
double* spacing = m_pImagen->GetSpacing();
191
double* origin = m_pImagen->GetOrigin();
193
double tval[3] = {0.0f, 0.0f, 0.0f};
194
vtkDataArray* scalars = m_pImagen->GetPointData()->GetScalars();
195
unsigned long off = 0;
196
if (numComponentes == 1) {
198
TImagenITKIntensidad2D::Pointer entrada = TImagenITKIntensidad2D::New();
200
TImagenITKIntensidad2D::IndexType inputIndex;
204
TImagenITKIntensidad2D::SizeType inputSize;
205
inputSize[0] = dims[0];
206
inputSize[1] = dims[1];
208
TImagenITKIntensidad2D::RegionType regionEntrada;
209
regionEntrada.SetIndex(inputIndex);
210
regionEntrada.SetSize(inputSize);
212
entrada->SetRegions(regionEntrada);
214
double inputSpacing[2];
215
inputSpacing[0] = spacing[0];
216
inputSpacing[1] = spacing[1];
218
entrada->SetSpacing(inputSpacing);
220
double inputOrigin[2];
221
inputOrigin[0] = origin[0];
222
inputOrigin[1] = origin[1];
224
entrada->SetOrigin(inputOrigin);
228
itk::ImageRegionIterator<TImagenITKIntensidad2D> itEntrada (entrada, regionEntrada);
230
off = dims[0] * dims[1] * slice;
231
for (itEntrada.GoToBegin(); !itEntrada.IsAtEnd(); ++itEntrada) {
232
scalars->GetTuple(off++, tval);
233
itEntrada.Set(tval[0]);
236
TImagenITKIntensidad2D::Pointer salida = ProcesarImagen(entrada);
238
if (salida.IsNull()) {
239
std::cerr << "Filtro Nulo. Accion ignorada." << std::endl;
245
TImagenITKIntensidad2D::RegionType regionSalida = salida->GetLargestPossibleRegion();
246
outputSize[0] = regionSalida.GetSize()[0];
247
outputSize[1] = regionSalida.GetSize()[1];
249
if (outputSize[0] != dims[0] || outputSize[1] != dims[1]) {
250
std::cerr << "Error. El filtro ha modicado las dimensiones de la imagen. Accion ignorada." << std::endl;
254
TImagenITKIntensidad2D::SpacingType outputSpacingitk = salida->GetSpacing();
255
double outputSpacingvtk[3];
257
outputSpacingvtk[0] = outputSpacingitk[0];
258
outputSpacingvtk[1] = outputSpacingitk[1];
259
outputSpacingvtk[2] = spacing[2];
260
m_pImagen->SetSpacing(outputSpacingvtk);
262
TImagenITKIntensidad2D::PointType outputOriginitk = salida->GetOrigin();
263
double outputOriginvtk[3];
264
outputOriginvtk[0] = outputOriginitk[0];
265
outputOriginvtk[1] = outputOriginitk[1];
266
outputOriginvtk[2] = origin[2];
267
m_pImagen->SetOrigin(outputOriginvtk);
269
itk::ImageRegionIterator<TImagenITKIntensidad2D> itSalida (salida, regionSalida);
271
off = dims[0] * dims[1] * slice;
272
for (itSalida.GoToBegin(); !itSalida.IsAtEnd(); ++itSalida) {
273
tval[0] = itSalida.Get();
274
scalars->SetTuple(off++, tval);
278
else if (numComponentes == 3) {
279
for (long y = 0; y < dims[1]; ++y) {
280
for (long x = 0; x < dims[0]; ++x) {
281
scalars->SetTuple(off++, tval);
285
unsigned long off = 0;
286
for (it.GoToBegin(); !it.IsAtEnd(); ++it) {
287
ImageType::PixelType& pixel = it.Value();
288
scalars->SetTuple(off++, tval);
289
pixel.SetValue(tuple[0]);
290
data[off++] = pixel.GetRed();
291
data[off++] = pixel.GetGreen();
292
data[off++] = pixel.GetBlue();
297
std::cerr << "Error al aplicar el filtro: Numero de componentes no soportado. Accion ignorada" << std::endl;
302
else if (implementacion == IF_MEF) {
303
//if (slice > dims[2]) {
305
// std::cerr << "Error: No se pudo aplicar el filtro. Indice de slice fuera de rango" << std::endl;
311
// sliceEnd = dims[2];
314
// sliceStart = slice;
315
// sliceEnd = slice + 1;
318
//for (slice = sliceStart; slice < sliceEnd; ++slice) {
320
// double tval[3] = {0.0f, 0.0f, 0.0f};
321
// vtkDataArray* scalars = m_pImagen->GetPointData()->GetScalars();
322
// unsigned long off = 0;
323
// if (numComponentes == 1) {
325
// TImagenMEFIntensidad2D* entrada = new TImagenMEFIntensidad2D(dims[0], dims[1]);
327
// if (entrada->Altura < 1 || entrada->Anchura < 1) {
328
// std::cerr << "Dimensiones de la imagen incorrectas" << std::endl;
331
// off = dims[0] * dims[1] * slice;
332
// for (int y = entrada->Altura -1; y >= 0; --y) {
333
// for (int x = 0; x < entrada->Anchura; ++x) {
334
// scalars->GetTuple(off++, tval);
335
// entrada->Pixel(x, y) = tval[0];
339
// TImagenMEFIntensidad2D* salida = ProcesarImagen(entrada);
341
// off = dims[0] * dims[1] * slice;
342
// for (int y = entrada->Altura -1; y >= 0; --y) {
343
// for (int x = 0; x < entrada->Anchura; ++x) {
344
// tval[0] = entrada->Pixel(x, y);
345
// scalars->SetTuple(off++, tval);
353
// else if (numComponentes == 3) {
354
// TImagenMEFRGB2D* entrada = new TImagenMEFRGB2D(dims[0], dims[1]);
356
// if (entrada->Altura < 1 || entrada->Anchura < 1) {
357
// std::cerr << "Dimensiones de la imagen incorrectas" << std::endl;
360
// off = dims[0] * dims[1] * slice;
361
// for (int y = entrada->Altura -1; y >= 0; --y) {
362
// for (int x = 0; x < entrada->Anchura; ++x) {
363
// scalars->GetTuple(off++, tval);
364
// entrada->Pixel(x, y).r = tval[0];
365
// entrada->Pixel(x, y).g = tval[1];
366
// entrada->Pixel(x, y).b = tval[2];
370
// TImagenMEFRGB2D* salida = ProcesarImagen(entrada);
372
// off = dims[0] * dims[1] * slice;
373
// for (int y = entrada->Altura -1; y >= 0; --y) {
374
// for (int x = 0; x < entrada->Anchura; ++x) {
375
// tval[0] = entrada->Pixel(x, y).r;
376
// tval[1] = entrada->Pixel(x, y).g;
377
// tval[2] = entrada->Pixel(x, y).b;
378
// scalars->SetTuple(off++, tval);
386
// std::cerr << "Error al aplicar el filtro: Numero de componentes no soportado. Accion ignorada" << std::endl;
397
//pVista->SolicitarActualizarImagen();
401
GNC::FiltroNulo::TImagenITKRGB2D::Pointer GNC::FiltroNulo::ProcesarImagen(GNC::FiltroNulo::TImagenITKRGB2D::Pointer imagen)
406
GNC::FiltroNulo::TImagenITKRGB3D::Pointer GNC::FiltroNulo::ProcesarImagen(GNC::FiltroNulo::TImagenITKRGB3D::Pointer imagen)
411
//GNC::FiltroNulo::TImagenMEFRGB2D* GNC::FiltroNulo::ProcesarImagen(GNC::FiltroNulo::TImagenMEFRGB2D* imagen)
416
GNC::FiltroNulo::TImagenITKIntensidad2D::Pointer GNC::FiltroNulo::ProcesarImagen(GNC::FiltroNulo::TImagenITKIntensidad2D::Pointer imagen)
422
GNC::FiltroNulo::TImagenITKIntensidad3D::Pointer GNC::FiltroNulo::ProcesarImagen(GNC::FiltroNulo::TImagenITKIntensidad3D::Pointer imagen)
428
//GNC::FiltroNulo::TImagenMEFIntensidad2D* GNC::FiltroNulo::ProcesarImagen(GNC::FiltroNulo::TImagenMEFIntensidad2D* imagen)