OpenCV | 영상의 명암비 조절

박나연·2021년 3월 20일
0

OpenCV

목록 보기
17/40
post-thumbnail

💡 명암비 조절 방법

명암비란 영상에서 밝은 영역과 어두운 영역사이에 드러나는 밝기 차이의 강도를 의미하고, 명암 대비 또는 콘트라스트 라고도 한다. 밝은 영역과 어두운 영역이 골고루 섞여 있으면 명암비가 높다고 말한다.

영상의 밝기 조절은 모든 픽셀에서 정수 값을 더하거나 빼는 연산을 했었는데, 명암비 조절은 곱셈연산을 사용하여 구현한다.

dst(x, y) = saturate(s * src(x, y))

src 는 입력영상, dst는 결과 영상, 상수 s는 0보다 큰 양의 실수이다. 이 또한 포화연산을 통해 범위를 조절해주어야 한다.

void contrast1() {
	Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);

	if (src.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}

	float s = 2.f;
	Mat dst = s * src;

	imshow("src", src);
	imshow("dst", dst);
	waitKey();
	destroyAllWindows();

}

위 코드는 단순히 픽셀값에 일정 상수를 곱하여 명암비를 조절한 방식인데, 이 결과 사물의 윤곽구분이 더 어려워져 효과적이지 않았다.

💡 효과적인 명암비 조절방법

픽셀 값이 밝고 어둡다는 기준을 정하여 영상의 품질을 높일 수 있다. 먼저 픽셀값의 중간값인 128을 기준으로 명암비를 조절한다면, 픽셀값이 128보다 크면 더욱 밝게, 128보다 작으면 픽셀값을 더 작게 만드는 것이다.

dst(x, y) = src(x, y) + (src(x, y) - 128) * a

이 수식은 항상 (128, 128) 좌표를 지나며 a에 의해 기울기가 변경된다.

dst(x, y) = saturate(src(x, y) + (src(x, y) - 128) * a)

포화연산도 함께 수행한 수식이다.

float alpha = 1.f;
Mat dst = src + (src - 128) * alpha;

profile
Data Science / Computer Vision

0개의 댓글