- #include <stdlib.h>
- #include <stdio.h>
- #include "OptLab.h"
- #include <iostream>
- bool CompareResults(const BYTE* image1, const BYTE* image2, const int width, const int height)
- {
- for (int i = 0; i < width * height; ++i)
- if (abs((int)image1[i] - (int)image2[i]) > 1)
- return false;
- return true;
- }
- void Filter(const BYTE *inputImage, BYTE *outputImage, const int width, const int height)
- {
- int i, j, k, l;
- double sum;
- for (j = 0; j < height; ++j)
- for (i = 0; i < width; ++i)
- outputImage[GetIndex(i, j, width)] = 0;
- for (i = 0; i < width; ++i)
- for (j = 0; j < height; ++j)
- {
- if (i != 0 && j != 0 && i != width - 1 && j != height - 1)
- {
- sum = 0.0;
- for (k = -1; k <= 1; ++k)
- for (l = -1; l <= 1; ++l)
- {
- if ((k == 0 && l != 0) || (l == 0 && k != 0))
- sum += 4.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- else if (k == 0 && l == 0)
- sum += 8.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- else
- sum += inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- }
- outputImage[GetIndex(i, j, width)] = (BYTE)sum;
- }
- }
- }
- void Filter_optimized(const BYTE *inputImage, BYTE *outputImage, const int width, const int height)
- {
- int i, j, k, l;
- double sum;
- for (j = 0; j < height; ++j) //zamiana petli z tej linijki i linijki poniżej wydluza czas wykonania
- for (i = 0; i < width; ++i)
- outputImage[GetIndex(i, j, width)] = 0;
- for (j = 0; j < height; ++j)
- for (i = 0; i < width; ++i) // zamiana petli
- //for (j = 0; j < height; ++j)
- {
- //outputImage[GetIndex(i, j, width)] = 0;
- if (i != 0 && j != 0 && i != width - 1 && j != height - 1)
- {
- sum = 0.0;
- //for (k = -1; k <= 1; ++k) <- zrezygnowano z tej pętli na rzecz 3-krotnego wywolania podobnego kodu
- //{
- k = -1;
- l = -1;
- //for (l = -1; l <= 1; ++l) <- zrezygnowano z tej pętli na rzecz 3-krotnego wywolania podobnego kodu
- //{
- double b = inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- //if ((k == 0 && l != 0) || (l == 0 && k != 0))
- //sum += 4.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- //sum += 4.0 * b;
- //else if (k == 0 && l == 0)
- //sum += 8.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- //sum += 8.0 * b;
- //else
- //sum += inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- sum += b;
- l++;
- b = inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- //if ((k == 0 && l != 0) || (l == 0 && k != 0))
- //sum += 4.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- sum += 4.0 * b;
- //else if (k == 0 && l == 0)
- //sum += 8.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- //sum += 8.0 * b;
- //else
- //sum += inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- //sum += b;
- l++;
- b = inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- //if ((k == 0 && l != 0) || (l == 0 && k != 0))
- //sum += 4.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- //sum += 4.0 * b;
- //else if (k == 0 && l == 0)
- //sum += 8.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- //sum += 8.0 * b;
- //else
- //sum += inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- sum += b;
- //}
- k++;
- l = -1;
- //for (l = -1; l <= 1; ++l)
- //{
- b = inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- //if ((k == 0 && l != 0) || (l == 0 && k != 0))
- //sum += 4.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- sum += 4.0 * b;
- //else if (k == 0 && l == 0)
- //sum += 8.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- //sum += 8.0 * b;
- //else
- //sum += inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- //sum += b;
- l++;
- b = inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- //if ((k == 0 && l != 0) || (l == 0 && k != 0))
- //sum += 4.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- //sum += 4.0 * b;
- //else if (k == 0 && l == 0)
- //sum += 8.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- sum += 8.0 * b;
- //else
- //sum += inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- //sum += b;
- l++;
- b = inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- //if ((k == 0 && l != 0) || (l == 0 && k != 0))
- //sum += 4.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- sum += 4.0 * b;
- //else if (k == 0 && l == 0)
- //sum += 8.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- //sum += 8.0 * b;
- //else
- //sum += inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- //sum += b;
- k++;
- l = -1;
- //for (l = -1; l <= 1; ++l)
- //{
- b = inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- //if ((k == 0 && l != 0) || (l == 0 && k != 0))
- //sum += 4.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- //sum += 4.0 * b;
- //else if (k == 0 && l == 0)
- //sum += 8.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- //sum += 8.0 * b;
- //else
- //sum += inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- sum += b;
- l++;
- b = inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- //if ((k == 0 && l != 0) || (l == 0 && k != 0))
- //sum += 4.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- sum += 4.0 * b;
- //else if (k == 0 && l == 0)
- //sum += 8.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- //sum += 8.0 * b;
- //else
- //sum += inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- //sum += b;
- l++;
- b = inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- //if ((k == 0 && l != 0) || (l == 0 && k != 0))
- //sum += 4.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- //sum += 4.0 * b;
- //else if (k == 0 && l == 0)
- //sum += 8.0 * inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- //sum += 8.0 * b;
- //else
- //sum += inputImage[GetIndex(i + l, j + k, width)] / 28.0;
- sum += b;
- outputImage[GetIndex(i, j, width)] = (BYTE)sum;
- //}
- }
- }
- }
- inline int GetIndex(int x, int y, int w)
- {
- return x + y * w;
- }
- void PrintImage(const BYTE *image, const int N, const int M)
- {
- int i, j;
- for (j = 0; j < M -1; ++j)
- //for (i = 0; i < N; ++i)
- {
- for (i = 0; i < N -1; ++i)
- //for (j = 0; j < M; ++j)
- printf("%d ", image[GetIndex(i, j, M)]);
- printf("\n");
- }
- }