이미지 처리에서 밝기와 대비(Contrast) 조절은 가장 자주 사용되는 편집 효과 중 하나입니다. 이번 글에서는 OpenCV를 활용해 이미지의 대비를 변경하는 방법을 알아보겠습니다.
대비는 이미지의 선명도를 결정하는 핵심 요소입니다. 대비가 높을수록 이미지는 더욱 선명하고 또렷해지며, 반대로 대비가 낮을수록 이미지는 부드럽고 흐릿한 느낌을 줍니다.
대비 변경의 원리
대비를 변경한다는 것은 픽셀 값의 가중치를 높이는 것을 의미합니다. 구체적인 구현 방법은 간단합니다. 이미지의 모든 픽셀 값에 특정 상수를 곱하면 됩니다.
예를 들어, 이미지의 모든 픽셀 값에 2를 곱하면 각 픽셀의 값이 두 배가 되어 명암 차이가 커지고, 결과적으로 이미지가 더욱 선명하게 보입니다.
예제 코드
다음 C++ 프로그램은 OpenCV에서 이미지의 대비를 변경하는 과정을 보여줍니다.
#include<iostream>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
int main() {
Mat original;// 원본 이미지를 저장할 행렬 선언//
Mat contrast;// 대비 변경 후 이미지를 저장할 행렬 선언//
namedWindow("Original");// 원본 이미지를 표시할 윈도우 생성//
namedWindow("Contrast");// 편집된 이미지를 표시할 윈도우 생성//
original = imread("mountain.jpg");// 이미지 불러오기//
original.convertTo(contrast, -1, 2, 0);// 대비 변경//
imshow("Original", original);// 원본 이미지 출력//
imshow("Contrast", contrast);// 편집된 이미지 출력//
waitKey(0);// 키 입력 대기//
return(0);
}
코드 설명
핵심 함수는 convertTo()입니다. 이 함수는 다음과 같은 인자를 받습니다.
- 첫 번째 인자(contrast): 변환 결과를 저장할 출력 행렬
- 두 번째 인자(-1): 출력 데이터 타입 (-1을 지정하면 원본과 동일한 타입 유지)
- 세 번째 인자(2): 스케일 팩터(alpha) — 픽셀 값에 곱해지는 상수로, 대비를 조절
- 네 번째 인자(0): 오프셋(beta) — 픽셀 값에 더해지는 상수로, 밝기를 조절
즉, convertTo(contrast, -1, 2, 0)은 모든 픽셀 값을 2배로 만들어 대비를 높이는 연산을 수행합니다. 세 번째 인자 값을 조절하면 대비의 강도를 자유롭게 변경할 수 있습니다.
실행 결과
