29 #include <DGtal/base/Common.h>
30 #include <DGtal/io/readers/GenericReader.h>
31 #include <DGtal/io/writers/GenericWriter.h>
32 #include <DGtal/helpers/StdDefs.h>
33 #include <DGtal/images/Image.h>
34 #include <DGtal/images/ImageSelector.h>
35 #include <DGtal/images/ConstImageAdapter.h>
36 #include <DGtal/images/RigidTransformation2D.h>
38 #include <boost/program_options/options_description.hpp>
39 #include <boost/program_options/parsers.hpp>
40 #include <boost/program_options/variables_map.hpp>
43 using namespace DGtal;
47 namespace po = boost::program_options;
55 void missingParam ( std::string param )
57 trace.error() <<
" Parameter: "<<param<<
" is required..";
58 trace.info() <<std::endl;
63 int main(
int argc,
char**argv)
67 po::options_description general_opt (
"Allowed options are: " );
68 general_opt.add_options()
69 (
"help,h",
"display this message." )
70 (
"input,i", po::value<std::string>(),
"Input file." )
71 (
"output,o", po::value<string>(),
"Output filename." )
72 (
"model,m", po::value<string>(),
"Transformation model: backward, forward." )
73 (
"angle,a", po::value<double>(),
"Rotation angle in radians." )
74 (
"ox", po::value<double>(),
"X coordinate of origin." )
75 (
"oy", po::value<double>(),
"Y coordinate of origin." )
76 (
"tx", po::value<double>(),
"X component of translation vector." )
77 (
"ty", po::value<double>(),
"Y component of translation vector." );
82 po::store(po::parse_command_line(argc, argv, general_opt), vm);
83 }
catch(
const std::exception& ex){
85 trace.info()<<
"Error checking program options: "<< ex.what()<< endl;
89 if (!parseOK || vm.count (
"help" ) ||argc<=1 )
91 trace.info() <<
"Rotate 2D image."<<std::endl
92 << std::endl <<
"Basic usage: "<<std::endl
93 <<
"rigidTrans2D --ox 1.0 --oy 1.0 -a 1.2 --tx 1 --ty 0 --m <forward|backward> --input <RawFileName> --output <VolOutputFileName> "<<std::endl
94 << general_opt <<
"\n";
99 if ( ! ( vm.count (
"input" ) ) ) missingParam (
"--input" );
100 std::string filename = vm[
"input"].as<std::string>();
101 if ( ! ( vm.count (
"output" ) ) ) missingParam (
"--output" );
102 std::string outputFileName = vm[
"output"].as<std::string>();
103 if ( ! ( vm.count (
"model" ) ) ) missingParam (
"--model" );
104 std::string model = vm[
"model"].as<std::string>();
105 if ( ! ( vm.count (
"angle" ) ) ) missingParam (
"--angle" );
106 double angle = vm[
"angle"].as<
double>();
107 if ( ! ( vm.count (
"ox" ) ) ) missingParam (
"--ox" );
108 double ox = vm[
"ox"].as<
double>();
109 if ( ! ( vm.count (
"oy" ) ) ) missingParam (
"--oy" );
110 double oy = vm[
"oy"].as<
double>();
111 if ( ! ( vm.count (
"tx" ) ) ) missingParam (
"--tx" );
112 double tx = vm[
"tx"].as<
double>();
113 if ( ! ( vm.count (
"ty" ) ) ) missingParam (
"--ty" );
114 double ty = vm[
"ty"].as<
double>();
116 typedef ImageSelector<Domain, unsigned char >::Type Image;
117 typedef ForwardRigidTransformation2D < Space > ForwardTrans;
118 typedef BackwardRigidTransformation2D < Space > BackwardTrans;
119 typedef ConstImageAdapter<Image, Domain, BackwardTrans, Image::Value, Identity > MyImageBackwardAdapter;
120 typedef DomainRigidTransformation2D < Domain, ForwardTrans > MyTransformedDomain;
121 typedef MyTransformedDomain::Bounds Bounds;
123 Image image = GenericReader <Image, 2>::import(filename);
124 ForwardTrans forwardTrans( RealPoint ( ox, oy ), angle, RealVector( tx, ty ) );
125 BackwardTrans backwardTrans( RealPoint ( ox, oy ), angle, RealVector( tx, ty ) );
126 MyTransformedDomain domainForwardTrans ( forwardTrans );
127 Bounds bounds = domainForwardTrans ( image.domain() );
128 Domain transformedDomain ( bounds.first, bounds.second );
131 if ( model ==
"forward" )
133 Image forwardTransformedImage ( transformedDomain );
134 for ( Domain::ConstIterator it = image.domain().begin(); it != image.domain().end(); ++it )
136 forwardTransformedImage.setValue ( forwardTrans ( *it ), image ( *it ) );
138 GenericWriter<Image, 2, unsigned char, Identity>::exportFile(outputFileName, forwardTransformedImage, idD);
142 MyImageBackwardAdapter backwardImageAdapter ( image, transformedDomain , backwardTrans, idD );
143 GenericWriter<MyImageBackwardAdapter, 2, unsigned char, Identity>::exportFile(outputFileName, backwardImageAdapter, idD);