본문 바로가기
프로그래밍/MFC

영상처리 - 미디언 필터

by 완소루피 2020. 11. 13.
728x90
반응형

미디언 필터 함수

 

//미디언 필터 - 신규
void DibFilterMedianNew(CDib& dib, int filterSize){
 register int i,j,k,z;
 int w = dib.GetWidth();
 int h = dib.GetHeight();
 CDib cpy = dib;
 //예외처리
 if(w<filterSize || h<filterSize){
  AfxMessageBox("필터 사이즈 입력값이 너무 큽니다. ");
  return;
 }

 BYTE** ptr1 = dib.GetPtr();
 BYTE** ptr2 = cpy.GetPtr();
 int num = (int)pow((double)filterSize,2);
 
 char str[256];
 int count; 
 int x=(filterSize-1)/2;  // n 사이즈의 간격(사이즈-1/2)
 int w_size = filterSize; // n * n 사이즈의 n
 int* m = new int[num];
 for(j=x; j<h-x; j++){
  for(i=x; i<w-x; i++){
   count=0;
   for(k=0; k<w_size; k++){
    for(z=0; z<w_size; z++){
     m[count++]=ptr2[j-x+k][i-x+z];
     //wsprintf(str,"%d[%d](%d,%d) ",m[k+z],k+z,j-x+k,i-x+z);
     //TRACE(str);
    }
   }
   /*TRACE("before ");
   for(f=0;f<9; f++){  
    wsprintf(str,"%d ",m[f]);
    TRACE(str);
   }
   TRACE("\n");*/
   DibQuickSort(m,num);
   /*TRACE("after ");
   for(f=0;f<9; f++){  
    wsprintf(str,"%d ",m[f]);
    TRACE(str);
   }*/
   
   ptr1[j][i] = (BYTE)m[(num-1)/2];
   //wsprintf(str,"%d ",ptr1[j][i]);
   //TRACE(str);
  }
 }
}
void DibQuickSort(int* data, int count){
 DibQuickRecursive(data,count-1);
 //DibInsertSort(data,count);
}
void DibQuickRecursive(int* parm_data, int parm_right){
 
 int i = 0, j = parm_right;
 if ( parm_right < 2 ) return;
 while ( 1 )
 {
  while ( parm_data[++i] < parm_data[0] ) if ( i >= parm_right ) break;
  while ( parm_data[--j] > parm_data[0] );
  if ( i >= j ) break;
  { int temp = parm_data[i]; parm_data[i] = parm_data[j]; parm_data[j] = temp; }
 }
  int temp = parm_data[0]; parm_data[0] = parm_data[j]; parm_data[j] = temp; 
 DibQuickRecursive ( parm_data, j );
 DibQuickRecursive ( parm_data+j+1, parm_right-j-1 );
 
 /*
 int i,j,p;     
 int tempValue; // 스왑 임시 저장소     
 if (parm_left < parm_right) {         
  i = parm_left+1; // 양끝에서 접근할 값 정의         
  j = parm_right;         
  p = parm_data[parm_left]; // pivot을 맨 처음 값으로 설정         
  do {             
   while (parm_data[i] < p){                 
    i++; // pivot보다 크거나 같은 값 만날 때까지             
   }    
   while (parm_data[j] > p) {                 
    j--; // pivot보다 작거나 같은 값 만날 때까지             
   }             // 구한 i, j 인덱스의 값을 서로 스왑             
   if (i <= j){                 
    tempValue = parm_data[j];                 
    parm_data[j] = parm_data[i];                 
    parm_data[i] = tempValue;             
   }         
  } while (i < j); // i보다 j가 클때만 동작         
  parm_data[parm_left] = parm_data[j];         
  parm_data[j] = p;         
  
  //char str[256];
  //int i;
  //for(i=0;i<9; i++){  
   //wsprintf(str,"%d ",parm_data[i]);
   //TRACE(str);
  //}
  //TRACE("\n");
  DibQuickRecursive(parm_data,parm_left,j-1); // 왼쪽 편 같은 방법으로 sorting         
  DibQuickRecursive(parm_data,j+1,parm_right); // 오른쪽 편 같은 방법으로 sorting     
 }
 */
}
void DibInsertSort(int* d, int n){
 register int i,j;
 int temp;
 for(i=1; i<n; i++){
  temp = d[i];
  j=i-1;
  while(j>-1&& d[j]>temp){
   d[j+1] = d[j];
   j--;
  }
  d[j+1] = temp;
 }
}
728x90
반응형

'프로그래밍 > MFC' 카테고리의 다른 글

오류 해결 - afxtoolbarimages  (0) 2020.11.13
오류 해결 - _CrtDbgReport: String too long or IO Error  (0) 2020.11.13
Raw to BMP 저장  (0) 2020.11.13
Raw to BMP 설명  (0) 2020.11.12
GDI+ 기반 BMP to JPG  (0) 2020.11.12