영상의 명암비 조절

명암비

  • 밝은 곳과 어두운 곳 사이에 드러나는 밝기 정도의 차이
  • Contrast : 대비

image

  • 간단한 명암비 조절 방법
    • 기본적으로 입력 영상의 각 픽셀에 일정 비율의 상수(s)를 곱하는 형태
      • 0 < s < 1 : 명암비가 낮아짐
      • s > 1 : 명암비가 높아짐

image

image

image image
- 효과적인 명암비 조절 방법 - (128, 128)를 지나는 직선의 방정식으로 구성 - 직선의 기울기를 조절하는 것은 알파 값 - -1 < 알파 < 0 : 명암비가 낮아짐 - 알파 > 0 : 명암비가 높아짐 image image ``` int main(int argc, char* argv[]) { Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE); if (src.empty()) { cerr << "Image load failed!" << endl; return -1; } float alpha = 1.0f; Mat dst = src + (src - 128) * alpha; imshow("src", src); imshow("dst", dst); waitKey(); } ``` - lenna.bmp 처럼 평균 밝기가 128 근방일 경우 아주 좋은 형태의 결과를 만들어 낼 수 있음 - 하지만 너무 밝거나 너무 어두운 영상을 사용할 경우 좋은 결과를 만들기 어려움
imageimage
- 평균 밝기를 고려한 명암비 코드 ``` #include #include "opencv2/opencv.hpp" using namespace std; using namespace cv; int main(int argc, char* argv[]) { Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE); if (src.empty()) { cerr << "Image load failed!" << endl; return -1; } #if 0 float alpha = 1.0f; Mat dst = src + (src - 128) * alpha; #else float alpha = 1.0f; int m = (int)mean(src)[0]; Mat dst = src + (src - m) * alpha; // 128 대신 주어진 영상의 평균값을 입력 cout << "mean : " << m << endl; #endif imshow("src", src); imshow("dst", dst); waitKey(); } ``` - 포화된 부분이 줄어든 것을 확인할 수 있음
imageimage