Templates -- Meow  1.1.4
A C++ template which is unable and also not allowed to compile to obj-file first.
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 
22 template<class Pixel>
23 class Bitmap: public ObjBase {
24 private:
25  Matrix<Pixel> matrix_;
26 
28  static std::vector<double> gaussianFactor1(double sigma) {
29  double sigma2 = squ(sigma);
30  size_t width = std::max(ceil((double)(sigma * 2)), 0.0);
31  std::vector<double> factor(width + 1 + width);
32  for (size_t x = 0; x < width; x++) {
33  factor[width - x - 1] = exp(-(squ((double)x)) / (2.0 * sigma2));
34  factor[width + x + 1] = exp(-(squ((double)x)) / (2.0 * sigma2));
35  }
36  factor[width] = 1.0;
37  return factor;
38  }
39 
41  static std::vector<double> gradianceFactor1(double sigma) {
42  double sigma2 = squ(sigma), ss = sigma * 2;
43  size_t width = std::max(ceil(ss), 1.0);
44  std::vector<double> factor(width + 1 + width);
45  for (size_t x = 0; x < width; x++) {
46  factor[width - x - 1] = (double)x * exp(-(squ((double)x))/(2.0*sigma2));
47  factor[width + x + 1] = -(double)x * exp(-(squ((double)x))/(2.0*sigma2));
48  }
49  factor[width] = 0.0;
50  return factor;
51  }
52 
54  Bitmap xyBlur(std::vector<double> const& factor,
55  ssize_t dx, ssize_t dy) const {
56  Bitmap ret(*this);
57  if (factor.size() > 0) {
58  ssize_t w = factor.size() / 2;
59  for (size_t y = 0, Y = height(); y < Y; y++) {
60  for (size_t x = 0, X = width(); x < X; x++) {
61  Pixel sum(0);
62  double fsum(0);
63  for (ssize_t i = -w; i <= w; i++) {
64  ssize_t x2 = (ssize_t)x + dx * i;
65  ssize_t y2 = (ssize_t)y + dy * i;
66  if (0 <= x2 && x2 < (ssize_t)X && 0 <= y2 && y2 < (ssize_t)Y) {
67  sum = sum + pixel(y2, x2) * factor[i + w];
68  fsum = fsum + fabs(factor[i + w]);
69  }
70  }
71  ret.pixel(y, x, sum / fsum);
72  }
73  }
74  }
75  return ret;
76  }
77 public:
81  Bitmap() {
82  }
83 
87  Bitmap(Bitmap const& b): matrix_(b.matrix_) {
88  }
89 
97  Bitmap(size_t h, size_t w, Pixel const& p): matrix_(h, w, p) {
98  }
99 
104  }
105 
109  Bitmap& copyFrom(Bitmap const& b) {
110  matrix_.copyFrom(b.matrix_);
111  return *this;
112  }
113 
118  matrix_.referenceFrom(b.matrix_);
119  return *this;
120  }
121 
130  void reset(size_t h, size_t w, Pixel const& p) {
131  matrix_.reset(h, w, p);
132  }
133 
137  void clear() {
138  matrix_.size(0, 0, Pixel(0));
139  }
140 
144  size_t height() const {
145  return matrix_.rows();
146  }
147 
151  size_t width() const {
152  return matrix_.cols();
153  }
154 
158  size_t size() const {
159  return matrix_.size();
160  }
161 
169  size_t height(size_t h2, Pixel const& p) {
170  return matrix_.rows(h2, p);
171  }
172 
180  size_t width(size_t w2, Pixel const& p) {
181  return matrix_.cols(w2, p);
182  }
183 
192  size_t size(size_t h2, size_t w2, Pixel const& p) {
193  return matrix_.size(h2, w2, p);
194  }
195 
203  Pixel pixel(size_t y, size_t x) const {
204  return matrix_.entry(y, x);
205  }
206 
215  Pixel pixel(size_t y, size_t x, Pixel const& p) {
216  return matrix_.entry(y, x, p);
217  }
218 
231  void pixels(ssize_t yFirst, ssize_t yLast,
232  ssize_t xFirst, ssize_t xLast,
233  Pixel const& p) {
234  return matrix_.entries(yFirst, yLast, xFirst, xLast, p);
235  }
236 
240  Matrix<Pixel> const& matrix() const {
241  return matrix_;
242  }
243 
248  return matrix_;
249  }
250 
254  Matrix<Pixel> const& matrix(Matrix<Pixel> const& p) {
255  matrix_.copyFrom(p);
256  return matrix();
257  }
258 
266  Bitmap gaussian(double radiusY, double radiusX) const {
267  return (xyBlur(gaussianFactor1(radiusY), 1, 0).
268  xyBlur(gaussianFactor1(radiusX), 0, 1));
269  }
270 
278  Bitmap<Pixel>& gaussianed(double radiusY, double radiusX) {
279  copyFrom(gaussian(radiusY, radiusX));
280  return *this;
281  }
282 
290  Bitmap<Pixel> gradianceX(double radiusY, double radiusX) const {
291  return (xyBlur(gaussianFactor1(radiusY), 1, 0).
292  xyBlur(gradianceFactor1(radiusX), 0, 1));
293  }
294 
302  Bitmap<Pixel>& gradiancedX(double radiusY, double radiusX) {
303  return copyFrom(gradianceX(radiusY, radiusX));
304  }
305 
313  Bitmap<Pixel> gradianceY (double radiusY, double radiusX) const {
314  return (xyBlur(gaussianFactor1(radiusX), 0, 1).
315  xyBlur(gradianceFactor1(radiusY), 1, 0));
316  }
317 
325  Bitmap<Pixel>& gradiancedY(double radiusY, double radiusX) {
326  return copyFrom(gradianceY(radiusY, radiusX));
327  }
328 
332  Bitmap& operator=(Bitmap const& b) {
333  return copyFrom(b);
334  }
335 
339  Pixel operator()(size_t y, size_t x) const {
340  return pixel(y, x);
341  }
342 
346  Pixel const& operator()(size_t y, size_t x, Pixel const& p) const {
347  return pixel(y, x, p);
348  }
349 
354  bool write(FILE* f, bool bin, unsigned int fg) const {
355  if (fg & 1)
356  return false;
357  if (bin) {
358  long tmp;
359  if (fwrite(&(tmp = matrix_.cols()), sizeof(tmp), 1, f) < 1) return false;
360  if (fwrite(&(tmp = matrix_.rows()), sizeof(tmp), 1, f) < 1) return false;
361  }
362  else {
363  if (fprintf(f, "%ld %ld\n", (long)matrix_.cols(), (long)matrix_.rows())
364  < 2) return false;
365  }
366  return true;
367  }
368 
373  bool read(FILE* f, bool bin, unsigned int fg) {
374  if (fg & 1)
375  return false;
376  long tmp1, tmp2;
377  if (bin) {
378  if (fread(&tmp1, sizeof(tmp1), 1, f) < 1) return false;
379  if (fread(&tmp2, sizeof(tmp2), 1, f) < 1) return false;
380  }
381  else {
382  if (fscanf(f, "%ld %ld", &tmp1, &tmp2) < 2) return false;
383  }
384  matrix_.size(tmp1, tmp2, Pixel(0));
385  return true;
386  }
387 
392  ObjBase* create() const {
393  return new Bitmap();
394  }
395 
405  ObjBase* copyFrom(ObjBase const* b) {
406  return &(copyFrom(*(Bitmap*)b));
407  }
408 
413  char const* ctype() const{
414  return typeid(*this).name();
415  }
416 
421  std::string type() const {
422  return std::string(ctype());
423  }
424 };
425 
426 } // meow
427 
428 #endif // gra_Bitmap_H__
Bitmap< Pixel > gradianceY(double radiusY, double radiusX) const
回傳對y偏微分
Definition: Bitmap.h:313
ObjBase * copyFrom(ObjBase const *b)
複製資料
Definition: Bitmap.h:405
void pixels(ssize_t yFirst, ssize_t yLast, ssize_t xFirst, ssize_t xLast, Pixel const &p)
區塊修改
Definition: Bitmap.h:231
Bitmap(size_t h, size_t w, Pixel const &p)
constructor, 指定寬高, 預設Pixel
Definition: Bitmap.h:97
size_t size(size_t h2, size_t w2, Pixel const &p)
修改寬高
Definition: Bitmap.h:192
Matrix & referenceFrom(Matrix const &m)
reference
Definition: Matrix.h:101
Pixel operator()(size_t y, size_t x) const
same as pixel(y, x)
Definition: Bitmap.h:339
size_t height() const
回傳高度
Definition: Bitmap.h:144
size_t rows() const
Return number of rows.
Definition: Matrix.h:120
void clear()
清除資料, 寬高階規零
Definition: Bitmap.h:137
Pixel const & operator()(size_t y, size_t x, Pixel const &p) const
same as pixel(y, x, p)
Definition: Bitmap.h:346
char const * ctype() const
回傳class的type
Definition: Bitmap.h:413
Bitmap & operator=(Bitmap const &b)
same as copyFrom(b)
Definition: Bitmap.h:332
Bitmap< Pixel > gradianceX(double radiusY, double radiusX) const
回傳對x偏微分
Definition: Bitmap.h:290
Bitmap gaussian(double radiusY, double radiusX) const
回傳高斯模糊
Definition: Bitmap.h:266
size_t cols() const
Return number of cols.
Definition: Matrix.h:125
Matrix< Pixel > const & matrix() const
回傳矩陣形式
Definition: Bitmap.h:240
Bitmap()
constructor, 產生一個空的Bitmap
Definition: Bitmap.h:81
Bitmap(Bitmap const &b)
constructor, 複製一個bitmap
Definition: Bitmap.h:87
二維點陣資料
Definition: Bitmap.h:23
bool read(FILE *f, bool bin, unsigned int fg)
將資料讀入
Definition: Bitmap.h:373
Bitmap< Pixel > & gaussianed(double radiusY, double radiusX)
把自己高斯模糊
Definition: Bitmap.h:278
Matrix< Pixel > & matrixGet()
回傳矩陣形式 (non-constant form)
Definition: Bitmap.h:247
Pixel pixel(size_t y, size_t x) const
取得 (y, x) 的pixel
Definition: Bitmap.h:203
size_t width() const
回傳寬度
Definition: Bitmap.h:151
bool write(FILE *f, bool bin, unsigned int fg) const
將資料寫入檔案
Definition: Bitmap.h:354
Matrix & copyFrom(Matrix const &m)
copy
Definition: Matrix.h:88
一切物件的Base, 並要求每個物件都要有read, write, create, ... 等功能
Definition: ObjBase.h:15
Bitmap & copyFrom(Bitmap const &b)
複製
Definition: Bitmap.h:109
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:218
size_t size() const
Return number of rows times number of cols.
Definition: Matrix.h:130
size_t size() const
回傳高度乘以寬度
Definition: Bitmap.h:158
Pixel pixel(size_t y, size_t x, Pixel const &p)
修改 (y, x) 的pixel
Definition: Bitmap.h:215
~Bitmap()
destructor
Definition: Bitmap.h:103
size_t width(size_t w2, Pixel const &p)
修改寬度
Definition: Bitmap.h:180
void reset(size_t h, size_t w, Pixel const &p)
全部重設
Definition: Bitmap.h:130
std::string type() const
回傳class的type
Definition: Bitmap.h:421
Matrix< Pixel > const & matrix(Matrix< Pixel > const &p)
直接設定
Definition: Bitmap.h:254
Bitmap & referenceFrom(Bitmap const &b)
reference
Definition: Bitmap.h:117
Entry entry(size_t r, size_t c) const
Access the entry at r x c.
Definition: Matrix.h:193
Bitmap< Pixel > & gradiancedX(double radiusY, double radiusX)
把自己對x偏微分
Definition: Bitmap.h:302
size_t height(size_t h2, Pixel const &p)
修改高度
Definition: Bitmap.h:169
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:107
ObjBase * create() const
new一個自己
Definition: Bitmap.h:392
T squ(T const &x)
x*x
Definition: utility.h:67
Bitmap< Pixel > & gradiancedY(double radiusY, double radiusX)
把自己對y偏微分
Definition: Bitmap.h:325