[C++/MFC] High-Pass Filter

Lachi_·2023년 11월 30일
0

mfc

목록 보기
5/16

Highpass 필터는 고주파는 통과, 저주파는 차단시키는 필터이다.
이웃과의 화소 값 변화를 보기 떄문에 미분을 이용하며, 따라서 이미지의 Edge를 검출하는데 쓰인다.

즉, 물체의 경계를 표시해주는 역할을 한다.

또한 이미지를 선명화 처리해 영상 내 미세하고 섬세한 부분을 강조하고, 모호한 부분을 개선하는 필터이다.

Edge를 검출하기 위해서는 미분을 사용하여, 화소값의 변화가 큰 부분을 찾아내 검출한다.

void CImageDlg::HighPassFilter()
{
	// 이미지가 로드되지 않았으면 반환
	if (m_original == nullptr)
		return;

	// 결과를 저장할 임시 이미지 생성
	BYTE* temp = new BYTE[IMAGE_SIZE];
	memcpy(temp, m_original, IMAGE_SIZE);

	// 필터 크기 설정
	int pad = filterSize / 2;

	// 각 픽셀에 대해
	for (int y = pad; y < IMAGE_HEIGHT - pad; y++) {
		for (int x = pad; x < IMAGE_WIDTH - pad; x++) {

			int sum = 0;
			if (filterSize == 3) {
				// 필터 적용
				for (int i = -pad; i <= pad; i++) {
					for (int j = -pad; j <= pad; j++) {
						if (i == 0 && j == 0)
							sum += m_original[(y + i) * IMAGE_WIDTH + (x + j)] * 8;
						else
							sum += m_original[(y + i) * IMAGE_WIDTH + (x + j)] * -1;
					}
				}
			}
			else if (filterSize == 5) {
				// 필터 적용
				for (int i = -pad; i <= pad; i++) {
					for (int j = -pad; j <= pad; j++) {
						if (i == 0 && j == 0)
							sum += m_original[(y + i) * IMAGE_WIDTH + (x + j)] * 24;
						else
							sum += m_original[(y + i) * IMAGE_WIDTH + (x + j)] * -1;
					}
				}
			}
			// 필터 적용 결과의 최대 최소 설정
			if (sum < 0) sum = 0;
			if (sum > 255) sum = 255;

			// 결과를 임시 이미지에 저장
			temp[y * IMAGE_WIDTH + x] = sum;
		}
	}

	// 결과를 m_filtered에 복사
	memcpy(m_filtered, temp, IMAGE_SIZE);
	delete[] temp;  // 할당 해제
}

이 코드는 예를들어 3 x 3 마스크의 경우 중앙에는 8의 가중치를, 가장자리에는 -1의 가중치를 두어 고주파 영역, 즉 노이즈가 두드러지게 한다.

픽셀에 따라 자동으로 중심 픽셀의 가중치를 구현하려면 다음과 같이 하면 되겠다.

// 필터 적용
for (int i = -pad; i <= pad; i++) {
	for (int j = -pad; j <= pad; j++) {
		if (i == 0 && j == 0)
			sum += m_original[(y + i) * IMAGE_WIDTH + (x + j)] * (filterSize * filterSize);
		else
			sum += m_original[(y + i) * IMAGE_WIDTH + (x + j)] * -1;
	}
}

장단점

고주파 필터는 이미지에서 높은 주파수 성분, 즉 세밀한 부분과 경계선을 강조하는 특징이 있다. 장점으로는 세밀한 부분이나 경계선을 뚜렷하게 만들 수 있다는 점이 있지만 단점으로는 이미지 내의 노이즈도 함께 강조할 수 있다.

profile
개인 저장용. 오류 매우 많음.

0개의 댓글