DGtal 1.4.0
Loading...
Searching...
No Matches
exampleArrayImageAdapter.cpp
Go to the documentation of this file.
1
31#include <iostream>
32
33#include <DGtal/base/Common.h>
34#include <DGtal/helpers/StdDefs.h>
35
36#include <DGtal/io/boards/Board2D.h>
37
39#include <new>
40#include <cmath>
41#include <algorithm>
42#include <DGtal/io/colormaps/HueShadeColorMap.h>
43#include <DGtal/images/ImageContainerBySTLVector.h>
44#include <DGtal/images/ArrayImageAdapter.h>
46
48using namespace std;
49using namespace DGtal;
51
53{
55 using Space = SpaceND<2>;
57 using Point = Domain::Point;
58 using Value = double;
59
60 const Domain domain( Point(0, 1), Point(4, 3) );
61
62 Value* data = new Value[ domain.size() ];
63
64 // Convert this allocated memory to a CImage model.
65 ArrayImageAdapter< Value*, Domain > image( data, domain );
66 // Alternative syntax using the helpers:
67 // auto image = makeArrayImageAdapterFromIterator( data, domain );
68
69 // Fill the image with first coordinate of the point
70 for ( auto it = image.begin(); it != image.end(); ++it )
71 {
72 *it = it.getPoint()[0];
73 }
74
75 // Get a constant view on a sub-domain.
76 const Domain sub_domain( Point(1, 1), Point(3, 2) );
77 ArrayImageAdapter< Value const*, Domain > cst_image( data, domain, sub_domain );
78 // Alternative syntax using the helpers:
79 // auto const cst_image = makeArrayImageAdapterFromImage( image, sub_domain );
80
81 // Display it.
82 for ( auto value : cst_image )
83 {
84 std::cout << value << " ";
85 }
86 std::cout << std::endl;
88}
89
91{
92 using namespace Z2i;
93
94 Board2D aBoard;
95
97 using Value = double; // value type of the image
98 using HueShadeDouble = HueShadeColorMap<Value>; // a simple HueShadeColorMap varying on 'double' values
100
101 trace.beginBlock("image");
102
104 const Domain domain(Point(1,1), Point(16,16));
105 Value* data = new Value[ domain.size() ];
106 ArrayImageAdapter< Value*, Domain > image( data, domain );
108
110 Value i = 0;
111 for ( auto & value : image )
112 value = i++;
114
115 aBoard.clear();
117 aBoard.saveSVG("ArrayImageAdapter_image.svg");
118
119 trace.endBlock();
120
121 trace.beginBlock("subImage");
122
124 Domain subDomain(Point(1,1), Point(8,8));
125 ArrayImageAdapter< Value const*, Domain > constSubImage( data, domain, subDomain );
127
128 aBoard.clear();
129 Display2DFactory::drawImage<HueShadeDouble>(aBoard, constSubImage, 0, domain.size()-1);
130 aBoard.saveSVG("ArrayImageAdapter_subImage.svg");
131
132 trace.endBlock();
133
134 trace.beginBlock("modifying subImage through domain iterator");
135 {
137 ArrayImageAdapter< Value*, Domain > subImage( data, domain, subDomain );
139 }
140
142 auto subImage = makeArrayImageAdapterFromIterator( data, domain, subDomain );
144
145
147 for ( auto point : subImage.domain() )
148 {
149 Value coord = (point - Point(4,4)).norm();
150 subImage.setValue( point, 25*(cos(coord)+1) );
151 }
153
154 aBoard.clear();
156 aBoard.saveSVG("ArrayImageAdapter_subImage_modifByDomain.svg");
157
158 trace.endBlock();
159
160 trace.beginBlock("modifying subImage through image iterator");
162 for ( auto it = subImage.begin(), it_end = subImage.end(); it != it_end; ++it )
163 {
164 Value coord = (it.getPoint() - Point(4,4)).norm();
165 *it = 25*(sin(coord)+1);
166 }
168
169 aBoard.clear();
171 aBoard.saveSVG("ArrayImageAdapter_subImage_modifByImage.svg");
172
173 trace.endBlock();
174
175 trace.beginBlock("subImage from an ImageContainerBySTLVector");
178 for (auto& value : anIterableImage)
179 value = 0;
181
183 {
184 ArrayImageAdapter< ImageContainerBySTLVector<Domain,Value>::Iterator, Domain > subImageSTL( anIterableImage.begin(), domain, subDomain );
185 }
187
189 auto subImageSTL = makeArrayImageAdapterFromImage( anIterableImage, subDomain );
191
192 trace.endBlock();
193
194 trace.beginBlock("using std::copy on ArrayImageAdapter");
196 std::copy( subImage.cbegin(), subImage.cend(), subImageSTL.begin() );
198
199 aBoard.clear();
200 Display2DFactory::drawImage<HueShadeDouble>(aBoard, anIterableImage, 0, domain.size()-1);
201 aBoard.saveSVG("ArrayImageAdapter_subImage_copyToImageSTL.svg");
202
203 trace.endBlock();
204
205 delete[] data;
206}
207
208int main()
209{
212 return 0;
213}
214
215// //
Aim: This class specializes a 'Board' class so as to display DGtal objects more naturally (with <<)....
Definition Board2D.h:71
Aim: This class template may be used to (linearly) convert scalar values in a given range into a colo...
void beginBlock(const std::string &keyword="")
double endBlock()
void clear(const DGtal::Color &color=DGtal::Color::None)
Definition Board.cpp:151
void saveSVG(const char *filename, PageSize size=Board::BoundingBox, double margin=10.0) const
Definition Board.cpp:1011
void moduleImages_example()
void ArrayImageAdapter_example()
DGtal is the top-level namespace which contains all DGtal functions and types.
ArrayImageAdapter< TArrayIterator, TDomain > makeArrayImageAdapterFromIterator(TArrayIterator anArrayIterator, TDomain const &aFullDomain, TDomain const &aViewDomain)
ArrayImageAdapter< decltype(((TImage *) nullptr) ->begin()), TDomain > makeArrayImageAdapterFromImage(TImage &anImage, TDomain const &aViewDomain)
Trace trace
Definition Common.h:153
STL namespace.
static void drawImage(DGtal::Board2D &board, const Image &i, const typename Image::Value &minV, const typename Image::Value &maxV)
MyPointD Point
Domain domain