본문 바로가기

컴퓨터 과학 & 영상처리 관련/그래픽스

120502 미디언 표현

 

원본

 

3x3

 

5x5

 

  1. /// 흑백 BMP 영상의 역상을 계산 
  2.  
  3. #include <stdio.h>  //파일입출력, 프린트f
  4. #include <windows.h>  //비트맵 파일헤더 구조체, 비트맵 인포헤더 구조체가 여기 있어서...
  5. #include <math.h> //abs();
  6.  
  7. #define BYTE unsigned char
  8. #define WIDTHBYTES(bits) (( (bits) + 31) / 32 * 4 ) // 영상 가로길이는 4바이트의 배수여야 함
  9.                                             //(영상의 가로사이즈를 비트단위로 넣으면 4의 배수로 만들어줭)
  10.                                             //이게 왜 4배가 되야되냐? 지금하드가 ntfs..디스크가 4바이트씩 읽음(블럭인가?) 주소도 데이타 처리도 4바이트씩 하고있음.
  11.                                             //영상의 가로사이즈를 4의 배수로 맞추면 영상의 전체 크기도 4의 배수가됨
  12.                                             //256이면 걍 쓰고 ...258이면 260바이트를 써야됨. 
  13.  
  14. void swap(unsigned char * a, unsigned char *b)
  15. {
  16.     unsigned char temp;
  17.     temp = *a;
  18.     *a = *b;
  19.     *b = temp;
  20. }
  21.  
  22. void sorting(unsigned char * Arr, int ArrSize)
  23. {
  24.     int i,j;
  25.     for(i=0;i<ArrSize-1;i++)
  26.     {
  27.         for(j=i+1;j<ArrSize;j++)
  28.         {
  29.             if(Arr[i]>Arr[j])
  30.                 swap(&Arr[i],&Arr[j]);
  31.         }
  32.     }
  33. }
  34.  
  35.  
  36.  
  37.  
  38. void main()
  39. {
  40.     FILE *infile;
  41.    
  42.  
  43.  
  44.  
  45.     infile=fopen("salt.bmp", "rb");
  46.     if(infile==NULL) { printf("There is no file!!! "); exit(1); }
  47.  
  48.     BITMAPFILEHEADER hf; //파일헤더 구조체
  49.     fread(&hf,sizeof(BITMAPFILEHEADER),1,infile); // 파일헤드를 읽음 ..1은 머냐?
  50.     if(hf.bfType!=0x4D42) exit(1);   //0x4D42는 BM임. BM이 아니면 안되게 bftype은 파일형식...BM은 비트맵인듯
  51.  
  52.     BITMAPINFOHEADER hInfo;  //인포헤더 (영상헤더라 부르니?)
  53.     fread(&hInfo,sizeof(BITMAPINFOHEADER),1,infile); // 영상헤드를 읽음
  54.     printf("Image Size: (%3dx%3d) ",hInfo.biWidth,hInfo.biHeight);
  55.     printf("Pallete Type: %dbit Colors ",hInfo.biBitCount);
  56.  
  57.  
  58.     if(hInfo.biBitCount!=8 ) { printf("Bad File format!!"); exit(1); }    // 256칼라 이하의 경우는 취급하지 않음
  59.  
  60.     RGBQUAD hRGB[256];
  61.     fread(hRGB,sizeof(RGBQUAD),256,infile); // 팔레트를 파일에서 읽음 ...256은 머냐?
  62.    
  63.  
  64.     // 영상데이타를 저장할 메모리 할당
  65.     BYTE *lpImg = new BYTE [hInfo.biSizeImage]//동적할당 해야됭.이미지는 대부분. BYTE는 unsigned char
  66.     BYTE *OutImg = new BYTE [hInfo.biSizeImage]//동적할당 해야됭.이미지는 대부분. BYTE는 unsigned char
  67.  
  68.     fread(lpImg,sizeof(char),hInfo.biSizeImage,infile);
  69.     fclose(infile);
  70.  
  71.     //미디언 표현
  72.  
  73.    
  74.     unsigned char median[9] = {0,};
  75.  
  76.  
  77.     for(int i = 1 ; i < hInfo.biHeight ; i++)  //1부터 세로사이즈 만큼 행을 바꿔주는거? 3x3이라서 1부터시작
  78.     {
  79.         for(int j = 1 ; j < hInfo.biWidth ; j++)  //열을 바꿔주는거  3x3이라서 1부터시작
  80.         {
  81.             for(int k = -1 ; k < 2 ; k++)
  82.             {
  83.                 for(int p = -1 ; p < 2 ; p++)
  84.                 {
  85.                     median[(k+1)*3+(p+1)] = lpImg[(i+k)*hInfo.biWidth+(j+p)];
  86.                                        
  87.                 }
  88.             }
  89.             sorting(median,9);
  90.             OutImg[i*hInfo.biWidth+j] = median[4];
  91.         }
  92.     }
  93.            
  94.     //여긴 5x5의 경우...결과값이 더 좋음
  95.     //  unsigned char median[25] = {0,};
  96.  
  97.  
  98.     //for(int i = 1 ; i < hInfo.biHeight ; i++)  //1부터 세로사이즈 만큼 행을 바꿔주는거? 3x3이라서 1부터시작
  99.     //{
  100.     //  for(int j = 1 ; j < hInfo.biWidth ; j++)  //열을 바꿔주는거  3x3이라서 1부터시작
  101.     //  {
  102.     //    for(int k = -2 ; k < 3 ; k++)
  103.     //    {
  104.     //      for(int p = -2 ; p < 3 ; p++)
  105.     //      {
  106.     //        median[(k+2)*5+(p+2)] = lpImg[(i+k)*hInfo.biWidth+(j+p)];
  107.     //                 
  108.     //      }
  109.     //    }
  110.     //    sorting(median,25);
  111.     //    OutImg[i*hInfo.biWidth+j] = median[12];
  112.     //  }
  113.     //}
  114.  
  115.  
  116.  
  117.  
  118.  
  119.     FILE *outfile = fopen("OutImg.bmp","wb");
  120.     fwrite(&hf,sizeof(char),sizeof(BITMAPFILEHEADER),outfile);
  121.     fwrite(&hInfo,sizeof(char),sizeof(BITMAPINFOHEADER),outfile);
  122.     fwrite(hRGB,sizeof(RGBQUAD),256,outfile);
  123.     fwrite(OutImg,sizeof(char),hInfo.biSizeImage,outfile);
  124.     fclose(outfile);
  125.  
  126.  
  127.     // 메모리 해제
  128.     delete []lpImg;
  129.  
  130. }