본문 바로가기
런닝머신 (ML)

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

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