#include <iostream>
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;
struct FILE_ {
	string file_name[3];
	Mat src[3];
	Mat dst[3];
};

void ex3() {
	/*
	효과적인 명암비 조절 방식
	src(입력영상) 평균밝기를 고려한 명암비 조절.
	영상의 평균 밝기 m을 구하여 (m,m)점을 지나는 직선을 변환 함수로 사용

	dst(x, y) = saturate(src(x, y) + (src(x, y) - m) * a)  // 포화연산 적용된 식.
	if src(x, y) == 128 이면  dst(x, y) 결과영상 픽셀값은 128로 고정.됨으로써(128, 128)  지나며 a.에 의해 기울기가 변하는 직선의 방정식
	a값을 통해 명암비 조절 가능. - 1 < a < 0.일 경우 기울기가 0~1 직선이 되어 명암비가 낮아진다.
	a>0이면 기울기가 1보다 커짐에 따라 명암비를 증가시키게 된다.
*/
	FILE_ file{ {"lenna.bmp","columbia.bmp","tiffany.bmp"} };
	for (int x = 0; x < 3; ++x) {
		file.src[x] = imread(file.file_name[x], IMREAD_GRAYSCALE);
		if (file.src[x].empty()) {
			cerr << "Img load failed!" << endl;
			return;
		}

		float alpha = 1.0f;
		int m = (int)mean(file.src[x])[0];  // [0] 0번째 채널
		file.dst[x] = file.src[x] + (file.src[x] - m) * alpha;
		if(file.file_name[x]== "tiffany.bmp")
		    cout << m << endl;
		imshow("src", file.src[x]);
		imshow("dst", file.dst[x]);
		waitKey();
	}

}
void ex2() {
	/*
	주로, 밝은 것과 어두운 것과의 대비
	영상 전반이 어둡거나 또는 밝은 픽셀로 구성되면 명암비가 낮다고 말하며, 밝은 영역과 어두운 영역이 골고루 분포된 영상은
	명암비가 높다고 말함.
	명암비 조절 수식(간단한 방법)
	dst(x, y) = saturate(s * src(x,y))
	상수 s를 곱함으로써 명암비 조절함.
	0<s<1  명암비가 낮아지는 효과


	 s>1 명암비가 높아지는 효과  //
	 입력영상 픽셀값 0~128 사이라면 결과 영상에서는 픽셀값이 증가하게 된다. 255 리밋값에 따라 255 값 비율이 높아져 좋지 않은 결과이미지가 나온다.
	//tiffany.bmp 에서 명함비가 너무 높아져 좋지 못한 이미지 출력.*/
	FILE_ file{ {"lenna.bmp","columbia.bmp","tiffany.bmp"} };
	for (int x = 0; x < 3; ++x) {
		file.src[x] = imread(file.file_name[x], IMREAD_GRAYSCALE);
		if (file.src[x].empty()) {
			cerr << "Img load failed!" << endl;
			return;
		}

		double alpha = 1;
		file.dst[x] = file.src[x] + (file.src[x] - 128) * alpha;

		imshow("src", file.src[x]);
		imshow("dst", file.dst[x]);
		waitKey();
	}

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

	if (src.empty()) {
		//주로, 밝은 것과 어두운 것과의 대비
		cerr << "Image load failed!" << endl;
		return ;
	}

	double alpha = 1.0;
	int m = (int)mean(src)[0];
	Mat dst = src + (src - m) * alpha;
	cout << m << endl;
	imshow("src", src);
	imshow("dst", dst);
	waitKey();
}
int main()
{
	//ex1();
	// 
	//ex2 와 ex3의 차이를 알아보자
	//ex2();
	ex3();
}

'프로그래머스 > OPENCV' 카테고리의 다른 글

(4-2) 히스토그램분석  (0) 2022.12.02
(4) 히스토그램분석  (0) 2022.12.01
영상의 밝기조절(2)  (3) 2022.12.01
영상의 밝기 조절(1)  (0) 2022.12.01
2-5 유용한 OpenCV 기능  (0) 2022.12.01

+ Recent posts