Advertisement
PHChauAnh

BlurCs50

Apr 4th, 2020
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.76 KB | None | 0 0
  1. RGBTRIPLE add(RGBTRIPLE x, RGBTRIPLE y)
  2. {
  3.     RGBTRIPLE ans;
  4.     ans.rgbtRed = x.rgbtRed + y.rgbtRed;
  5.     ans.rgbtBlue = x.rgbtBlue + y.rgbtBlue;
  6.     ans.rgbtGreen = x.rgbtGreen + y.rgbtGreen;
  7.     return ans;
  8. }
  9.  
  10. RGBTRIPLE minu(RGBTRIPLE x, RGBTRIPLE y)
  11. {
  12.     RGBTRIPLE ans;
  13.     ans.rgbtRed = x.rgbtRed - y.rgbtRed;
  14.     ans.rgbtBlue = x.rgbtBlue - y.rgbtBlue;
  15.     ans.rgbtGreen = x.rgbtGreen - y.rgbtGreen;
  16.     return ans;
  17. }
  18.  
  19. RGBTRIPLE divide(RGBTRIPLE x, int y)
  20. {
  21.     RGBTRIPLE ans;
  22.     ans.rgbtRed = round((double)x.rgbtRed / y);
  23.     ans.rgbtBlue = round((double)x.rgbtBlue / y);
  24.     ans.rgbtGreen = round((double)x.rgbtGreen / y);
  25.     return ans;
  26. }
  27.  
  28. // Blur image
  29. void blur(int height, int width, RGBTRIPLE image[height + 5][width + 5])
  30. {
  31.     RGBTRIPLE average[height + 5][width + 5], sum[height + 5][width + 5];
  32.     sum[0][0] = image[0][0];
  33.     for (int i = 1; i < width; i++)
  34.     {
  35.         sum[0][i] = add(sum[0][i - 1], image[0][i]);
  36.     }
  37.     for (int i = 1; i < height; i++)
  38.     {
  39.         sum[i][0] = add(sum[i - 1][0], image[i][0]);
  40.     }
  41.     for (int i = 1; i < height; i++)
  42.     {
  43.         for (int j = 1; j < width; j++)
  44.         {
  45.             sum[i][j] = add(minu(add(sum[i - 1][j], sum[i][j - 1]), sum[i - 1][j - 1]), image[i][j]);
  46.         }
  47.     }
  48.     for (int i = 0; i < width; i++)
  49.     {
  50.         sum[height][i] = sum[height - 1][i];
  51.     }
  52.     for (int i = 0; i < height; i++)
  53.     {
  54.         sum[i][width] = sum[i][width - 1];
  55.     }
  56.     sum[height][width] = sum[height - 1][width - 1];
  57.  
  58.     for (int i = 0; i < height; i++)
  59.     {
  60.         for (int j = 0; j < width; j++)
  61.         {
  62.             if (i - 2 < 0 && j - 2 < 0)
  63.             {
  64.                 image[i][j] = sum[i + 1][j + 1];
  65.             }
  66.             else if (i - 2 < 0 && j - 2 >= 0)
  67.             {
  68.                 image[i][j] = minu(sum[i + 1][j + 1], sum[i + 1][j - 2]);
  69.             }
  70.             else if (i - 2 >= 0 && j - 2 < 0)
  71.             {
  72.                 image[i][j] = minu(sum[i + 1][j + 1], sum[i - 2][j + 1]);
  73.             }
  74.             else
  75.             {
  76.                 image[i][j] = add(minu(minu(sum[i + 1][j + 1], sum[i - 2][j + 1]), sum[i + 1][j - 2]), sum[i - 2][j - 2]);
  77.             }
  78.             if ((i == 0 || i == height - 1) && (j == 0 || j == width - 1))
  79.             {
  80.                 image[i][j] = divide(image[i][j], 4);
  81.             }
  82.             else if (((i == 0 || i == height - 1) && j > 0 && j < width - 1) || ((j == 0 || j == width - 1) && i > 0 && i < height - 1))
  83.             {
  84.                 image[i][j] = divide(image[i][j], 6);
  85.             }
  86.             else //if (i > 0 && i < height - 1 && j > 0 && j < width - 1)
  87.             {
  88.                 image[i][j] = divide(image[i][j], 9);
  89.             }
  90.         }
  91.     }
  92.     return;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement