[C++/MFC] Max/Min Filter

Lachi_·2023년 11월 30일
0

mfc

목록 보기
6/16

Max

Max 필터는 주어진 픽셀 주변의 픽셀 값 중에서 가장 큰 값을 선택하는 필터로, 입력 영상의 중심화소에서 마스크 씌운 영역의 입력화소들을 가져와 그 중 최댓값을 출력 화소로 결정한다. 검은색 노이즈를 선택하지 않기 때문에 이미지 내에서 가장 밝은 부분을 강조하는 데 사용된다. 반대로 [[Min]] 필터는 흰색 노이즈를 선택하지 않기 떄문에 정반대의 결과가 나오게 된다. [[Min]]필터와 [[Max]]필터 모두 이미지의 세밀한 부분이나 중간 톤을 무시할 수 있다는 단점을 공유한다.

마스크의 크기가 클수록 더 넓은 영역을 고려하게 돼서, 이미지의 전체적인 밝기나 어둠을 강조하는 효과가 커진다.

void CImageDlg::MaxFilter()
{
	// 이미지가 로드되지 않았으면 반환
	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++) {

			BYTE maxVal = 0;
			// 필터 적용
			for (int i = -pad; i <= pad; i++) {
				for (int j = -pad; j <= pad; j++) {
					BYTE curVal = m_original[(y + i) * IMAGE_WIDTH + (x + j)];
					if (curVal > maxVal) {
						maxVal = curVal;
					}
				}
			}

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

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

Min

Min 필터는 주어진 픽셀 주변의 픽셀 값 중에서 가장 작은 값을 선택하는 필터로, 입력 영상의 중심화소에서 마스크 씌운 영역의 입력화소들을 가져와 그 중 최솟값을 출력 화소로 결정한다. 흰색 노이즈를 선택하지 않기 때문에 이미지 내에서 가장 어두운 부분을 강조하는 데 사용된다. 반대로 [[Max]] 필터는 검은색 노이즈를 선택하지 않기 떄문에 정반대의 결과가 나오게 된다. [[Min]]필터와 [[Max]]필터 모두 이미지의 세밀한 부분이나 중간 톤을 무시할 수 있다는 단점을 공유한다.

업로드중..

마스크의 크기가 클수록 더 넓은 영역을 고려하게 돼서, 이미지의 전체적인 밝기나 어둠을 강조하는 효과가 커진다.


void CImageDlg::MinFilter()
{
	// 이미지가 로드되지 않았으면 반환
	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++) {

			BYTE minVal = 255;
			// 필터 적용
			for (int i = -pad; i <= pad; i++) {
				for (int j = -pad; j <= pad; j++) {
					BYTE curVal = m_original[(y + i) * IMAGE_WIDTH + (x + j)];
					if (curVal < minVal) {
						minVal = curVal;
					}
				}
			}

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

	// 결과를 m_filtered에 복사
	memcpy(m_filtered, temp, IMAGE_SIZE);
	delete[] temp;  // 할당 해제
}
profile
개인 저장용. 오류 매우 많음.

0개의 댓글