Advertisement
Guest User

Untitled

a guest
Jun 16th, 2016
313
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.05 KB | None | 0 0
  1. #pragma pack(1)
  2. #include <bits/stdc++.h>
  3.  
  4. using namespace std;
  5.  
  6. struct Pixel {
  7.     unsigned char R;
  8.     unsigned char G;
  9.     unsigned char B;
  10.     Pixel(unsigned char r = 0, unsigned char g = 0, unsigned char b = 0) {
  11.         R = r;
  12.         G = g;
  13.         B = b;
  14.     }
  15. };
  16.  
  17. class Bitmap {
  18.     public:
  19.         unsigned char* info_header;
  20.         unsigned char* file_header;
  21.         unsigned char* pixel_array;
  22.  
  23.         Bitmap() {
  24.             info_header = file_header = pixel_array = nullptr;
  25.         }
  26.  
  27.         ~Bitmap() {
  28.             if(info_header) free(info_header);
  29.             if(file_header) free(file_header);
  30.             if(pixel_array) free(pixel_array);
  31.         }
  32.  
  33.         void load(const char* filename) {
  34.             FILE* f = fopen(filename, "rb");
  35.  
  36.             file_header = (unsigned char*) malloc(14 * sizeof(unsigned char));
  37.             fread(file_header, sizeof(unsigned char), 14 * sizeof(unsigned char), f);
  38.  
  39.             info_header = (unsigned char*) malloc(info_headersize() * sizeof(unsigned char));
  40.             fread(info_header, sizeof(unsigned char), info_headersize() * sizeof(unsigned char), f);
  41.  
  42.             pixel_array = (unsigned char*) malloc(pixel_arraysize() * sizeof(unsigned char));
  43.             fread(pixel_array, sizeof(unsigned char), pixel_arraysize() * sizeof(unsigned char), f);
  44.             fclose(f);
  45.         }
  46.  
  47.         void load(Bitmap &origin) {
  48.             file_header = (unsigned char*) malloc(14 * sizeof(unsigned char));
  49.             memcpy(file_header, origin.file_header, 14 * sizeof(unsigned char));
  50.  
  51.             info_header = (unsigned char*) malloc(origin.info_headersize() * sizeof(unsigned char));
  52.             memcpy(info_header, origin.info_header, origin.info_headersize() * sizeof(unsigned char));
  53.  
  54.             pixel_array = (unsigned char*) malloc(origin.pixel_arraysize() * sizeof(unsigned char));
  55.             memcpy(pixel_array, origin.pixel_array, origin.pixel_arraysize() * sizeof(unsigned char));
  56.         }
  57.  
  58.         int info_headersize() {
  59.             if(file_header) {
  60.                 return (*(int*)&file_header[10] - 14);
  61.             }
  62.             return 0;
  63.         }
  64.  
  65.         int pixel_arraysize() {
  66.             if(file_header) {
  67.                 return (*(int*)&file_header[2] - *(int*)&file_header[10]);
  68.             }
  69.             return 0;
  70.         }
  71.  
  72.         int getWidth() {
  73.             if(info_header) {
  74.                 return (*(int*)&info_header[4]);
  75.             }
  76.             return 0;
  77.         }
  78.  
  79.         int getHeight() {
  80.             if(info_header) {
  81.                 return (*(int*)&info_header[8]);
  82.             }
  83.             return 0;
  84.         }
  85.  
  86.         void output(const char* filename) {
  87.             FILE* w = fopen(filename, "wb");
  88.             fwrite(file_header, sizeof(unsigned char), 14 * sizeof(unsigned char), w);
  89.             fwrite(info_header, sizeof(unsigned char), info_headersize() * sizeof(unsigned char), w);
  90.             fwrite(pixel_array, sizeof(unsigned char), pixel_arraysize() * sizeof(unsigned char), w);
  91.             fclose(w);
  92.             return;
  93.         }
  94. };
  95.  
  96. bool compare(Pixel &a, Pixel &b) {
  97.   return ((a.B << 16) + (a.G << 8) + a.R) < ((b.B << 16) + (b.G << 8) + b.R);
  98. }
  99.  
  100. Bitmap transformMedia(Bitmap &origin, int w, int h) {
  101.     Bitmap transformed;
  102.     transformed.load(origin);
  103.     int height = origin.getHeight();
  104.     int width = origin.getWidth();
  105.     int row_padded = (width*3 + 3) & (~3);
  106.     int sumr, sumg, sumb, n;
  107.     for(int i = 0; i < height; i++) {
  108.         for(int j = 0; j < width; j++) {
  109.             sumr = 0; sumg = 0; sumb = 0; n = 0;
  110.             for(int x = -w/2; x <= w/2; x++) {
  111.                 for(int y = -h/2; y <= h/2; y++) {
  112.                     if (i + y >= 0 && j + x >= 0 && j + x < width && i + y < height) {
  113.                         n++;
  114.                         sumr += origin.pixel_array[(i + y)*row_padded + (j + x)*3 + 2];
  115.                         sumg += origin.pixel_array[(i + y)*row_padded + (j + x)*3 + 1];
  116.                         sumb += origin.pixel_array[(i + y)*row_padded + (j + x)*3];
  117.                     }
  118.                 }
  119.             }
  120.             if(n > 0) {
  121.                 transformed.pixel_array[i*row_padded + j*3 + 2] = sumr/n;
  122.                 transformed.pixel_array[i*row_padded + j*3 + 1] = sumg/n;
  123.                 transformed.pixel_array[i*row_padded + j*3] = sumb/n;
  124.             }
  125.         }
  126.     }
  127.     return transformed;
  128. }
  129.  
  130. Bitmap transformMediana(Bitmap &origin, int w, int h) {
  131.     Bitmap transformed;
  132.     transformed.load(origin);
  133.     int height = origin.getHeight();
  134.     int width = origin.getWidth();
  135.     int row_padded = (width*3 + 3) & (~3);
  136.     int n;
  137.     vector<Pixel> tmpvec;
  138.  
  139.     for(int i = 0; i < height; i++) {
  140.         for(int j = 0; j < width; j++) {
  141.             n = 0;
  142.             for(int x = -w/2; x <= w/2; x++) {
  143.                 for(int y = -h/2; y <= h/2; y++) {
  144.                     if (i + y >= 0 && j + x >= 0 && j + x < width && i + y < height) {
  145.                         n++;
  146.                         Pixel tmp(origin.pixel_array[(i + y)*row_padded + (j + x)*3 + 2], origin.pixel_array[(i + y)*row_padded + (j + x)*3 + 1], origin.pixel_array[(i + y)*row_padded + (j + x)*3]);
  147.                         tmpvec.push_back(tmp);
  148.                     }
  149.                 }
  150.             }
  151.  
  152.             sort(tmpvec.begin(), tmpvec.end(), compare);
  153.             if(n > 0) {
  154.                 transformed.pixel_array[i*row_padded + j*3 + 2] = tmpvec[n / 2].R;
  155.                 transformed.pixel_array[i*row_padded + j*3 + 1] = tmpvec[n / 2].G;
  156.                 transformed.pixel_array[i*row_padded + j*3] = tmpvec[n / 2].B;
  157.             }
  158.             tmpvec.clear();
  159.         }
  160.     }
  161.     return transformed;
  162. }
  163.  
  164. Bitmap transformGrayscale(Bitmap &origin, double r = 0.2126, double g = 0.7152, double b = 0.0722, double divisor = 1) {
  165.     Bitmap transformed;
  166.     transformed.load(origin);
  167.     int height = origin.getHeight();
  168.     int width = origin.getWidth();
  169.     int row_padded = (width*3 + 3) & (~3);
  170.     unsigned char Y;
  171.  
  172.     for(int i = 0; i < height; i++) {
  173.         for(int j = 0; j < width; j++) {
  174.             Y = (origin.pixel_array[i*row_padded + j*3 + 2] * r + origin.pixel_array[i*row_padded + j*3 + 1] * g + origin.pixel_array[i*row_padded + j*3] * b) / divisor;
  175.             transformed.pixel_array[i*row_padded + j*3 + 2] = Y;
  176.             transformed.pixel_array[i*row_padded + j*3 + 1] = Y;
  177.             transformed.pixel_array[i*row_padded + j*3] = Y;
  178.         }
  179.     }
  180.     return transformed;
  181. }
  182.  
  183. int main() {
  184.     Bitmap data;
  185.     data.load("data.bmp");
  186.     Bitmap media3x3 = transformMedia(data, 3, 3);
  187.     Bitmap media9x9 = transformMedia(data, 9, 9);
  188.     Bitmap mediana3x3 = transformMediana(data, 3, 3);
  189.     Bitmap mediana9x9 = transformMediana(data, 9, 9);
  190.     Bitmap grayscale = transformGrayscale(data);
  191.     Bitmap grayscalem = transformGrayscale(data, 1, 1, 1, 3);
  192.  
  193.     media3x3.output("media3x3.bmp");
  194.     media9x9.output("media9x9.bmp");
  195.     mediana3x3.output("mediana3x3.bmp");
  196.     mediana9x9.output("mediana9x9.bmp");
  197.     grayscale.output("grayscale.bmp"); // Luminance-preserving.
  198.     grayscalem.output("grayscalem.bmp"); // Avg of r, g and b.
  199.  
  200.     return 0;
  201. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement