728x90

명암비 콘트라스트 조절 방법

 

영상이 전반적으로 어둡거나 또는 전반적으로 밝은 픽셀로만 구성된 경우는 명암비가 낮다고 표현

밝은 영역과 어두운 영역이 골고루 섞여 있는 영상은 명암비가 높다고 표현

 

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

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

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

	float s1 = 2.f;
	Mat dst1 = s1 * src;

	float s2 = 0.5f;
	Mat dst2 = s2 * src;

	imshow("src", src);
	imshow("dst1", dst1);
	imshow("dst2", dst2);
	waitKey();

	destroyAllWindows();
}

2023.04.06 - [러닝머신] - [컴퓨터 비전 & 머신러닝] 영상의 밝기 조절

 

[컴퓨터 비전 & 머신러닝] 영상의 밝기 조절

그레이스케일 영상 만들기 Mat img1 = imread("lenna.bmp", IMREAD_GRAYSCALE); Mat img2(480, 640, CV_8UC1, Scalar(0)); //CV_8UC1 타입, 모든 픽셀 값이 0으로 초기화된 640x480 그레이스케일 영상 생성 Mat img3 = imread("lenna.bmp"

zenstudy.tistory.com

dst1을 보면 앞서 배웠던 포화연산이 적용되어 흰색으로 나타나는 영역이 많아지게 된다

이로 인해 사물의 윤곽을 구분하기 더 어려워졌다

 

효과적으로 명암비를 조절하기 위해서는 밝은 픽셀은 더 밝게, 어두운 픽셀은 더 어둡게 변경해야 한다

그 기준을 그레이스케일 범위 중간 값인 128을 기준으로 설정할 수도 있고,

입력 영상의 평균 밝기로 설정할 수 있다

 

기준을 128로 설정하는 방법을 구현하면 밑에 식이 완성된다

dst(x, y) = scr(x, y) + (scr(x, y)-128)*α

이 수식은 항상 (128, 128) 좌표를 지나가고 α에 의해 기울기가 변경되는 직선의 방정식이다

 

앞의 식으로는 0보다 작아지거나 255보다 커지는 경우가 발생할 수도 있으니 포화연산도 함께 수행해야 한다

dst(x,y) = saturate(scr(x,y)+(scr(x,y)-128)* α)

 

 

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

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

	float alpha1 = 1.f;
	Mat dst1 = src + (src - 128) * alpha1;
	float alpha2 = -0.5f;
	Mat dst2 = src + (src - 128) * alpha2;

	imshow("src", src);
	imshow("dst1", dst1);
	imshow("dst2", dst2);
	waitKey();

	destroyAllWindows();
}

확실히 전에 실행했던 코드보다 명암비다 자연스럽게 증가된 것을 확인할 수 있다

728x90