8 #ifndef LBLITZDATAEXPLORER_HH_ 9 #define LBLITZDATAEXPLORER_HH_ 15 #include <QtGui/QImage> 21 template<
typename DataT>
25 template<
typename DataT>
33 template<
typename DataT>
38 m_dataColor.resize(data.shape());
39 m_dataColor_channel0.reference(m_dataColor(all, all, all, 0));
40 m_dataColor_channel1.reference(m_dataColor(all, all, all, 1));
41 m_dataColor_channel2.reference(m_dataColor(all, all, all, 2));
46 m_currentPos(0) = data.extent(0) / 2;
47 m_currentPos(1) = data.extent(1) / 2;
48 m_currentPos(2) = data.extent(2) / 2;
51 m_size[0] = data.extent(0);
52 m_size[1] = data.extent(1);
53 m_size[2] = data.extent(2);
60 template<
typename DataT>
66 m_dataGray.resize(data.shape());
70 m_currentPos = data.shape() / 2;
79 template<
typename DataT>
81 updateData(blitz::Array<bool, 3>& mask, blitz::TinyVector<DataT, 3>& color, blitz::RectDomain<3> & domain)
83 std::cerr <<
"update data" << std::endl;
84 m_dataColor_channel0(domain) = where(mask, (color(0) - dmin) /
double((dmax - dmin)) * 255, m_dataColor_channel0(
86 m_dataColor_channel1(domain) = where(mask, (color(1) - dmin) /
double((dmax - dmin)) * 255, m_dataColor_channel1(
88 m_dataColor_channel2(domain) = where(mask, (color(2) - dmin) /
double((dmax - dmin)) * 255, m_dataColor_channel2(
92 template<
typename DataT>
94 updateData(blitz::Array<bool, 3>& mask, DataT & grayValue, blitz::RectDomain<3> & domain)
96 m_dataGray(domain) = where(mask, (grayValue - dmin) /
double((dmax - dmin)) * 255, m_dataGray(domain));
99 template<
typename DataT>
101 updateData(blitz::Array<DataT, 3>& image, blitz::RectDomain<3> & domain)
103 m_dataGray(domain) = (image - dmin) /
double((dmax - dmin)) * 255;
106 template<
typename DataT>
108 updateData(blitz::Array<DataT, 4>& image, blitz::RectDomain<4> & domain)
110 m_dataColor(domain) = image(domain);
113 template<
typename DataT>
119 m_dataColor.resize(data.shape());
120 m_dataColor_channel0.reference(m_dataColor(all, all, all, 0));
121 m_dataColor_channel1.reference(m_dataColor(all, all, all, 1));
122 m_dataColor_channel2.reference(m_dataColor(all, all, all, 2));
124 m_size[0] = data.extent(0);
125 m_size[1] = data.extent(1);
126 m_size[2] = data.extent(2);
131 template<
typename DataT>
137 std::cerr <<
"resize" << std::endl;
138 m_dataGray.resize(data.shape());
139 std::cerr <<
"normalize" << std::endl;
141 std::cerr <<
"After normalize" << std::endl;
147 template<
typename DataT,
typename DataT2,
int Dim,
int Dim2>
149 normalize(blitz::Array<DataT, Dim> &data, blitz::Array<DataT2, Dim2> &normdata)
151 dmax = blitz::max(data);
152 dmin = blitz::min(data);
153 normdata = (data - dmin) /
double((dmax - dmin)) * 255;
160 m_currentPos = m_currentPos + blitz::TinyVector<int, 3>(z, y, x);
167 m_currentZoom = m_currentZoom + r;
168 m_currentZoom = std::min(std::max(m_currentZoom, -4.0), 4.0);
169 m_currentRatio =
std::pow(2, m_currentZoom);
175 for (
int i = 0; i < qview.width(); i++)
177 qview.setPixel(i, y, 0xff0000ff);
179 for (
int i = 0; i < qview.height(); i++)
181 qview.setPixel(x, i, 0xff0000ff);
188 int z = std::floor(m_currentPos(0) + 0.5);
196 LOG << ST << std::endl;
197 int lb =
lmax(z + 1 - ST, 0);
199 blitz::Range sliceRange(lb, ub);
200 blitz::Array<unsigned char, 3> subview(m_dataGray(sliceRange, all, all));
202 blitz::secondIndex j;
204 blitz::Array<unsigned char, 2> view(mean(subview(k, i, j), k));
209 blitz::Array<unsigned char, 2> view(m_dataGray(z, all, all));
212 QSize imageSize = QSize(qview.width() * m_currentRatio, qview.height() * m_currentRatio);
213 qview = qview.scaled(imageSize, Qt::KeepAspectRatio);
214 addCursor(qview, m_currentPos(2) * m_currentRatio + m_currentRatio / 2, m_currentPos(1) * m_currentRatio
215 + m_currentRatio / 2);
225 int lb =
lmax(z + 1 - ST, 0);
227 blitz::Range sliceRange(lb, ub);
228 blitz::Array<unsigned char, 4> subview(m_dataColor(sliceRange, all, all, all));
230 blitz::secondIndex j;
232 blitz::fourthIndex l;
233 blitz::Array<unsigned char, 3> view(blitz::mean(subview(l, i, j, k), l));
238 blitz::Array<unsigned char, 3> view(m_dataColor(z, all, all, all));
241 QSize imageSize = QSize(qview.width() * m_currentRatio, qview.height() * m_currentRatio);
242 qview = qview.scaled(imageSize, Qt::KeepAspectRatio);
243 addCursor(qview, m_currentPos(2) * m_currentRatio + m_currentRatio / 2, m_currentPos(1) * m_currentRatio
244 + m_currentRatio / 2);
253 int y = std::floor(m_currentPos(1) + 0.5);
257 blitz::Array<unsigned char, 2> view = m_dataGray(all, y, all);
259 QSize imageSize = QSize(qview.width() * m_currentRatio, qview.height() * m_currentRatio);
260 qview = qview.scaled(imageSize, Qt::KeepAspectRatio);
261 addCursor(qview, m_currentPos(2) * m_currentRatio + m_currentRatio / 2, m_currentPos(0) * m_currentRatio
262 + m_currentRatio / 2);
272 int lb =
lmax(y + 1 - ST, 0);
274 blitz::Range sliceRange(lb, ub);
275 blitz::Array<unsigned char, 4> subview(m_dataColor(all, sliceRange, all, all));
277 blitz::secondIndex j;
279 blitz::fourthIndex l;
280 blitz::Array<unsigned char, 3> view(blitz::mean(subview(i, l, j, k), l));
285 blitz::Array<unsigned char, 3> view(m_dataColor(all, y, all, all));
288 QSize imageSize = QSize(qview.width() * m_currentRatio, qview.height() * m_currentRatio);
289 qview = qview.scaled(imageSize, Qt::KeepAspectRatio);
290 addCursor(qview, m_currentPos(2) * m_currentRatio + m_currentRatio / 2, m_currentPos(0) * m_currentRatio
291 + m_currentRatio / 2);
299 int x = std::floor(m_currentPos(2) + 0.5);
303 blitz::Array<unsigned char, 2> view = m_dataGray(all, all, x);
304 view.transposeSelf(1, 0);
306 QSize imageSize = QSize(qview.width() * m_currentRatio, qview.height() * m_currentRatio);
307 qview = qview.scaled(imageSize, Qt::KeepAspectRatio);
308 addCursor(qview, m_currentPos(0) * m_currentRatio + m_currentRatio / 2, m_currentPos(1) * m_currentRatio
309 + m_currentRatio / 2);
318 int lb =
lmax(x + 1 - ST, 0);
320 blitz::Range sliceRange(lb, ub);
321 blitz::Array<unsigned char, 4> subview(m_dataColor(all, all, sliceRange, all));
323 blitz::secondIndex j;
325 blitz::fourthIndex l;
326 blitz::Array<unsigned char, 3> view(blitz::mean(subview(i, j, l, k), l));
327 view.transposeSelf(1, 0, 2);
332 blitz::Array<unsigned char, 3> view(m_dataColor(all, all, x, all));
333 view.transposeSelf(1, 0, 2);
336 QSize imageSize = QSize(qview.width() * m_currentRatio, qview.height() * m_currentRatio);
337 qview = qview.scaled(imageSize, Qt::KeepAspectRatio);
338 addCursor(qview, m_currentPos(0) * m_currentRatio + m_currentRatio / 2, m_currentPos(1) * m_currentRatio
339 + m_currentRatio / 2);
355 blitz::TinyVector<double, 3>
358 return blitz::TinyVector<int, 3>(m_currentPos(2) * m_currentRatio + m_currentRatio / 2, m_currentPos(1)
359 * m_currentRatio + m_currentRatio / 2, m_currentPos(0) * m_currentRatio + m_currentRatio / 2);
364 return m_currentPos(2) * m_currentRatio + m_currentRatio / 2;
369 return m_currentPos(1) * m_currentRatio + m_currentRatio / 2;
374 return m_currentPos(0) * m_currentRatio + m_currentRatio / 2;
380 m_currentPos(2) = x > 0 ? std::floor(x / m_currentRatio) : m_currentPos(2);
381 m_currentPos(1) = y > 0 ? std::floor(y / m_currentRatio) : m_currentPos(1);
382 m_currentPos(0) = z > 0 ? std::floor(z / m_currentRatio) : m_currentPos(0);
395 blitz::TinyVector<double, 3>
401 blitz::TinyVector<double, 6>
404 blitz::TinyVector<int, 3> point;
405 point(2) = x > 0 ? std::floor(x / m_currentRatio) : m_currentPos(2);
406 point(1) = y > 0 ? std::floor(y / m_currentRatio) : m_currentPos(1);
407 point(0) = z > 0 ? std::floor(z / m_currentRatio) : m_currentPos(0);
409 int xx = point(2), yy = point(1), zz = point(0);
412 return blitz::TinyVector<double, 6>(point(2), point(1), point(0), m_dataColor(zz, yy, xx, 0), m_dataColor(zz, yy,
413 xx, 1), m_dataColor(zz, yy, xx, 2));
420 return blitz::TinyVector<double, 6>(point(2), point(1), point(0), m_dataGray(zz, yy, xx), m_dataGray(zz, yy, xx),
421 m_dataGray(zz, yy, xx));
431 blitz::Array<unsigned char, 4> m_dataColor;
432 blitz::Array<unsigned char, 3> m_dataColor_channel0;
433 blitz::Array<unsigned char, 3> m_dataColor_channel1;
434 blitz::Array<unsigned char, 3> m_dataColor_channel2;
437 blitz::Array<unsigned char, 3> m_dataGray;
438 blitz::TinyVector<double, 3> m_currentPos;
439 double m_currentZoom;
440 double m_currentRatio;
444 template<
typename DataT>
449 blitz::TinyVector<double, 2> size = data.shape();
450 blitz::Array<unsigned char, 3> imageBuffer(size(0), size(1), 4);
452 imageBuffer(all, all, 0) = blitz::cast<unsigned char>(data);
453 imageBuffer(all, all, 1) = blitz::cast<unsigned char>(data);
454 imageBuffer(all, all, 2) = blitz::cast<unsigned char>(data);
455 imageBuffer(all, all, 3) = 0xff;
456 QImage image(size(1), size(0), QImage::Format_ARGB32);
457 memcpy(image.bits(), imageBuffer.data(), size(0) * size(1) * 4);
461 template<
typename DataT>
466 blitz::TinyVector<double, 3> size = data.shape();
467 blitz::Array<unsigned char, 3> imageBuffer(size(0), size(1), 4);
468 imageBuffer(all, all, blitz::Range(0, 2)) = blitz::cast<unsigned char>(data);
469 imageBuffer(all, all, 3) = 0xff;
470 QImage image(size(1), size(0), QImage::Format_ARGB32);
471 memcpy(image.bits(), imageBuffer.data(), size(0) * size(1) * 4);
blitz::TinyVector< double, 6 > getDataOnPoint(int x, int y, int z)
Array class derived from blitz++ Arrays for handling microscopic datasets with associated element siz...
blitz::Array< float, 3 > m_originalDataGray
QImage arrayToGrayQImage(const blitz::Array< DataT, 2 > &data)
void setDataPos(int x, int y, int z)
void updateData(blitz::Array< DataT, 4 > &data)
void keepInRange3D(Type &input, Type2 lb, Type3 ub)
void updateData(blitz::Array< bool, 3 > &mask, blitz::TinyVector< DataT, 3 > &color, blitz::RectDomain< 3 > &domain)
BlitzDataExplorer(blitz::Array< DataT, 3 > &data)
void move(int x, int y, int z)
void addCursor(QImage &qview, int x, int y)
blitz::TinyVector< double, 3 > getCurrentPos()
QImage arrayToColorQImage(const blitz::Array< DataT, 3 > &data)
void updateData(blitz::Array< DataT, 3 > &data)
void normalize(blitz::Array< DataT, Dim > &data, blitz::Array< DataT2, Dim2 > &normdata)
BlitzDataExplorer(blitz::Array< DataT, 4 > &data)
void updateData(blitz::Array< bool, 3 > &mask, DataT &grayValue, blitz::RectDomain< 3 > &domain)
void updateData(blitz::Array< DataT, 4 > &image, blitz::RectDomain< 4 > &domain)
bool all(blitz::TinyMatrix< bool, NRows, NColumns > const &matrix)
all() reduction for boolean blitz::TinyMatrix.
void setPos(int x, int y, int z)
blitz::TinyVector< int, 3 > m_size
blitz::Array< float, 4 > m_originalDataColor
void updateData(blitz::Array< DataT, 3 > &image, blitz::RectDomain< 3 > &domain)
Polynomial< CoeffT > pow(const Polynomial< CoeffT > &p, int exponential)
Power operator.
blitz::TinyVector< double, 3 > getCurrentCenter()