4 #include "../math/utility.h"
5 #include "../math/Matrix.h"
7 #include "../oo/ObjBase.h"
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));
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));
54 Bitmap xyBlur(std::vector<double>
const& factor,
55 ssize_t dx, ssize_t dy)
const {
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++) {
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]);
71 ret.
pixel(y, x, sum / fsum);
97 Bitmap(
size_t h,
size_t w, Pixel
const& p): matrix_(h, w, p) {
130 void reset(
size_t h,
size_t w, Pixel
const& p) {
131 matrix_.
reset(h, w, p);
138 matrix_.
size(0, 0, Pixel(0));
145 return matrix_.
rows();
152 return matrix_.
cols();
159 return matrix_.
size();
169 size_t height(
size_t h2, Pixel
const& p) {
170 return matrix_.
rows(h2, p);
180 size_t width(
size_t w2, Pixel
const& p) {
181 return matrix_.
cols(w2, p);
192 size_t size(
size_t h2,
size_t w2, Pixel
const& p) {
193 return matrix_.
size(h2, w2, p);
203 Pixel
pixel(
size_t y,
size_t x)
const {
204 return matrix_.
entry(y, x);
215 Pixel
pixel(
size_t y,
size_t x, Pixel
const& p) {
216 return matrix_.
entry(y, x, p);
231 void pixels(ssize_t yFirst, ssize_t yLast,
232 ssize_t xFirst, ssize_t xLast,
234 return matrix_.
entries(yFirst, yLast, xFirst, xLast, p);
267 return (xyBlur(gaussianFactor1(radiusY), 1, 0).
268 xyBlur(gaussianFactor1(radiusX), 0, 1));
291 return (xyBlur(gaussianFactor1(radiusY), 1, 0).
292 xyBlur(gradianceFactor1(radiusX), 0, 1));
314 return (xyBlur(gaussianFactor1(radiusX), 0, 1).
315 xyBlur(gradianceFactor1(radiusY), 1, 0));
346 Pixel
const&
operator()(
size_t y,
size_t x, Pixel
const& p)
const {
347 return pixel(y, x, p);
354 bool write(FILE* f,
bool bin,
unsigned int fg)
const {
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;
363 if (fprintf(f,
"%ld %ld\n", (
long)matrix_.
cols(), (long)matrix_.
rows())
373 bool read(FILE* f,
bool bin,
unsigned int fg) {
378 if (fread(&tmp1,
sizeof(tmp1), 1, f) < 1)
return false;
379 if (fread(&tmp2,
sizeof(tmp2), 1, f) < 1)
return false;
382 if (fscanf(f,
"%ld %ld", &tmp1, &tmp2) < 2)
return false;
384 matrix_.
size(tmp1, tmp2, Pixel(0));
414 return typeid(*this).name();
422 return std::string(
ctype());
428 #endif // gra_Bitmap_H__
Bitmap< Pixel > gradianceY(double radiusY, double radiusX) const
回傳對y偏微分
ObjBase * copyFrom(ObjBase const *b)
複製資料
void pixels(ssize_t yFirst, ssize_t yLast, ssize_t xFirst, ssize_t xLast, Pixel const &p)
區塊修改
Bitmap(size_t h, size_t w, Pixel const &p)
constructor, 指定寬高, 預設Pixel
size_t size(size_t h2, size_t w2, Pixel const &p)
修改寬高
Matrix & referenceFrom(Matrix const &m)
reference
Pixel operator()(size_t y, size_t x) const
same as pixel(y, x)
size_t height() const
回傳高度
size_t rows() const
Return number of rows.
Pixel const & operator()(size_t y, size_t x, Pixel const &p) const
same as pixel(y, x, p)
char const * ctype() const
回傳class的type
Bitmap & operator=(Bitmap const &b)
same as copyFrom(b)
Bitmap< Pixel > gradianceX(double radiusY, double radiusX) const
回傳對x偏微分
Bitmap gaussian(double radiusY, double radiusX) const
回傳高斯模糊
size_t cols() const
Return number of cols.
Matrix< Pixel > const & matrix() const
回傳矩陣形式
Bitmap()
constructor, 產生一個空的Bitmap
Bitmap(Bitmap const &b)
constructor, 複製一個bitmap
bool read(FILE *f, bool bin, unsigned int fg)
將資料讀入
Bitmap< Pixel > & gaussianed(double radiusY, double radiusX)
把自己高斯模糊
Matrix< Pixel > & matrixGet()
回傳矩陣形式 (non-constant form)
Pixel pixel(size_t y, size_t x) const
取得 (y, x) 的pixel
size_t width() const
回傳寬度
bool write(FILE *f, bool bin, unsigned int fg) const
將資料寫入檔案
Matrix & copyFrom(Matrix const &m)
copy
一切物件的Base, 並要求每個物件都要有read, write, create, ... 等功能
Bitmap & copyFrom(Bitmap const &b)
複製
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.
size_t size() const
Return number of rows times number of cols.
size_t size() const
回傳高度乘以寬度
Pixel pixel(size_t y, size_t x, Pixel const &p)
修改 (y, x) 的pixel
size_t width(size_t w2, Pixel const &p)
修改寬度
void reset(size_t h, size_t w, Pixel const &p)
全部重設
std::string type() const
回傳class的type
Matrix< Pixel > const & matrix(Matrix< Pixel > const &p)
直接設定
Bitmap & referenceFrom(Bitmap const &b)
reference
Entry entry(size_t r, size_t c) const
Access the entry at r x c.
Bitmap< Pixel > & gradiancedX(double radiusY, double radiusX)
把自己對x偏微分
size_t height(size_t h2, Pixel const &p)
修改高度
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
ObjBase * create() const
new一個自己
Bitmap< Pixel > & gradiancedY(double radiusY, double radiusX)
把自己對y偏微分