[OpenCV] 밝기 조절

zzwon1212·2023년 10월 27일
0

OpenCV

목록 보기
7/16
post-thumbnail

1. 화소 처리(Point Processing)

  • 입력 영상의 특정 좌표 픽셀 값을 변경하여 출력 영상의 해당 좌표 픽셀 값으로 설정하는 연산

    dst(x,y)=f(src(x,y))dst(x, y) = f(src(x, y))
  • 결과 영상의 픽셀 값이 정해진 범위에 있어야 한다. [0, 255]

  • 밝기 조절, 반전, 명암비 조절, 이진화 등

2. 밝기 조절

  • 수식

    dst(x,y)=saturate(src(x,y)+n)dst(x, y) = saturate(src(x, y) + n)
  • 그래프

  • 결과

3. 반전

  • 모든 픽셀값을 최댓값인 255에서 뺀 값으로 설정한다. 밝은 픽셀은 어둡게, 어두운 픽셀은 밝게 변경된다.

  • 수식

    dst(x,y)=255src(x,y)dst(x, y) = 255 - src(x, y)
  • 그래프

  • 결과

4. 밝기 조절 직접 구현하기

  • 직접 구현

    Mat dst(src.rows, src.cols, src.type());
    
    for (int y = 0; y < src.rows; y++) {
        for (int x = 0; x < src.cols; x++) {
            int v = src.at<uchar>(y, x) + 50;
            v = (v > 255) ? 255 : (v < 0) ? 0 : v;
            dst.at<uchar>(y, x) = v;
        }
    }
  • saturate_cast() 템플릿 함수: OpenCV 포화 연산 함수

    int v = src.at<uchar>(y, x) + 50;
    v = (v > 255) ? 255 : (v < 0) ? 0 : v;
    dst.at<uchar>(y, x) = v;

    직접 구현한 코드의 위 부분을 saturate_cast()를 이용하여 아래처럼 작성할 수 있다.

    dst.at<uchar>(y, x) = saturate_cast<uchar>(src.at<uchar>(y, x) + 50);

5. 평균 밝기 보정 프로그램

  • 평균 밝기가 211이던 좌측 원본 사진을, 평균 밝기가 128인 우측 사진으로 보정하였다.

  • 아래는 예제 코드이다.

    // 1. argv[1] 영상을 그레이스케일 형태로 불러오기 (src)
    Mat src = imread(argv[1], IMREAD_GRAYSCALE);
    
    // 2. 입력 영상의 평균 밝기 구하기
    
    // 3. 평균 밝기가 128이 되도록 밝기 보정하기
    Mat dst = src + (128 - m);
    • ① 영상을 입력받는다.
    • ② 영상의 평균 밝기를 구한다. 아래에서 세 가지 방법을 소개한다.
    • ③ 구해둔 평균 밝기를 이용하여, 영상의 평균 밝기가 128이 되도록 보정한다.

5.1. 각 픽셀에 접근하는 방법

int s = 0;
for (int j = 0; j < src.rows; j++) {
    for (int i = 0; i < src.cols; i ++) {
        s += src.at<uchar>(j, i);
    }
}

int m = s / (src.rows * src.cols);
cout << "Mean value: " << m << endl;

5.2. sum()을 이용하는 방법

int m = sum(src)[0] / src.total();
cout << "Mean value: " << m << endl;

5.3. mean()을 이용하는 방법

int m = mean(src)[0];
cout << "Mean value: " << m << endl;

📙강의 - 강사 황선규

profile
JUST DO IT.

0개의 댓글