Facebook
From Lousy Leopard, 4 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 199
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include "OptLab.h"
  4. #include <iostream>
  5. bool CompareResults(const BYTE* image1, const BYTE* image2, const int width, const int height)
  6. {
  7.         for (int i = 0; i < width * height; ++i)
  8.                 if (abs((int)image1[i] - (int)image2[i]) > 1)
  9.                         return false;                          
  10.         return true;
  11. }
  12.  
  13.  
  14. void Filter(const BYTE *inputImage, BYTE *outputImage, const int width, const int height)
  15. {
  16.         int i, j, k, l;
  17.         double sum;
  18.  
  19.         for (j = 0; j < height; ++j)
  20.                 for (i = 0; i < width; ++i)
  21.                         outputImage[GetIndex(i, j, width)] = 0;
  22.  
  23.         for (i = 0; i < width; ++i)
  24.                 for (j = 0; j < height; ++j)
  25.                 {
  26.                 if (i != 0 && j != 0 && i != width - 1 && j != height - 1)
  27.                 {
  28.                         sum = 0.0;
  29.  
  30.                         for (k = -1; k <= 1; ++k)
  31.                                 for (l = -1; l <= 1; ++l)
  32.                                 {
  33.                                 if ((k == 0 && l != 0) || (l == 0 && k != 0))
  34.                                         sum += 4.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  35.                                 else if (k == 0 && l == 0)
  36.                                         sum += 8.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  37.                                 else
  38.                                         sum += inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  39.                                 }
  40.  
  41.                         outputImage[GetIndex(i, j, width)] = (BYTE)sum;
  42.                 }
  43.                 }
  44. }
  45.  
  46.  
  47. void Filter_optimized(const BYTE *inputImage, BYTE *outputImage, const int width, const int height)
  48. {
  49.         int i, j, k, l;
  50.         double sum;
  51.  
  52.         for (j = 0; j < height; ++j) //zamiana petli z tej linijki i linijki poniżej wydluza czas wykonania
  53.                 for (i = 0; i < width; ++i)
  54.                         outputImage[GetIndex(i, j, width)] = 0;
  55.  
  56.         for (j = 0; j < height; ++j)
  57.                 for (i = 0; i < width; ++i) // zamiana petli
  58.                 //for (j = 0; j < height; ++j)
  59.                 {
  60.                 //outputImage[GetIndex(i, j, width)] = 0;
  61.                         if (i != 0 && j != 0 && i != width - 1 && j != height - 1)
  62.                         {
  63.                                 sum = 0.0;
  64.  
  65.                                 //for (k = -1; k <= 1; ++k) <-  zrezygnowano z tej pętli na rzecz 3-krotnego wywolania podobnego kodu
  66.                                 //{
  67.                                 k = -1;
  68.  
  69.  
  70.                                         l = -1;
  71.                                         //for (l = -1; l <= 1; ++l) <-  zrezygnowano z tej pętli na rzecz 3-krotnego wywolania podobnego kodu
  72.                                         //{
  73.                                         double b = inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  74.                                         //if ((k == 0 && l != 0) || (l == 0 && k != 0))
  75.                                                 //sum += 4.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  76.                                                 //sum += 4.0 * b;
  77.                                         //else if (k == 0 && l == 0)
  78.                                                 //sum += 8.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  79.                                                 //sum += 8.0 * b;
  80.                                         //else
  81.                                                 //sum += inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  82.                                                 sum += b;
  83.  
  84.                                         l++;
  85.  
  86.                                         b = inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  87.                                         //if ((k == 0 && l != 0) || (l == 0 && k != 0))
  88.                                                 //sum += 4.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  89.                                                 sum += 4.0 * b;
  90.                                         //else if (k == 0 && l == 0)
  91.                                                 //sum += 8.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  92.                                                 //sum += 8.0 * b;
  93.                                         //else
  94.                                                 //sum += inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  95.                                                 //sum += b;
  96.  
  97.                                         l++;
  98.  
  99.                                         b = inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  100.                                         //if ((k == 0 && l != 0) || (l == 0 && k != 0))
  101.                                                 //sum += 4.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  102.                                                 //sum += 4.0 * b;
  103.                                         //else if (k == 0 && l == 0)
  104.                                                 //sum += 8.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  105.                                                 //sum += 8.0 * b;
  106.                                         //else
  107.                                                 //sum += inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  108.                                                 sum += b;
  109.                                         //}
  110.  
  111.  
  112.                                         k++;
  113.  
  114.  
  115.                                         l = -1;
  116.                                         //for (l = -1; l <= 1; ++l)
  117.                                         //{
  118.                                         b = inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  119.                                         //if ((k == 0 && l != 0) || (l == 0 && k != 0))
  120.                                                 //sum += 4.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  121.                                                 sum += 4.0 * b;
  122.                                         //else if (k == 0 && l == 0)
  123.                                                 //sum += 8.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  124.                                                 //sum += 8.0 * b;
  125.                                         //else
  126.                                                 //sum += inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  127.                                                 //sum += b;
  128.  
  129.                                         l++;
  130.  
  131.                                         b = inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  132.                                         //if ((k == 0 && l != 0) || (l == 0 && k != 0))
  133.                                                 //sum += 4.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  134.                                                 //sum += 4.0 * b;
  135.                                         //else if (k == 0 && l == 0)
  136.                                                 //sum += 8.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  137.                                                 sum += 8.0 * b;
  138.                                         //else
  139.                                                 //sum += inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  140.                                                 //sum += b;
  141.  
  142.                                         l++;
  143.  
  144.                                         b = inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  145.                                         //if ((k == 0 && l != 0) || (l == 0 && k != 0))
  146.                                                 //sum += 4.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  147.                                                 sum += 4.0 * b;
  148.                                         //else if (k == 0 && l == 0)
  149.                                                 //sum += 8.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  150.                                                 //sum += 8.0 * b;
  151.                                         //else
  152.                                                 //sum += inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  153.                                                 //sum += b;
  154.  
  155.  
  156.                                         k++;
  157.  
  158.  
  159.                                         l = -1;
  160.                                         //for (l = -1; l <= 1; ++l)
  161.                                         //{
  162.                                         b = inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  163.                                         //if ((k == 0 && l != 0) || (l == 0 && k != 0))
  164.                                                 //sum += 4.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  165.                                                 //sum += 4.0 * b;
  166.                                         //else if (k == 0 && l == 0)
  167.                                                 //sum += 8.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  168.                                                 //sum += 8.0 * b;
  169.                                         //else
  170.                                                 //sum += inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  171.                                                 sum += b;
  172.  
  173.                                         l++;
  174.  
  175.                                         b = inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  176.                                         //if ((k == 0 && l != 0) || (l == 0 && k != 0))
  177.                                                 //sum += 4.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  178.                                                 sum += 4.0 * b;
  179.                                         //else if (k == 0 && l == 0)
  180.                                                 //sum += 8.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  181.                                                 //sum += 8.0 * b;
  182.                                         //else
  183.                                                 //sum += inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  184.                                                 //sum += b;
  185.  
  186.                                         l++;
  187.  
  188.                                         b = inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  189.                                         //if ((k == 0 && l != 0) || (l == 0 && k != 0))
  190.                                                 //sum += 4.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  191.                                                 //sum += 4.0 * b;
  192.                                         //else if (k == 0 && l == 0)
  193.                                                 //sum += 8.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  194.                                                 //sum += 8.0 * b;
  195.                                         //else
  196.                                                 //sum += inputImage[GetIndex(i + l, j + k, width)] / 28.0;
  197.                                                 sum += b;
  198.                                         outputImage[GetIndex(i, j, width)] = (BYTE)sum;
  199.                                 //}
  200.                         }
  201.                 }
  202. }
  203.  
  204.  
  205.  
  206. inline int GetIndex(int x, int y, int w)
  207. {
  208.         return x + y * w;
  209. }
  210.  
  211. void PrintImage(const BYTE *image, const int N, const int M)
  212. {
  213.         int i, j;
  214.  
  215.         for (j = 0; j < M -1; ++j)
  216.         //for (i = 0; i < N; ++i)
  217.         {
  218.                 for (i = 0; i < N -1; ++i)
  219.                 //for (j = 0; j < M; ++j)
  220.                         printf("%d ", image[GetIndex(i, j, M)]);
  221.                 printf("\n");
  222.         }
  223. }