NAVER

질문 vc++ 인데 소스분석좀 부탁드려요(내공100드림)
ak**** 조회수 765 작성일2004.06.15
void CMeshWarp::MedianFilter(CDIB *src, CDIB *dest, int kwidth)
{
int x, y, i, j;
int nWidth = src->Width();
int nHeight = src->Height();
int nkHeight = kwidth, nkWidth = kwidth;
int kerx, kery, index, xextra, yextra;
BYTE windowR[9], windowG[9], windowB[9]; /* storage for window samples */
int xpad, ypad;
COLORREF color;
nkHeight = nkWidth = 3;

yextra = (nkHeight / 2) * 2;
ypad = yextra / 2;
xextra = (nkWidth / 2) * 2;
xpad = xextra / 2;

for (y = ypad; y < (nHeight - ypad); y++) {
for (x = xpad; x < (nWidth - xpad); x++) {
index = 0;
for (kery = -1 * ypad; kery <= ypad; kery++)
for (kerx = - 1 * xpad; kerx <= xpad; kerx++) {
color = src->GetPixel(x + kerx, y + kery);
windowR[index] = GetRValue(color);
windowG[index] = GetGValue(color);
windowB[index++] = GetBValue(color);
}
dest->SetPixel(x, y, FindColorMedian(windowR, windowG, windowB, kwidth * kwidth));
}
if (y == ypad) {
for (i = 0; i < ypad; i++) {
dest->SetPixel(0, i, dest->GetPixel(xpad, ypad));
for (j = xpad; j < nWidth - xpad; j++)
dest->SetPixel(j, i, dest->GetPixel(j, ypad));
dest->SetPixel(nWidth - xpad, i, dest->GetPixel(xextra, ypad));
}
} else if (y == nHeight - yextra) {
for (i = 0; i < ypad; i++) {
dest->SetPixel(0, nHeight - yextra + 1 + i, dest->GetPixel(xpad, nHeight - yextra));
for (j = xpad; j < nWidth - xpad; j++)
dest->SetPixel(j, nHeight - yextra + 1 + i, dest->GetPixel(j, nHeight - yextra));
dest->SetPixel(nWidth - xpad, nHeight - yextra + 1 + i, dest->GetPixel(xextra, nHeight - yextra));
}
} else {
dest->SetPixel(0, y, dest->GetPixel(xpad, y));
dest->SetPixel(nWidth - xpad, y, dest->GetPixel(xextra, y));
}
}
}

COLORREF CMeshWarp::FindColorMedian(BYTE *r, BYTE *g, BYTE *b, int wsize)
{
unsigned int vec_sum, min_sum = 10000;
int index = 0;
for (int i = 0; i < wsize; i++) {
vec_sum = 0;
for (int j = 0; j < wsize; j++) {
vec_sum += abs(r[i] - r[j]);
vec_sum += abs(g[i] - g[j]);
vec_sum += abs(b[i] - b[j]);
}
if (vec_sum <= min_sum) {
min_sum = vec_sum;
index = i;
}
}
return RGB(r[index], g[index], b[index]);
}
프로필 사진

답변자님,

정보를 공유해 주세요.

1 개 답변
1번째 답변
프로필 사진
코딩캠프학원
영웅
게임프로그래밍 36위, C, C++, 프로그래머 분야에서 활동
본인 입력 포함 정보
내공 100에 솔깃해서 답을 쓰긴 하는데요...
넘 복잡하군여.. 신경쓰기 머리 아파서 대충 설명할테니
이해가 가시면 100 주세여....

구조를 파악할때는 우선 단순화 시킬줄 알아야 합니다.
제일 체 외곽 중괄호 부터 차례로 보아 나가면 됩니다.
변수선언등은 구조파악과는 상관없으니 다 지우고여.


void CMeshWarp::MedianFilter(CDIB *src, CDIB *dest, int kwidth)
{
for (y = ypad; y < (nHeight - ypad); y++) {
for (x = xpad; x < (nWidth - xpad); x++) {
}
}
}
자 이게 축소된 구조에요.
구조파악에 중요한것 하나가 입출력 이죠... 어느것이 입출력이냐하면...
이건 경험이 좀 있어야 금방 알아 낼 수 있는것인데요.
이 경우는 좀 쉽네요. 함수 이름에 Get, Set이 붙으면 좀더 구조와
관련된 입출력일 수 있지만 다 그런건 아녜요.

암튼 구조적인 면에서 만 본다면 다음과 같이 압축할수 있겠네요.
void CMeshWarp::MedianFilter(CDIB *src, CDIB *dest, int kwidth)
{
for (y = ypad; y < (nHeight - ypad); y++) {
for (x = xpad; x < (nWidth - xpad); x++) {
color = src->GetPixel(x + kerx, y + kery);
}
dest->SetPixel(x, y, FindColorMedian(windowR, windowG, windowB, kwidth * kwidth));
}
dest->SetPixel(0, y, dest->GetPixel(xpad, y));
dest->SetPixel(nWidth - xpad, y, dest->GetPixel(xextra, y));

}
GetPixel로 얻어서 원하는 처리(미디언필터링처리)를 한다음에
결과를 SetPixel 한다.. 모 이정도 뜻이되겠네요.
이것을 전체 이중 포문을 돌려서 모든 픽셀에 처리 하고 있는 구조에요.

저 바깥에 이중 포문에 쌓여 있지 않고 y 포문 하나에만 쌓여 있는
두개의 SetPixel은 여분 처리인거 같은데 좀 성격이 다른거겠죠...
아마도 잔랸 처리 정도 일테니.. 메인 알고리즘이해하는데는 필요 없다고
생각해도 될런지...

그럼 이제 메인 구조를 파악 했으면 세부 구조도 좀 드가 볼까여...
세부구조라면... 미디언 필터링 처리 정도가 되겠는데..
for (kery = -1 * ypad; kery <= ypad; kery++)
for (kerx = - 1 * xpad; kerx <= xpad; kerx++) {
color = src->GetPixel(x + kerx, y + kery);
windowR[index] = GetRValue(color);
windowG[index] = GetGValue(color);
windowB[index++] = GetBValue(color);
}
이 부분은 하나의 픽셀출력값을 얻기위해 주변 픽셀얻어오는 과정쯤 되요
FindColorMedian 함수 보면 windowRGB 에서 필요한 값들이 있는데
이 값들을 참고로 미디언 필터링을 하여 최종 필셀값을 알아 내게
되어 있군요..
그래서 위와 같이 주변 색들의 RGB 값을 얻어오게 한것이에요
어떻게 주변 색인지 알았냐고요? GetPixel(x + kerx, y + kery);
이 부분보고 알 수가 있어요. x로부터 ker 만큼 떨어진 픽셀들을 얻어오게
있짠아요.

그럼... 내공 100주셔야 해요..

2004.06.15.

  • 채택

    질문자가 채택한 답변입니다.

도움이 되었다면 UP 눌러주세요!
UP이 많은 답변일수록 사용자들에게 더 많이 노출됩니다.