영상 처리 시 흑백 이미지를 많이 이용한다.
흑백 이미지의 밝기를 조절하는 가장 쉬운 방법을 학습했다.
개념
(1) Grayscale 이미지
- Grayscale 이미지 - 각 픽셀이 밝기 값을 나타내는 1 채널 이미지
- 픽셀 값 범위 :
- 8비트 이미지 : 0 (검은색) ~ 255 (흰색)
- 범위 내의 값이 높을수록 밝음
(2) 밝기 조절 방식
- 픽셀 값에 일정한 값을 더하거나 뺌 :
- 밝기 증가: {new_pixel} = {old_pixel} + {adjustment}
- 밝기 감소: {new_pixel} = {old_pixel} - {adjustment}
- 결과 값은 반드시 0~255 사이로 클리핑(잘라내기)해야 함
- 픽셀 값을 곱하거나 나눔 :
- 곱셈을 통해 밝기를 조절하면 더 자연스러운 결과를 얻을 수 있음
- 밝기 증가: {new_pixel} = {old_pixel} X {scale} ()
- 밝기 감소: {new_pixel} = {old_pixel} X {scale} ()
(3) 연산 방법
- OpenCV는 cv::add, cv::multiply와 같은 함수를 제공하여 효율적으로 계산
- 직접 픽셀 데이터를 순회하며 연산을 수행도 가능
덧셈 vs 곱셈
- 덧셈 --> 모든 픽셀이 균일하게 밝아짐
- 곱셉 --> 밝은 부분은 더 밝게
- 예) (1,5,25) *5 => (5, 25, 125)
- 5, 25는 여전히 어둡지만, 125는 확 밝아질 것
예제 코드 1 - 덧셈 뺄셈
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
cv::Mat img_1 = cv::imread("../test.png",0);
cv::Mat img_2 = img_1 + 100;
cv::Mat img_3 = img_1 - 100;
cv::imshow("original",img_1);
cv::imshow("sum",img_2);
cv::imshow("sub",img_3);
cv::waitKey(0);
return 0;
}
- 코드 결과 : 고르게 밝기가 조절됨
예제 코드 2 - 곱셈 나눗셈
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
cv::Mat img_1 = cv::imread("../test.png",0);
cv::Mat img_2 = img_1 * 2;
cv::Mat img_3 = img_1 / 2;
cv::imshow("original",img_1);
cv::imshow("mul",img_2);
cv::imshow("div",img_3);
cv::waitKey(0);
return 0;
}
- 코드 결과 : 밝은 부분이 확 밝아짐
===>
뺄셈 - 0 아래로 떨어지는 경우가 많아 전체적으로 검은 이미지
나눗셈 - 안정적으로 어두운 이미지 출력
아래의 참고 블로그에선
밝은 이미지에서 대상을 명확하게 하고 싶은 경우, 덧셈
어두운 이미지에서 배상을 명확하게 하고 싶은 경우, 나눗셈
을 추천
[C++ opencv] 가장 쉽게 이미지 밝기 조절 하는 방법
본문 목표 OpenCV를 사용해서 영상처리를 할 때, 전에도 말했지만 무조건 흑백(grayscale) 이미지에서 연산을 처리해야 한다고 했다. 그 이유로는 연산처리 속도가 빨라지고 명확하게 할 수 있으므로
diyver.tistory.com
'비디오 코덱' 카테고리의 다른 글
이미지 밝기 조절 : Histogram, calcHist 이용 (1) (0) | 2024.11.28 |
---|---|
waitKey(30) >= 0 알아보기 (0) | 2024.11.27 |
일반 동영상 불러오기 : VideoCapture() (0) | 2024.11.27 |
실시간 영상 프레임 읽어오기 : VideoCapture (1) | 2024.11.27 |
흑백 변환 : cvtColor() vs imread() (0) | 2024.11.27 |