Advertisement
annstasi

Sharpener

Dec 10th, 2019
324
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.87 KB | None | 0 0
  1. #include "bmp.h"
  2. #include <stdlib.h>
  3. /**
  4. * bmp_sharpener -- фильтр "Усиление резкости"
  5. *
  6. * Copyright (c) 2019, Anastasia Feofanova
  7. *
  8. * This code is licensed under a MIT-style license.
  9. */
  10.  
  11. void bmp_sharpener(bmp_image image) {
  12. /* Получаем линейные размеры изображения */
  13. int w = image.header.width;
  14. int h = image.header.height;
  15.  
  16. /*Выделяем память под такое же изображение*/
  17. double *copy = (double *)malloc(w * h * 3 * sizeof(double));
  18.  
  19. int i, j ,k ,l;
  20. /*Реализуем матрицу свёртки*/
  21. double kernel[5][5] = {{-1,-1,-1,-1,-1},
  22. {-1,-1,-1,-1,-1},
  23. {-1,-1,25,-1,-1},
  24. {-1,-1,-1,-1,-1},
  25. {-1,-1,-1,-1,-1}};
  26. /* Для всех строк пикселей */
  27. for (i = 0; i < h ; i++) {
  28.  
  29. /* Для каждого пикселя */
  30. for(j = 0; j < w ; j++) {
  31. /*Обнуляем значения переменных*/
  32. double blue2 = 0; double green2 = 0; double red2 = 0;
  33. for(k = i-2 ; k <= i +2; k++) {
  34. for(l = j-2 ; l <= j +2; l++) {
  35.  
  36. /*Не заходим за границы изображения (пропускаем их)*/
  37. if(k < 0||k >= h|| l < 0||l >= w) continue;
  38.  
  39. /*Получаем цвета каждого пикселя*/
  40. double blue = image.pixel_array[0 * h * w + k * w + l];
  41. double green = image.pixel_array[1 * h * w + k * w + l];
  42. double red = image.pixel_array[2 * h * w + k * w + l];
  43. /*Применяем фильтр*/
  44. blue2 += kernel[k - (i - 2)][l - (j - 2)] * blue;
  45. green2 += kernel[k - (i - 2)][l - (j -2)] * green;
  46. red2 += kernel[k - (i - 2)][l - (j - 2)] * red;
  47. }
  48. }
  49. /*Следим за тем, чтобы не сбились цвета, в случае выхода за предел*/
  50. blue2 > 1 ? blue2 =1 : blue2;
  51. blue2 < 0 ? blue2 =0 : blue2;
  52. green2 > 1 ? green2 =1 : green2;
  53. green2 < 0 ? green2 =0 : green2;
  54. red2 > 1 ? red2 =1 : red2;
  55. red2 < 0 ? red2 =0 : red2;
  56. /*Присваиваем копии новые значения*/
  57. copy[0 * h * w + i * w + j] = blue2;
  58. copy[1 * h * w + i * w + j] = green2;
  59. copy[2 * h * w + i * w + j] = red2;
  60. }
  61. }
  62. for(i = 0; i < h; i++) {
  63. for (j = 0; j < w ;j++) {
  64.  
  65. image.pixel_array[0 * h * w + i * w + j] = copy[0 * h * w + i * w + j];
  66. image.pixel_array[1 * h * w + i * w + j] = copy[1 * h * w + i * w + j];
  67. image.pixel_array[2 * h * w + i * w + j] = copy[2 * h * w + i * w + j];
  68. }
  69. }
  70. free(copy);
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement