diff --git a/modules/img/alg/src/discrete_shrink.cc b/modules/img/alg/src/discrete_shrink.cc index d24979b3f5b632d6376342bbb8db0b84e128a004..ba01ae54635d9c4bab555b1772f38f5c43b1129b 100644 --- a/modules/img/alg/src/discrete_shrink.cc +++ b/modules/img/alg/src/discrete_shrink.cc @@ -49,6 +49,7 @@ void do_shrink(const ImageStateImpl<T,D>& isi, T& dest, const Extent& inner_ext) T sum(0); Real count=0.0; for(ExtentIterator bit(inner_ext);!bit.AtEnd();++bit) { + LOG_VERBOSE("inner extent point:" << Point(bit)<<","<<isi.GetExtent().Contains(Point(bit))); sum+=isi.Value(bit); count+=1.0; } @@ -61,18 +62,27 @@ void do_shrink(const ImageStateImpl<T,D>& isi, T& dest, const Extent& inner_ext) template <typename T, class D> ImageStateBasePtr DiscreteShrinkFnc::VisitState(const ImageStateImpl<T,D>& isi) const { - Size size(isi.GetExtent().GetSize()); - Point start(isi.GetExtent().GetStart()); + Size size(isi.GetLogicalExtent().GetSize()); + Point start(isi.GetLogicalExtent().GetStart()); Size newsize; div_t dt; - dt = div(static_cast<int>(size[0]),bs_[0]); newsize[0] = dt.quot + ((dt.rem>0) ? 1 : 0); - dt = div(static_cast<int>(size[1]),bs_[1]); newsize[1] = dt.quot + ((dt.rem>0) ? 1 : 0); - dt = div(static_cast<int>(size[2]),bs_[2]); newsize[2] = dt.quot + ((dt.rem>0) ? 1 : 0); - + dt = div(static_cast<int>(size[0]),bs_[0]); + newsize[0] = dt.quot + ((dt.rem>0) ? 1 : 0); + dt = div(static_cast<int>(size[1]),bs_[1]); + newsize[1] = dt.quot + ((dt.rem>0) ? 1 : 0); + dt = div(static_cast<int>(size[2]),bs_[2]); + newsize[2] = dt.quot + ((dt.rem>0) ? 1 : 0); Extent new_ext(newsize); + Point newstart; - LOG_DEBUG("extent of shrunken image" << isi.GetExtent() << " " << new_ext); + dt = div(start[0],bs_[0]); newstart[0] = dt.quot; + dt = div(start[1],bs_[1]); newstart[1] = dt.quot; + dt = div(start[2],bs_[2]); newstart[2] = dt.quot; + + new_ext.Shift(newstart); + + LOG_DEBUG("extent of shrunken image" << isi.GetExtent() << " " << new_ext<< new_ext.GetEnd()); geom::Vec3 ao = isi.GetAbsoluteOrigin(); @@ -80,26 +90,18 @@ ImageStateBasePtr DiscreteShrinkFnc::VisitState(const ImageStateImpl<T,D>& isi) new_ps.SetExtent(new_ext); typename ImageStateImpl<T,D>::SharedPtrType ni(new ImageStateImpl<T,D>(new_ext,new_ps)); + ni->SetAbsoluteOrigin(ao); + ni->GetSampling().SetPixelSampling(CompMultiply(ni->GetSampling().GetPixelSampling(),Vec3(bs_[0],bs_[1],bs_[2]))); - for(ExtentIterator it(new_ext); !it.AtEnd(); ++it) { + for(ExtentIterator it(ni->GetExtent(),ni->GetDomain()); !it.AtEnd(); ++it) { Point t(it[0]*bs_[0], it[1]*bs_[1], it[2]*bs_[2]); - - Extent inner_ext = Overlap(Extent(t+start,bs_),isi.GetExtent()); - + Extent inner_ext = Overlap(Extent(t,bs_),isi.GetExtent()); do_shrink(isi,ni->Value(it),inner_ext); } - Point newstart; - - dt = div(start[0],bs_[0]); newstart[0] = dt.quot; - dt = div(start[1],bs_[1]); newstart[1] = dt.quot; - dt = div(start[2],bs_[2]); newstart[2] = dt.quot; - ni->SetAbsoluteOrigin(ao); - ni->SetSpatialOrigin(newstart); - ni->GetSampling().SetPixelSampling(CompMultiply(ni->GetSampling().GetPixelSampling(),Vec3(bs_[0],bs_[1],bs_[2]))); return ni; }