Templates -- Meow  1.2.10
A C++ template contains kinds of interesting classes and functions
Bitmap.h
Go to the documentation of this file.
1 #ifndef gra_Bitmap_H__
2 #define gra_Bitmap_H__
3 
4 #include "../math/utility.h"
5 #include "../math/Matrix.h"
6 
7 #include "../oo/ObjBase.h"
8 
9 #include <vector>
10 #include <cmath>
11 #include <string>
12 #include <typeinfo>
13 #include <cstdlib>
14 
15 namespace meow {
16 
17 const unsigned int kBitmapReadWritePixels = 0x1;
18 
24 template<class Pixel>
25 class Bitmap: public ObjBase {
26 private:
27  Matrix<Pixel> matrix_;
28 
30  static std::vector<double> gaussianFactor1(double sigma) {
31  double sigma2 = squ(sigma);
32  size_t width = std::max(ceil((double)(sigma * 2)), 0.0);
33  std::vector<double> factor(width + 1 + width);
34  for (size_t x = 0; x < width; x++) {
35  double e = exp(-(squ((double)x)) / (2.0 * sigma2));
36  factor[width - x - 1] = e;
37  factor[width + x + 1] = e;
38  }
39  factor[width] = 1.0;
40  return factor;
41  }
42 
44  static std::vector<double> gradianceFactor1(double sigma) {
45  double sigma2 = squ(sigma), ss = sigma * 2;
46  size_t width = std::max(ceil(ss), 1.0);
47  std::vector<double> factor(width + 1 + width);
48  for (size_t x = 0; x < width; x++) {
49  double e = exp(-(squ((double)x)) / (2.0 * sigma2));
50  factor[width - x - 1] = (double)x * e;
51  factor[width + x + 1] = -(double)x * e;
52  }
53  factor[width] = 0.0;
54  return factor;
55  }
56 
58  Bitmap xyBlur(std::vector<double> const& factor,
59  ssize_t dx, ssize_t dy) const {
60  if (factor.size() <= 1)
61  return *this;
62  Bitmap ret(height(), width(), Pixel(0));
63  ssize_t w = factor.size() / 2;
64  for (size_t y = 0, Y = height(); y < Y; y++)
65  for (size_t x = 0, X = width(); x < X; x++) {
66  Pixel sum(0);
67  double fsum(0);
68  for (ssize_t i = -w; i <= w; i++) {
69  ssize_t x2 = (ssize_t)x + dx * i;
70  ssize_t y2 = (ssize_t)y + dy * i;
71  if (0 <= x2 && x2 < (ssize_t)X && 0 <= y2 && y2 < (ssize_t)Y) {
72  sum = sum + pixel(y2, x2) * factor[i + w];
73  fsum = fsum + fabs(factor[i + w]);
74  }
75  }
76  ret.pixel(y, x, sum / fsum);
77  }
78  return ret;
79  }
80 public:
84  Bitmap() {
85  }
86 
90  Bitmap(Bitmap const& b): matrix_(b.matrix_) {
91  }
92 
96  Bitmap(Matrix<Pixel> const& b): matrix_(b) {
97  }
98 
106  Bitmap(size_t h, size_t w, Pixel const& p): matrix_(h, w, p) {
107  }
108 
113  }
114 
118  Bitmap& copyFrom(Bitmap const& b) {
119  matrix_.copyFrom(b.matrix_);
120  return *this;
121  }
122 
127  matrix_.referenceFrom(b.matrix_);
128  return *this;
129  }
130 
139  void reset(size_t h, size_t w, Pixel const& p) {
140  matrix_.reset(h, w, p);
141  }
142 
146  void clear() {
147  matrix_.clear();
148  }
149 
153  size_t height() const {
154  return matrix_.rows();
155  }
156 
160  size_t width() const {
161  return matrix_.cols();
162  }
163 
167  size_t size() const {
168  return matrix_.size();
169  }
170 
178  size_t height(size_t h2, Pixel const& p) {
179  return matrix_.rows(h2, p);
180  }
181 
189  size_t width(size_t w2, Pixel const& p) {
190  return matrix_.cols(w2, p);
191  }
192 
201  size_t size(size_t h2, size_t w2, Pixel const& p) {
202  return matrix_.size(h2, w2, p);
203  }
204 
212  Pixel pixel(size_t y, size_t x) const {
213  return matrix_.entry(y, x);
214  }
215 
224  Pixel pixel(size_t y, size_t x, Pixel const& p) {
225  return matrix_.entry(y, x, p);
226  }
227 
240  void pixels(ssize_t yFirst, ssize_t yLast,
241  ssize_t xFirst, ssize_t xLast,
242  Pixel const& p) {
243  return matrix_.entries(yFirst, yLast, xFirst, xLast, p);
244  }
245 
250  return matrix_;
251  }
252 
257  return matrix_;
258  }
259 
264  matrix_.copyFrom(p);
265  return matrix();
266  }
267 
275  Bitmap gaussian(double radiusY, double radiusX) const {
276  return (xyBlur(gaussianFactor1(radiusY), 1, 0).
277  xyBlur(gaussianFactor1(radiusX), 0, 1));
278  }
279 
287  Bitmap& gaussianed(double radiusY, double radiusX) {
288  return copyFrom(gaussian(radiusY, radiusX));
289  }
290 
298  Bitmap gradianceX(double radiusY, double radiusX) const {
299  return (xyBlur(gaussianFactor1(radiusY), 1, 0).
300  xyBlur(gradianceFactor1(radiusX), 0, 1));
301  }
302 
310  Bitmap<Pixel>& gradiancedX(double radiusY, double radiusX) {
311  return copyFrom(gradianceX(radiusY, radiusX));
312  }
313 
321  Bitmap<Pixel> gradianceY (double radiusY, double radiusX) const {
322  return (xyBlur(gaussianFactor1(radiusX), 0, 1).
323  xyBlur(gradianceFactor1(radiusY), 1, 0));
324  }
325 
333  Bitmap<Pixel>& gradiancedY(double radiusY, double radiusX) {
334  return copyFrom(gradianceY(radiusY, radiusX));
335  }
336 
340  Bitmap& operator=(Bitmap const& b) {
341  return copyFrom(b);
342  }
343 
347  Pixel operator()(size_t y, size_t x) const {
348  return pixel(y, x);
349  }
350 
354  Pixel const& operator()(size_t y, size_t x, Pixel const& p) const {
355  return pixel(y, x, p);
356  }
357 
362  bool write(FILE* f, bool bin, unsigned int fg) const {
363  if (fg & kBitmapReadWritePixels)
364  return false;
365  if (bin) {
366  long tmp;
367  if (fwrite(&(tmp = matrix_.cols()), sizeof(tmp), 1, f) < 1) return false;
368  if (fwrite(&(tmp = matrix_.rows()), sizeof(tmp), 1, f) < 1) return false;
369  }
370  else {
371  if (fprintf(f, "%ld %ld\n", (long)matrix_.cols(), (long)matrix_.rows())
372  < 2) return false;
373  }
374  return true;
375  }
376 
381  bool read(FILE* f, bool bin, unsigned int fg) {
382  if (fg & kBitmapReadWritePixels)
383  return false;
384  long tmp1, tmp2;
385  if (bin) {
386  if (fread(&tmp1, sizeof(tmp1), 1, f) < 1) return false;
387  if (fread(&tmp2, sizeof(tmp2), 1, f) < 1) return false;
388  }
389  else {
390  if (fscanf(f, "%ld %ld", &tmp1, &tmp2) < 2) return false;
391  }
392  matrix_.size(tmp1, tmp2, Pixel(0));
393  return true;
394  }
395 
400  ObjBase* create() const {
401  return new Bitmap();
402  }
403 
413  ObjBase* copyFrom(ObjBase const* b) {
414  return &(copyFrom(*(Bitmap const*)b));
415  }
416 
421  char const* ctype() const{
422  return typeid(*this).name();
423  }
424 
429  std::string type() const {
430  return std::string(ctype());
431  }
432 };
433 
434 
435 } // meow
436 
437 #endif // gra_Bitmap_H__
Bitmap< Pixel > gradianceY(double radiusY, double radiusX) const
回傳對y偏微分
Definition: Bitmap.h:321
ObjBase * copyFrom(ObjBase const *b)
複製資料
Definition: Bitmap.h:413
void pixels(ssize_t yFirst, ssize_t yLast, ssize_t xFirst, ssize_t xLast, Pixel const &p)
區塊修改
Definition: Bitmap.h:240
Bitmap(size_t h, size_t w, Pixel const &p)
constructor, 指定寬高, 預設Pixel
Definition: Bitmap.h:106
size_t size(size_t h2, size_t w2, Pixel const &p)
修改寬高
Definition: Bitmap.h:201
Matrix & referenceFrom(Matrix const &m)
reference
Definition: Matrix.h:110
Pixel operator()(size_t y, size_t x) const
same as pixel(y, x)
Definition: Bitmap.h:347
size_t height() const
回傳高度
Definition: Bitmap.h:153
size_t rows() const
Return number of rows.
Definition: Matrix.h:129
void clear()
清除資料, 寬高階規零
Definition: Bitmap.h:146
Pixel const & operator()(size_t y, size_t x, Pixel const &p) const
same as pixel(y, x, p)
Definition: Bitmap.h:354
const unsigned int kBitmapReadWritePixels
Definition: Bitmap.h:17
char const * ctype() const
回傳class的type
Definition: Bitmap.h:421
Bitmap & operator=(Bitmap const &b)
same as copyFrom(b)
Definition: Bitmap.h:340
Bitmap gaussian(double radiusY, double radiusX) const
回傳高斯模糊
Definition: Bitmap.h:275
size_t cols() const
Return number of cols.
Definition: Matrix.h:134
Bitmap()
constructor, 產生一個空的Bitmap
Definition: Bitmap.h:84
Matrix< Pixel > matrix() const
回傳矩陣形式
Definition: Bitmap.h:249
Bitmap(Bitmap const &b)
constructor, 複製一個bitmap
Definition: Bitmap.h:90
Matrix< Pixel > matrix(Matrix< Pixel > const &p)
直接設定
Definition: Bitmap.h:263
二維點陣資料
Definition: Bitmap.h:25
bool read(FILE *f, bool bin, unsigned int fg)
將資料讀入
Definition: Bitmap.h:381
Matrix< Pixel > & matrixGet()
回傳矩陣形式 (non-constant form)
Definition: Bitmap.h:256
Pixel pixel(size_t y, size_t x) const
取得 (y, x) 的pixel
Definition: Bitmap.h:212
size_t width() const
回傳寬度
Definition: Bitmap.h:160
bool write(FILE *f, bool bin, unsigned int fg) const
將資料寫入檔案
Definition: Bitmap.h:362
Matrix & copyFrom(Matrix const &m)
copy
Definition: Matrix.h:97
一切物件的Base, 並要求每個物件都要有read, write, create, ... 等功能
Definition: ObjBase.h:15
Bitmap & copyFrom(Bitmap const &b)
複製
Definition: Bitmap.h:118
void entries(ssize_t rFirst, ssize_t rLast, ssize_t cFirst, ssize_t cLast, Entry const &e)
Change the entries from rFirst x cFirst to rLast x cLast.
Definition: Matrix.h:237
size_t size() const
Return number of rows times number of cols.
Definition: Matrix.h:139
size_t size() const
回傳高度乘以寬度
Definition: Bitmap.h:167
void clear()
free the memory
Definition: Matrix.h:204
Pixel pixel(size_t y, size_t x, Pixel const &p)
修改 (y, x) 的pixel
Definition: Bitmap.h:224
~Bitmap()
destructor
Definition: Bitmap.h:112
Bitmap gradianceX(double radiusY, double radiusX) const
回傳對x偏微分
Definition: Bitmap.h:298
size_t width(size_t w2, Pixel const &p)
修改寬度
Definition: Bitmap.h:189
Bitmap(Matrix< Pixel > const &b)
constructor, copy data from a matrix
Definition: Bitmap.h:96
void reset(size_t h, size_t w, Pixel const &p)
全部重設
Definition: Bitmap.h:139
std::string type() const
回傳class的type
Definition: Bitmap.h:429
Bitmap & referenceFrom(Bitmap const &b)
reference
Definition: Bitmap.h:126
Entry entry(size_t r, size_t c) const
Access the entry at r x c.
Definition: Matrix.h:212
Bitmap< Pixel > & gradiancedX(double radiusY, double radiusX)
把自己對x偏微分
Definition: Bitmap.h:310
size_t height(size_t h2, Pixel const &p)
修改高度
Definition: Bitmap.h:178
void reset(size_t r, size_t c, Entry const &e)
reset the size of the matrix to r x c with entry all be e
Definition: Matrix.h:116
Bitmap & gaussianed(double radiusY, double radiusX)
把自己高斯模糊
Definition: Bitmap.h:287
ObjBase * create() const
new一個自己
Definition: Bitmap.h:400
T squ(T const &x)
x*x
Definition: utility.h:77
Bitmap< Pixel > & gradiancedY(double radiusY, double radiusX)
把自己對y偏微分
Definition: Bitmap.h:333