이미지의 밝기와 대비를 조절하는 건 OpenCV에서 가장 많이 쓰이는 기초 처리이자 전처리 작업입니다.
밝기와 대비란 무엇인가요?
밝기(Brightness)는 이미지 전체의 명도 수준을 의미하고,
대비(Contrast)는 밝은 부분과 어두운 부분의 차이를 말해요.
밝기를 높이면 전체적으로 더 하얗게, 낮추면 더 어둡게 보이고,
대비를 높이면 윤곽이 뚜렷해지지만 낮추면 흐릿해져요.
사진 보정, OCR(문자인식), 객체 인식 등에서 최적의 밝기/대비를 맞추는 것은
필수적인 전처리 과정이에요.
수식으로 조절하기: new_img = α * img + β
OpenCV에서는 이미지를 조정할 때 간단한 선형 수식을 사용해요:
new_img = α × img + β
여기서 α는 대비(contrast) 조절 계수이고,
β는 **밝기(brightness)**를 조절하는 값이에요.
예를 들어 α=1.2, β=30이면 대비를 약간 높이고 전체 밝기를 조금 밝게 만드는 효과가 있어요.
cv::Mat src = cv::imread("sample.jpg"); cv::Mat dst; double alpha = 1.2; // 대비 int beta = 30; // 밝기 src.convertTo(dst, -1, alpha, beta); |
이 코드는 간단하지만 강력하며, 모든 채널에 동일하게 적용돼 자연스러운 결과를 만들어줘요.
트랙바로 실시간 조절하기
밝기와 대비 값을 조절할 때 트랙바를 연결하면 실시간 조정 UI를 만들 수 있어요.
cv::createTrackbar()를 이용해 α, β 값을 조정하고,
convertTo()로 적용하면 사용자에게 훨씬 직관적인 인터페이스를 제공할 수 있어요.
실시간 밝기 조절은 영상 스트리밍, 사진 편집 앱, 산업용 카메라 보정 등 다양한 상황에서 매우 유용해요.
실시간 트랙바 UI로 밝기/대비 조절 도구 만들기
OpenCV에서는 cv::createTrackbar()를 활용하면 밝기(β)와 대비(α) 값을
실시간으로 조정할 수 있는 UI 도구를 쉽게 만들 수 있어요.
기본 구조는 다음과 같아요:
- 원본 이미지를 불러온다.
- 윈도우를 생성하고 트랙바를 연결한다.
- 트랙바가 조정될 때마다 convertTo()를 호출해 조정된 이미지를 갱신한다.
아래는 그 예제 코드입니다.
#include <opencv2/opencv.hpp> using namespace cv; int alpha_slider = 100; // 초기 대비: 1.0 (100으로 나눔) int beta_slider = 0; // 초기 밝기: 0 Mat src, dst; void on_trackbar(int, void*) { double alpha = alpha_slider / 100.0; int beta = beta_slider; src.convertTo(dst, -1, alpha, beta); imshow("Adjusted Image", dst); } int main() { src = imread("sample.jpg"); if (src.empty()) return -1; namedWindow("Adjusted Image", WINDOW_AUTOSIZE); createTrackbar("Contrast", "Adjusted Image", &alpha_slider, 300, on_trackbar); createTrackbar("Brightness", "Adjusted Image", &beta_slider, 200, on_trackbar); on_trackbar(0, 0); // 초기 이미지 표시 waitKey(0); return 0; } |
- alpha_slider는 실수형 대비를 표현하기 위해 100배해서 슬라이더로 처리해요.
- beta_slider는 음수도 가능하게 하면 더 넓은 밝기 조절이 가능해요.
- 슬라이더 범위를 적절히 조정하면 너무 극단적인 왜곡 없이 섬세한 조절이 가능해요.
이 구조는 이미지뿐 아니라 실시간 카메라 영상에도 그대로 적용할 수 있어요.
다양한 필터와 함께 확장해서 작은 편집 도구를 만들어보는 것도 좋아요.
히스토그램 평활화와의 차이
밝기·대비 조절은 단순히 전체 픽셀을 일괄적으로 조정하지만,
히스토그램 평활화(equalizeHist)는 픽셀 분포 자체를 조정해서
전체 이미지의 명암 대비를 개선해줘요.
둘은 목적이 다르기 때문에 함께 사용할 수도 있어요.
예를 들어, 먼저 convertTo()로 밝기를 맞추고,
그다음 equalizeHist()로 히스토그램 보정을 하면 더 명확한 이미지 분석이 가능해요.
이 블로그의 내용을 대화 형식인 음성으로 들으면서 정리하면, 보다 쉽게 이해할 수 있을 거예요.
다운받아 들어보세요~
'IT' 카테고리의 다른 글
OpenCV에서 윤곽선(contour) 검출과 그리기 (0) | 2025.06.26 |
---|---|
OpenCV로 엣지 검출: Canny 알고리즘 설명과 활용 (0) | 2025.06.26 |
OpenCV에서 이미지 히스토그램 분석 (1) | 2025.06.26 |
OpenCV 필터링: 블러, 가우시안, 미디언 필터 사용법 (0) | 2025.06.25 |
OpenCV로 이미지 자르기와 리사이징 (0) | 2025.06.25 |