canezzy

imageProcessing2

Mar 21st, 2018
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.07 KB | None | 0 0
  1. #include <float.h>
  2. #include <stdio.h>
  3. #include <cilk/cilk.h>
  4. #include <cilk/reducer_opadd.h>
  5. #include "ImageProcessing.h"
  6.  
  7. /**
  8. * @brief Serial version of moving average filter.
  9. * @param inBuffer buffer of input image
  10. * @param outBuffer buffer of output image
  11. * @param width image width
  12. * @param height image height
  13. */
  14. void filterSerialAvg(int* inBuffer, int* outBuffer, int width, int height)
  15. {
  16.     // loop through pixels
  17.     for (int i = OFFSET; i < width - OFFSET; i++)
  18.     {
  19.         for (int j = OFFSET; j < height - OFFSET; j++)
  20.         {
  21.             // digital convolution - filtering
  22.             for (int m = -OFFSET; m <= OFFSET; m++)
  23.             {
  24.                 for (int n = -OFFSET; n <= OFFSET; n++)
  25.                 {
  26.                     outBuffer[j * width + i] += inBuffer[(j + n) * width + (i + m)] / KERNEL_SIZE;
  27.                 }
  28.             }
  29.         }
  30.     }
  31. }
  32.  
  33.  
  34. /**
  35. * @brief Parallel version of moving average filter.
  36. *
  37. * @param inBuffer buffer of input image
  38. * @param outBuffer buffer of output image
  39. * @param width image width
  40. * @param height image height
  41. */
  42. void filterParallelAvg(int* inBuffer, int* outBuffer, int width, int height)
  43. {
  44.     // loop through pixels
  45.     cilk_for (int i = OFFSET; i < width - OFFSET; i++)
  46.     {
  47.         cilk_for (int j = OFFSET; j < height - OFFSET; j++)
  48.         {
  49.             // digital convolution - filtering
  50.             for (int m = -OFFSET; m <= OFFSET; m++)
  51.             {
  52.                 outBuffer[j * width + i] += __sec_reduce_add(inBuffer[(j - m) * width + (i - OFFSET) : KERNEL_LENGTH] / KERNEL_SIZE);
  53.                 /*for (int n = -OFFSET; n <= OFFSET; n++)
  54.                 {
  55.                     outBuffer[j * width + i] += __sec_reduce_add(inBuffer[(j - m) * width + (i - OFFSET) : KERNEL_LENGTH] / KERNEL_SIZE); inBuffer[(j + n) * width + (i + m)] / KERNEL_SIZE;
  56.                 }*/
  57.             }
  58.         }
  59.     }
  60. }
  61.  
  62.  
  63. /**
  64. * @brief Serial version of median filter.
  65. * @param inBuffer buffer of input image
  66. * @param outBuffer buffer of output image
  67. * @param width image width
  68. * @param height image height
  69. */
  70. void filterSerialMed(int *inBuffer, int *outBuffer, int width, int height) {
  71.  
  72.     int temp[KERNEL_SIZE];
  73.     int offset = KERNEL_LENGTH/2;
  74.  
  75.     // loop through pixels
  76.     for (int i = offset; i < width - offset; i ++) {
  77.         for (int j = offset; j < height - offset; j++) {            
  78.  
  79.             int idx = 0;
  80.             // extract pixels
  81.             for (int m = -offset; m <= offset; m++) {
  82.                 for (int n = -offset; n <= offset; n++) {
  83.                     temp[idx++] = inBuffer[(j + n) * width + (i + m)];
  84.                 }
  85.             }
  86.  
  87.             // sort
  88.             for(idx = 0; idx < KERNEL_SIZE-1; idx++)
  89.             {
  90.                 int minIdx = idx;
  91.                 for(int sortIdx = idx+1; sortIdx < KERNEL_SIZE; sortIdx++)
  92.                 {
  93.                     if(temp[sortIdx]<temp[minIdx]){
  94.                         minIdx = sortIdx;
  95.                     }  
  96.                 }
  97.                 if(idx!=minIdx){
  98.                     int swap = temp[idx];
  99.                     temp[idx] = temp[minIdx];
  100.                     temp[minIdx] = swap;
  101.                 }
  102.             }
  103.  
  104.             // store central pixel
  105.             outBuffer[j * width + i] = temp[KERNEL_SIZE/2];
  106.         }
  107.     }
  108. }
  109.  
  110.  
  111. /**
  112. * @brief Parallel version of median filter.
  113. *
  114. * @param inBuffer buffer of input image
  115. * @param outBuffer buffer of output image
  116. * @param width image width
  117. * @param height image height
  118. */
  119.  
  120. void parFunc1(int* temp, int* inBuffer, int i, int j, int width, int offset) {
  121.     int idx = 0;
  122.     // extract pixels
  123.     for (int m = -offset; m <= offset; m++) {
  124.         for (int n = -offset; n <= offset; n++) {
  125.             temp[idx++] = inBuffer[(j + n) * width + (i + m)];
  126.         }
  127.     }
  128. }
  129.  
  130. void parFunc2(int* temp) {
  131.     for (int idx = 0; idx < KERNEL_SIZE - 1; idx++)
  132.     {
  133.         int minIdx = __sec_reduce_min_ind(temp[idx:KERNEL_SIZE - idx]);
  134.         /*for (int sortIdx = idx + 1; sortIdx < KERNEL_SIZE; sortIdx++)
  135.         {
  136.         if (temp[sortIdx]<temp[minIdx]) {
  137.         minIdx = sortIdx;
  138.         }
  139.         }*/
  140.         if (idx != minIdx) {
  141.             int swap = temp[idx];
  142.             temp[idx] = temp[minIdx];
  143.             temp[minIdx] = swap;
  144.         }
  145.     }
  146. }
  147.  
  148. void filterParallelMed(int* inBuffer, int* outBuffer, int width, int height)
  149. {
  150.     int temp[KERNEL_SIZE];
  151.     int offset = KERNEL_LENGTH / 2;
  152.  
  153.     // loop through pixels
  154.     for (int i = offset; i < width - offset; i++) {
  155.         for (int j = offset; j < height - offset; j++) {
  156.  
  157.             parFunc1(temp, inBuffer, i, j, width, offset);
  158.  
  159.             // sort
  160.             parFunc2(temp);
  161.  
  162.             // store central pixel
  163.             outBuffer[j * width + i] = temp[KERNEL_SIZE / 2];
  164.         }
  165.     }
  166. }
Add Comment
Please, Sign In to add comment