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 |