Advertisement
canezzy

imageProcessing

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