/vol/vipdata/irtk/packages/registration/include/irtkMultiThreadedImageRigidRegistration2D.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifdef HAS_TBB
00014
00015 extern concurrent_queue<irtkSimilarityMetric *> queue;
00016
00017 class irtkMultiThreadedImageRigidRegistrationEvaluate2D
00018 {
00019
00021 irtkImageRigidRegistration *_filter;
00022
00024 irtkSimilarityMetric *_metric;
00025
00026 public:
00027
00028 irtkMultiThreadedImageRigidRegistrationEvaluate2D(irtkImageRigidRegistration *filter) {
00029
00030 _filter = filter;
00031
00032
00033 _metric = filter->_metric;
00034 _metric->Reset();
00035 }
00036
00037 irtkMultiThreadedImageRigidRegistrationEvaluate2D(irtkMultiThreadedImageRigidRegistrationEvaluate2D &r, split) {
00038
00039
00040 _filter = r._filter;
00041
00042
00043 if (queue.pop_if_present(_metric) == false) {
00044 _metric = irtkSimilarityMetric::New(_filter->_metric);
00045 }
00046
00047
00048 _metric->Reset();
00049 }
00050
00051 ~irtkMultiThreadedImageRigidRegistrationEvaluate2D() {
00052 if (_metric != _filter->_metric) queue.push(_metric);
00053 }
00054
00055 void join(irtkMultiThreadedImageRigidRegistrationEvaluate2D &rhs) {
00056
00057 _metric->Combine(rhs._metric);
00058 }
00059
00060 void operator()(const blocked_range<int> &r) {
00061 int i, j;
00062
00063
00064 irtkHomogeneousTransformationIterator iterator((irtkHomogeneousTransformation *)_filter->_transformation);
00065
00066
00067 for (j = r.begin(); j != r.end(); j++) {
00068
00069
00070 iterator.Initialize(_filter->_target, _filter->_source, 0, j, 0);
00071
00072
00073 irtkGreyPixel *ptr2target = _filter->_target->GetPointerToVoxels(0, j, 0);
00074
00075
00076 for (j = 0; j < _filter->_target->GetY(); j++) {
00077 for (i = 0; i < _filter->_target->GetX(); i++) {
00078
00079 if (*ptr2target >= 0) {
00080
00081 if ((iterator._x > _filter->_source_x1) && (iterator._x < _filter->_source_x2) &&
00082 (iterator._y > _filter->_source_y1) && (iterator._y < _filter->_source_y2)) {
00083
00084 _metric->Add(*ptr2target, round(_filter->_interpolator->EvaluateInside(iterator._x, iterator._y, 0)));
00085 }
00086 iterator.NextX();
00087 } else {
00088
00089 iterator.NextX(*ptr2target * -1);
00090 i -= (*ptr2target) + 1;
00091 ptr2target -= (*ptr2target) + 1;
00092 }
00093 ptr2target++;
00094 }
00095 iterator.NextY();
00096 }
00097 }
00098 }
00099 };
00100
00101 #endif