OpenCV에서 이미지의 밝기를 줄이는 방법은 밝기를 높이는 방법과 매우 유사합니다. 두 방법의 유일한 차이점은 연산 방향에 있습니다. 밝기를 높일 때는 이미지에 Scalar(B, G, R) 값을 더하지만, 밝기를 줄일 때는 이미지에서 스칼라 값을 빼주면 됩니다.
즉, 각 픽셀의 B(파랑), G(초록), R(빨강) 채널 값에서 동일한 크기의 값을 차감하면 전체적으로 어두운 이미지가 생성됩니다.
핵심 원리
OpenCV에서 이미지는 Mat 객체(행렬)로 표현되며, 행렬과 스칼라 값 사이의 산술 연산을 지원합니다. 따라서 original - Scalar(80, 80, 80)처럼 간단한 뺄셈 연산만으로 모든 픽셀에서 일정한 값을 제거하여 밝기를 낮출 수 있습니다. 이때 스칼라 값이 클수록 결과 이미지는 더 어둡게 나타납니다.
예제 코드
다음 프로그램은 OpenCV를 사용하여 이미지의 밝기를 줄이는 방법을 보여줍니다.
#include<iostream>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
int main() {
Mat original; // 원본 이미지를 불러올 행렬 선언//
Mat dimmer;// 밝기 조절 후 이미지를 저장할 행렬 선언//
namedWindow("Original");// 원본 이미지를 표시할 창 생성//
namedWindow("Dimmer");// 어두운 이미지를 표시할 창 생성//
original = imread("bright.jpg");// 이미지 파일 읽기//
dimmer = original - Scalar(80, 80, 80);// 스칼라 값을 빼서 밝기 감소//
imshow("Original", original);// 원본 이미지 출력//
imshow("Dimmer", dimmer);// 어두워진 이미지 출력//
waitKey(0);// 키 입력 대기//
return(0);
}실행 결과
프로그램을 실행하면 원본 이미지와 함께 각 채널에서 80씩 차감되어 어두워진 이미지가 두 개의 별도 창에 나타납니다.

참고 사항
스칼라 값의 세 인자는 각각 B, G, R 순서를 나타내며, 세 값을 다르게 설정하면 단순히 어둡게 하는 것을 넘어 특정 색조를 강조하거나 감소시키는 효과도 얻을 수 있습니다. 또한 뺄셈 결과가 0보다 작아지는 경우 자동으로 0으로 포화(saturate) 처리되므로, 값이 잘리는 오버플로우 현상에 대해 별도로 걱정할 필요가 없습니다.