3#include <DGtal/base/Common.h>
4#include <DGtal/images/CImage.h>
5#include <DGtal/io/Color.h>
6#include <DGtal/io/readers/GenericReader.h>
7#include <DGtal/io/writers/PPMWriter.h>
8#include <DGtal/io/writers/PGMWriter.h>
16 struct ColorToRedFunctor {
17 int operator()(
int color )
const
18 {
return (color >> 16) & 0xff; }
21 struct ColorToGreenFunctor {
22 int operator()(
int color )
const
23 {
return (color >> 8) & 0xff; }
26 struct ColorToBlueFunctor {
27 int operator()(
int color )
const
28 {
return color & 0xff; }
31 struct ColorToGrayFunctor {
32 int operator()(
int color )
const
34 double val = 0.2126 * ( (double) ( ( color >> 16 ) & 0xff ) )
35 + 0.7152 * ( (
double) ( ( color >> 8 ) & 0xff ) )
36 + 0.0722 * ( (double) ( ( color >> 0 ) & 0xff ) );
37 return ( (
int) round( val ) ) & 0xff;
41 struct DoubleToGrayFunctor {
42 unsigned char operator()(
double scalar )
const
43 {
return (
unsigned char) std::min( 255.0, std::max( 0.0, round( scalar ) ) ); }
46 struct SignedDoubleToGrayFunctor {
47 unsigned char operator()(
double scalar )
const
48 {
return (
unsigned char) std::min( 255.0, std::max( 0.0, 128.0 + round( scalar ) ) ); }
51 struct GrayToGrayFunctor {
52 int operator()(
int color )
const
53 {
return color & 0xff; }
56 struct GrayToRedGreen {
57 DGtal::Color operator()(
int value )
const
59 if ( value >= 128 )
return DGtal::Color( 0, (value-128)*2+1, 0 );
60 else return DGtal::Color( 0, 0, 255-value*2 );
66 typedef Z2i::Integer Integer;
67 typedef Z2i::Point Point;
68 typedef Z2i::RealPoint RealPoint;
69 typedef Z2i::Domain Domain;
70 typedef RealPoint::Component Scalar;
72 Zoom( Domain aDomain,
int aZoom )
73 : _domain( aDomain ), _zoom( aZoom ) {
74 _zDomain = getZoomedDomain();
75 _stride = _domain.upperBound()[ 0 ] - _domain.lowerBound()[ 0 ] + 1;
76 _zStride = _zDomain.upperBound()[ 0 ] - _zDomain.lowerBound()[ 0 ] + 1;
79 const Domain& domain()
const {
return _domain; }
80 const Domain& zoomedDomain()
const {
return _zDomain; }
81 Domain getZoomedDomain()
const {
82 return Domain( zoom( _domain.lowerBound() ), zoom( _domain.upperBound() ) );
85 Integer index( Point p )
const
87 return p[ 1 ] * _stride + p[ 0 ];
90 Integer zoomedIndex( Point p )
const
92 return p[ 1 ] * _zStride + p[ 0 ];
95 Point zoom( Point p )
const
100 RealPoint zoom( RealPoint p )
const
102 return p * ( Scalar ) _zoom;
105 Point unzoom( Point p )
const
110 RealPoint real( Point p )
const
111 {
return RealPoint( p[ 0 ], p[ 1 ] ); }
113 Point closest( RealPoint p )
const
114 {
return Point( (Integer) round( p[ 0 ] ), (Integer) round( p[ 1 ] ) ); }
116 RealPoint project( Point p )
const
118 return real( p ) / (Scalar) _zoom;
121 RealPoint unzoom( RealPoint p )
const
123 return p / ( Scalar ) _zoom;
135 typedef double Scalar;
136 typedef PointVector< 3, Scalar > Value;
142 typedef std::vector<Scalar> ScalarForm;
143 typedef std::vector<Value> ValueForm;
144 typedef std::vector<VectorValue> VectorValueForm;
146 template <
typename Image>
147 ScalarForm getScalarForm(
const Image& image,
bool color )
150 ScalarForm I( image.size() );
152 auto F = ColorToGrayFunctor();
153 for (
unsigned int val : image )
154 I[ v++ ] = (Scalar) F( val );
156 auto F = GrayToGrayFunctor();
157 for (
unsigned int val : image )
158 I[ v++ ] = (Scalar) F( val );
162 template <
typename Image>
163 ValueForm getValueForm(
const Image& image,
bool color )
166 ValueForm I( image.size() );
168 auto R = ColorToRedFunctor();
169 auto G = ColorToGreenFunctor();
170 auto B = ColorToBlueFunctor();
171 for (
unsigned int val : image )
172 I[ v++ ] = Value( (Scalar) R( val ), (Scalar) G( val ), (Scalar) B( val ) );
174 auto F = GrayToGrayFunctor();
175 for (
unsigned int val : image )
176 I[ v++ ] = Value( (Scalar) F( val ), (Scalar) F( val ), (Scalar) F( val ) );
183 namespace functions {
184 template <
typename TImageDst,
typename TImageSrc,
186 void transform( TImageDst& dst,
const TImageSrc& src,
189 std::transform( src.begin(), src.end(), dst.begin(), F );
192 template <
typename ScalarImage>
193 bool exportPGM(
const char* name,
const ScalarImage& image )
195 return PGMWriter<ScalarImage,DoubleToGrayFunctor>::exportPGM( name, image );
197 template <
typename ScalarImage>
198 bool exportGradPGM(
const char* name,
const ScalarImage& image )
200 return PGMWriter<ScalarImage,SignedDoubleToGrayFunctor>::exportPGM( name, image );