DGtal 1.3.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
48
49using namespace std;
50using namespace DGtal;
52
54{
56 using Space = SpaceND<2>;
58 using Point = Domain::Point;
59 using Value = double;
60
61 const Domain domain( Point(0, 1), Point(4, 3) );
62
63 Value* data = new Value[ domain.size() ];
64
65 // Convert this allocated memory to a CImage model.
66 ArrayImageAdapter< Value*, Domain > image( data, domain );
67 // Alternative syntax using the helpers:
68 // auto image = makeArrayImageAdapterFromIterator( data, domain );
69
70 // Fill the image with first coordinate of the point
71 for ( auto it = image.begin(); it != image.end(); ++it )
72 {
73 *it = it.getPoint()[0];
74 }
75
76 // Get a constant view on a sub-domain.
77 const Domain sub_domain( Point(1, 1), Point(3, 2) );
78 ArrayImageAdapter< Value const*, Domain > cst_image( data, domain, sub_domain );
79 // Alternative syntax using the helpers:
80 // auto const cst_image = makeArrayImageAdapterFromImage( image, sub_domain );
81
82 // Display it.
83 for ( auto value : cst_image )
84 {
85 std::cout << value << " ";
86 }
87 std::cout << std::endl;
89}
90
92{
93 using namespace Z2i;
94
95 Board2D aBoard;
96
98 using Value = double; // value type of the image
99 using HueShadeDouble = HueShadeColorMap<Value>; // a simple HueShadeColorMap varying on 'double' values
101
102 trace.beginBlock("image");
103
105 const Domain domain(Point(1,1), Point(16,16));
106 Value* data = new Value[ domain.size() ];
107 ArrayImageAdapter< Value*, Domain > image( data, domain );
109
111 Value i = 0;
112 for ( auto & value : image )
113 value = i++;
115
116 aBoard.clear();
117 Display2DFactory::drawImage<HueShadeDouble>(aBoard, image, 0, domain.size()-1);
118 aBoard.saveSVG("ArrayImageAdapter_image.svg");
119
120 trace.endBlock();
121
122 trace.beginBlock("subImage");
123
125 Domain subDomain(Point(1,1), Point(8,8));
126 ArrayImageAdapter< Value const*, Domain > constSubImage( data, domain, subDomain );
128
129 aBoard.clear();
130 Display2DFactory::drawImage<HueShadeDouble>(aBoard, constSubImage, 0, domain.size()-1);
131 aBoard.saveSVG("ArrayImageAdapter_subImage.svg");
132
133 trace.endBlock();
134
135 trace.beginBlock("modifying subImage through domain iterator");
136 {
138 ArrayImageAdapter< Value*, Domain > subImage( data, domain, subDomain );
140 }
141
143 auto subImage = makeArrayImageAdapterFromIterator( data, domain, subDomain );
145
146
148 for ( auto point : subImage.domain() )
149 {
150 Value coord = (point - Point(4,4)).norm();
151 subImage.setValue( point, 25*(cos(coord)+1) );
152 }
154
155 aBoard.clear();
156 Display2DFactory::drawImage<HueShadeDouble>(aBoard, image, 0, domain.size()-1);
157 aBoard.saveSVG("ArrayImageAdapter_subImage_modifByDomain.svg");
158
159 trace.endBlock();
160
161 trace.beginBlock("modifying subImage through image iterator");
163 for ( auto it = subImage.begin(), it_end = subImage.end(); it != it_end; ++it )
164 {
165 Value coord = (it.getPoint() - Point(4,4)).norm();
166 *it = 25*(sin(coord)+1);
167 }
169
170 aBoard.clear();
171 Display2DFactory::drawImage<HueShadeDouble>(aBoard, image, 0, domain.size()-1);
172 aBoard.saveSVG("ArrayImageAdapter_subImage_modifByImage.svg");
173
174 trace.endBlock();
175
176 trace.beginBlock("subImage from an ImageContainerBySTLVector");
179 for (auto& value : anIterableImage)
180 value = 0;
182
184 {
185 ArrayImageAdapter< ImageContainerBySTLVector<Domain,Value>::Iterator, Domain > subImageSTL( anIterableImage.begin(), domain, subDomain );
186 }
188
190 auto subImageSTL = makeArrayImageAdapterFromImage( anIterableImage, subDomain );
192
193 trace.endBlock();
194
195 trace.beginBlock("using std::copy on ArrayImageAdapter");
197 std::copy( subImage.cbegin(), subImage.cend(), subImageSTL.begin() );
199
200 aBoard.clear();
201 Display2DFactory::drawImage<HueShadeDouble>(aBoard, anIterableImage, 0, domain.size()-1);
202 aBoard.saveSVG("ArrayImageAdapter_subImage_copyToImageSTL.svg");
203
204 trace.endBlock();
205
206 delete[] data;
207}
208
209int main()
210{
213 return 0;
214}
215
216// //
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:152
void saveSVG(const char *filename, PageSize size=Board::BoundingBox, double margin=10.0) const
Definition: Board.cpp:1012
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:154
STL namespace.
MyPointD Point
Definition: testClone2.cpp:383
Domain domain