Hi,
2010/11/5 Olivier Tournaire
Hi all,
What is the best way to compute the difference between 2 any_image? Of
course, the input any_image may not be of the same type... So, if pixels are
unsigned int for the 1st one and double for the 2nd one, the result must be
stored as double.
I (accidently) found pixel_minus_t in pixel_numeric_operations.hpp but
cannot figure how to use it.
I am still having problem with this. I found a way to write such an image
difference, but not for any_image. Here is what I have now:
namespace boost { namespace gil {
typedef double bits64F;
GIL_DEFINE_BASE_TYPEDEFS(64F,gray)
typedef float bits32F;
GIL_DEFINE_BASE_TYPEDEFS(32F,gray)
} }
struct image_difference
{
typedef void result_type;
template
result_type operator()(OutputViewType &out, const ViewType1 &v1,
const ViewType2 &v2) const
{
typedef typename get_pixel_type<ViewType1>::type v1_pixel_t;
typedef typename get_pixel_type<ViewType2>::type v2_pixel_t;
typedef typename get_pixel_type<OutputViewType>::type out_pixel_t;
typename ViewType1::iterator v1_it = v1.begin();
typename ViewType2::iterator v2_it = v2.begin();
typename OutputViewType::iterator out_it = out.begin();
for(;v1_it!=v1.end();++v1_it, ++v2_it, ++out_it)
*out_it = pixel_minus_t()(*v1_it, *v2_it);
}
};
int main(int argc, char** argv)
{
gray16s_image_t mns;
gray32F_image_t mnt, mne;
read_image(
"/home/olivier/work/data/ZTerrain_c3/ZTerrain_c3.tif", mns ,
tiff_tag() );
read_image(
"/home/olivier/work/data/ZTerrain_c3/ZTerrain_c3_MNT.tif", mnt ,
tiff_tag() );
mne.recreate( mns.width(), mns.height() );
image_difference()( view(mne) , view(mns) , view(mnt) );
write_view(
"/home/olivier/work/data/ZTerrain_c3/ZTerrain_c3_MNE.tif", view(mne),
tiff_tag() );
}
I am however sure there is a generic and better way to do such a simple
image operation. 2 questions arise:
1) how can I use for_each_pixel in image_difference rather than a for loop?
2) how can I extend this code to work on any_image(_view) using
apply_operation?
Best regards,
Olivier