18 #ifndef PIC_UTIL_BUFFER_HPP 19 #define PIC_UTIL_BUFFER_HPP 23 #include "../base.hpp" 24 #include "../util/math.hpp" 25 #include "../util/array.hpp" 45 static T *
assign(T *buffer,
int n, T value)
55 #pragma omp parallel for 56 for(
int i = 0; i < n; i++) {
71 static T *
assign(T *bufferOut, T *bufferIn,
int n)
73 memcpy(bufferOut, bufferIn, n *
sizeof(T));
84 static T *
add(T *buffer,
int n, T value)
86 #pragma omp parallel for 88 for(
int i = 0; i < n; i++) {
103 static T *
add(T *bufferOut, T *bufferIn0, T *bufferIn1,
int n)
105 #pragma omp parallel for 106 for(
int i = 0; i < n; i++) {
107 bufferOut[i] = bufferIn0[i] + bufferIn1[i];
113 static T *
add(T *bufferOut, T *bufferIn,
int n)
115 #pragma omp parallel for 117 for(
int i = 0; i < n; i++) {
118 bufferOut[i] += bufferIn[i];
125 static T *
addS(T *bufferOut, T *bufferIn,
int n,
int channels)
127 #pragma omp parallel for 128 for(
int ind = 0; ind < n; ind++) {
129 int i = ind * channels;
131 float val = bufferIn[ind];
133 for(
int j = 0; j < channels; j++) {
134 bufferOut[i + j] += val;
148 static T *
mul(T *buffer,
int n, T value)
150 #pragma omp parallel for 151 for(
int i = 0; i < n; i++) {
167 static T *
mul(T *bufferOut, T *bufferIn0, T *bufferIn1,
int n)
169 #pragma omp parallel for 171 for(
int i = 0; i < n; i++) {
172 bufferOut[i] = bufferIn0[i] * bufferIn1[i];
185 static T *
mul(T *bufferOut, T *bufferIn,
int n)
187 #pragma omp parallel for 189 for(
int i = 0; i < n; i++) {
190 bufferOut[i] *= bufferIn[i];
204 static T *
mulS(T *bufferOut, T *bufferIn,
int n,
int channels)
206 #pragma omp parallel for 207 for(
int ind = 0; ind < n; ind++) {
208 int i = ind * channels;
210 float val = bufferIn[ind];
212 for(
int j = 0; j < channels; j++) {
213 bufferOut[i + j] *= val;
227 static T *
sub(T *buffer,
int n, T value)
229 #pragma omp parallel for 230 for(
int i = 0; i < n; i++) {
245 static T *
sub(T *bufferOut, T *bufferIn0, T *bufferIn1,
int n)
247 #pragma omp parallel for 248 for(
int i = 0; i < n; i++) {
249 bufferOut[i] = bufferIn0[i] - bufferIn1[i];
262 static T *
sub(T *bufferOut, T *bufferIn,
int n)
264 #pragma omp parallel for 265 for(
int i = 0; i < n; i++) {
266 bufferOut[i] -= bufferIn[i];
280 static T *
subS(T *bufferOut, T *bufferIn,
int n,
int channels)
282 #pragma omp parallel for 283 for(
int ind = 0; ind < n; ind++) {
284 int i = ind * channels;
286 float val = bufferIn[ind];
288 for(
int j = 0; j < channels; j++) {
289 bufferOut[i + j] -= val;
303 static T *
div(T *buffer,
int n, T value)
305 #pragma omp parallel for 306 for(
int i = 0; i < n; i++) {
321 static T *
div(T *bufferOut, T *bufferIn0, T *bufferIn1,
int n)
323 #pragma omp parallel for 325 for(
int i = 0; i < n; i++) {
326 bufferOut[i] = bufferIn0[i] / bufferIn1[i];
339 static T *
div(T *bufferOut, T *bufferIn,
int n)
341 #pragma omp parallel for 343 for(
int i = 0; i < n; i++) {
344 bufferOut[i] /= bufferIn[i];
358 static T *
divS(T *bufferOut, T *bufferIn,
int n,
int channels)
360 #pragma omp parallel for 361 for(
int ind = 0; ind < n; ind++) {
362 int i = ind * channels;
364 float val = bufferIn[ind];
366 for(
int j = 0; j < channels; j++) {
367 bufferOut[i + j] /= val;
382 static void flipH(T *buffer,
int width,
int height,
int channels,
385 int steps = width >> 1;
388 #pragma omp parallel for 390 for(
int i = 0; i < height; i++) {
393 for(
int j = 0; j < steps; j++) {
394 int i0 = (ind + j) * channels;
395 int i1 = (ind + width - j - 1) * channels;
397 for(
int k = 0; k < channels; k++) {
398 T tmp = buffer[i0 + k];
399 buffer[i0 + k] = buffer[i1 + k];
400 buffer[i1 + k] = tmp;
414 static void flipV(T *buffer,
int width,
int height,
int channels,
417 int steps = height >> 1;
420 #pragma omp parallel for 422 for(
int i = 0; i < steps; i++) {
423 int ind0 = i * width;
424 int ind1 = (height - i - 1) * width;
426 for(
int j = 0; j < width; j++) {
427 int i0 = (ind0 + j) * channels;
428 int i1 = (ind1 + j) * channels;
430 for(
int k = 0; k < channels; k++) {
431 T tmp = buffer[i0 + k];
432 buffer[i0 + k] = buffer[i1 + k];
433 buffer[i1 + k] = tmp;
447 static void rotate90CW(T *buffer,
int &width,
int &height,
int channels)
453 if(width == height) {
456 for(
int i = 0; i < n/2; i++) {
457 int i_n = n - i - 1 ;
459 for(
int j = i; j < (n - i - 1); j++) {
460 int j_n = n - j - 1 ;
462 int i0 = (i * n + j ) * channels;
463 int i1 = (j_n * n + i ) * channels;
464 int i2 = (i_n * n + j_n) * channels;
465 int i3 = (j * n + i_n) * channels;
468 for(
int k = 0; k < channels; k++) {
469 T tmp = buffer[i0 + k];
470 buffer[i0 + k] = buffer[i1 + k];
471 buffer[i1 + k] = buffer[i2 + k];
472 buffer[i2 + k] = buffer[i3 + k];
473 buffer[i3 + k] = tmp;
478 T *tmpBuffer =
new T[width * height * channels];
479 memcpy(tmpBuffer, buffer,
sizeof(T) * width * height * channels);
481 #pragma omp parallel for 482 for(
int i = 0; i < height; i++) {
483 for(
int j = 0; j < width; j++) {
484 int i0 = (i * width + j) * channels;
485 int i1 = (j * height + height - i - 1) * channels;
487 for(
int k = 0; k < channels; k++) {
488 buffer[i1 + k] = tmpBuffer[i0 + k];
508 static void rotate90CCW(T *buffer,
int &width,
int &height,
int channels)
514 if(width == height) {
515 #pragma omp parallel for 516 for(
int i = 0; i < (height - 2); i++) {
518 for(
int j = (i + 1); j < (width - 1); j++) {
520 int i0 = (i * width + j) * channels;
521 int i1 = (j * width + i) * channels;
523 for(
int k = 0; k < channels; k++) {
524 T tmp = buffer[i0 + k];
525 buffer[i0 + k] = buffer[i1 + k];
526 buffer[i1 + k] = tmp;
531 T *tmpBuffer =
new T[width * height * channels];
532 memcpy(tmpBuffer, buffer,
sizeof(T) * width * height * channels);
534 #pragma omp parallel for 535 for(
int i = 0; i < height; i++) {
536 for(
int j = 0; j < width; j++) {
537 int i0 = (i * width + j) * channels;
538 int i1 = ((width-j-1) * height + i) * channels;
540 for(
int k = 0; k < channels; k++) {
541 buffer[i1 + k] = tmpBuffer[i0 + k];
566 static T *
shift(T *bufferOut, T *bufferIn,
int dx,
int dy,
int width,
567 int height,
int channels,
int frames)
569 if(bufferOut == NULL) {
570 bufferOut =
new T[width * height * channels * frames];
573 #pragma omp parallel for 575 for(
int i = 0; i < height; i++) {
576 int tmp1 = i * width;
579 if((i2) < 0 || (i2 >= height)) {
581 for(
int j=0; j<width; j++){
582 int ind1 = (tmp1 + j) * channels;
583 for(
int k = 0; k < channels; k++) {
584 bufferOut[ind1 + k] = T(0);
589 int tmp2 = i2 * width;
591 for(
int j = 0; j < width; j++) {
593 int ind1 = (tmp1 + j) * channels;
595 if((j2) < 0 || (j2 >= width)) {
596 for(
int k = 0; k < channels; k++) {
597 bufferOut[ind1 + k] = T(0);
601 int ind2 = (tmp2 + j2) * channels;
603 for(
int k = 0; k < channels; k++) {
604 bufferOut[ind1 + k] = bufferIn[ind2 + k];
624 static T*
transpose(T *bufferOut, T *bufferIn,
int width,
int height,
625 int channels,
int frames)
627 if(bufferIn == NULL) {
631 if(bufferOut == NULL) {
632 bufferOut =
new T[width * height * channels * frames];
635 for(
int i = 0; i < height; i++) {
636 int indIn = i * width;
638 for(
int j = i; j < width; j++) {
639 indIn = (indIn + j) * channels;
641 int indOut = ((j * height) + i) * channels;
643 for(
int k = 0; k < channels; k++) {
644 bufferOut[indOut + k] = bufferIn[indIn + k];
659 static T*
BGRtoRGB(T *buffer,
int width,
int height,
660 int channels,
int frames)
662 int size = width * height * channels * frames;
663 for(
int i = 0; i < size; i += channels) {
665 buffer[i ] = buffer[i + 2];
682 #pragma omp parallel for 683 for(
int i = 0; i < n; i++) {
685 for(
int k = 0; k < channels; k++) {
688 int iOut = i * channels + k;
690 bufferOut[iOut] = bufferIn[iIn];
704 static T *
clone(T *bufferOut, T *bufferIn,
int n,
int channels)
706 if(bufferIn == NULL) {
710 if(bufferOut == NULL) {
711 bufferOut =
new T[n * channels];
714 memcpy(bufferOut, bufferIn, n * channels *
sizeof(T));
726 static void unique(T *buffer,
int n, std::set<T> &uniqueValues)
728 for(
int i = 0; i < n; i++) {
729 uniqueValues.insert(buffer[i]);
757 if(bufIn == NULL || bufOut == NULL || bi_channels != bo_channels) {
762 int sX, sY, eX, eY, dX, dY, shiftX, shiftY;
765 sX =
MIN(startX, bo_width);
768 sY =
MIN(startY, bo_height);
780 eX =
MIN(startX + bi_width, bo_width);
783 eY =
MIN(startY + bi_height, bo_height);
794 #pragma omp parallel for 795 for(
int j = sY; j < eY; j++) {
796 int index_bi = (j + shiftY) * bi_width;
797 int index_bo = j * bo_width;
799 for(
int i = sX; i < eX; i++) {
802 bufOut + index_bo + i);
static void rotate90CCW(T *buffer, int &width, int &height, int channels)
rotate90CCW rotates an image 90 CCW
Definition: buffer.hpp:508
static T * add(T *buffer, int n, T value)
add peforms addition
Definition: buffer.hpp:84
static T * sub(T *buffer, int n, T value)
sub
Definition: buffer.hpp:227
static T * mul(T *buffer, int n, T value)
mul multiplies a constant value
Definition: buffer.hpp:148
Definition: buffer.hpp:30
static T * sub(T *bufferOut, T *bufferIn0, T *bufferIn1, int n)
sub
Definition: buffer.hpp:245
static T * mulS(T *bufferOut, T *bufferIn, int n, int channels)
mulS
Definition: buffer.hpp:204
Buffer()
Definition: buffer.hpp:33
static T * sub(T *bufferOut, T *bufferIn, int n)
sub
Definition: buffer.hpp:262
static T * shift(T *bufferOut, T *bufferIn, int dx, int dy, int width, int height, int channels, int frames)
shift
Definition: buffer.hpp:566
static T * assign(T *bufferOut, T *bufferIn, int n)
assign assigns bufferIn to bufferOut
Definition: buffer.hpp:71
static void rotate90CW(T *buffer, int &width, int &height, int channels)
rotate90CW rotates an image 90 CW
Definition: buffer.hpp:447
static T * BufferFromLayerToIntervaleaved(T *bufferOut, T *bufferIn, int n, int channels)
BufferFromLayerToIntervaleaved change from RGB RGB RGB... to RRR... GGG... BBB... ...
Definition: buffer.hpp:680
static T * divS(T *bufferOut, T *bufferIn, int n, int channels)
divS
Definition: buffer.hpp:358
static void flipV(T *buffer, int width, int height, int channels, int frames)
flipV flips an image vertically
Definition: buffer.hpp:414
static T * div(T *buffer, int n, T value)
div divides by a constant value
Definition: buffer.hpp:303
static T * add(T *bufferOut, T *bufferIn0, T *bufferIn1, int n)
add
Definition: buffer.hpp:103
static void unique(T *buffer, int n, std::set< T > &uniqueValues)
unique
Definition: buffer.hpp:726
static T * mul(T *bufferOut, T *bufferIn, int n)
BufferMul.
Definition: buffer.hpp:185
static T * add(T *bufferOut, T *bufferIn, int n)
Definition: buffer.hpp:113
static T * clone(T *bufferOut, T *bufferIn, int n, int channels)
clone
Definition: buffer.hpp:704
static T * mul(T *bufferOut, T *bufferIn0, T *bufferIn1, int n)
mul
Definition: buffer.hpp:167
#define MIN(a, b)
Definition: math.hpp:69
static T * subS(T *bufferOut, T *bufferIn, int n, int channels)
subS
Definition: buffer.hpp:280
static void copySubBuffer(T *bufIn, int bi_width, int bi_height, int bi_channels, int startX, int startY, T *bufOut, int bo_width, int bo_height, int bo_channels)
copySubBuffer
Definition: buffer.hpp:746
Definition: bilateral_separation.hpp:25
static T * assign(T *data, int size, T *ret)
assign
Definition: array.hpp:464
#define MAX(a, b)
Definition: math.hpp:73
static void flipH(T *buffer, int width, int height, int channels, int frames)
flipH flips a buffer horizontally
Definition: buffer.hpp:382
static T * addS(T *bufferOut, T *bufferIn, int n, int channels)
Definition: buffer.hpp:125
static T * div(T *bufferOut, T *bufferIn, int n)
div
Definition: buffer.hpp:339
static T * BGRtoRGB(T *buffer, int width, int height, int channels, int frames)
BGRtoRGB swizzles from BGR to RGB a buffer.
Definition: buffer.hpp:659
static T * transpose(T *bufferOut, T *bufferIn, int width, int height, int channels, int frames)
transpose transposes a buffer
Definition: buffer.hpp:624
static T * assign(T *buffer, int n, T value)
assign assigns value to buffer
Definition: buffer.hpp:45
static T * div(T *bufferOut, T *bufferIn0, T *bufferIn1, int n)
div
Definition: buffer.hpp:321