비디오 코덱

이미지 밝기 조절하기 : grayscale 직접 연산

케케_ 2024. 11. 28. 12:40

영상 처리 시 흑백 이미지를 많이 이용한다.

흑백 이미지의 밝기를 조절하는 가장 쉬운 방법을 학습했다.

 


개념

 

(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 아래로 떨어지는 경우가 많아 전체적으로 검은 이미지

나눗셈 - 안정적으로 어두운 이미지 출력

 

아래의 참고 블로그에선

밝은 이미지에서 대상을 명확하게 하고 싶은 경우, 덧셈

어두운 이미지에서 배상을 명확하게 하고 싶은 경우, 나눗셈

을 추천

 

 

https://diyver.tistory.com/58

 

[C++ opencv] 가장 쉽게 이미지 밝기 조절 하는 방법

본문 목표 OpenCV를 사용해서 영상처리를 할 때, 전에도 말했지만 무조건 흑백(grayscale) 이미지에서 연산을 처리해야 한다고 했다. 그 이유로는 연산처리 속도가 빨라지고 명확하게 할 수 있으므로

diyver.tistory.com