ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • White Balancing 예제
    컴공지식/컴퓨터비전 2024. 9. 20. 01:08

    화이트 밸런싱 예제 코드를 살펴보자

     

    void white_balancing(Mat img) {
        Mat bgr_channels[3];  // BGR 채널을 저장할 배열
        split(img, bgr_channels);  // 이미지를 BGR 채널로 분리

        double avg;  // 평균값을 저장할 변수
        int sum, temp, i, j, c;  // 계산에 필요한 임시 변수들

        // 각 채널에 대해 루프 실행 (B, G, R 채널을 하나씩 처리)
        for (c = 0; c < img.channels(); c++) {
            sum = 0;
            avg = 0.0f;

            // 각 채널의 값들을 더해서 합계 구하기
            for (i = 0; i < img.rows; i++) {
                for (j = 0; j < img.cols; j++) {
                    sum += bgr_channels[c].at<uchar>(i, j);  // 픽셀 값 합계
                }
            }

            // 채널 값들의 평균 구하기
            avg = sum / (img.rows * img.cols);  // 평균값 계산

            // 각 픽셀 값 보정 (128을 기준으로 평균값을 조정)
            for (i = 0; i < img.rows; i++) {
                for (j = 0; j < img.cols; j++) {
                    temp = (128 / avg) * bgr_channels[c].at<uchar>(i, j);  // 보정 계산
                    if (temp > 255)
                        bgr_channels[c].at<uchar>(i, j) = 255;  // 255보다 크면 최대값으로 제한
                    else
                        bgr_channels[c].at<uchar>(i, j) = temp;  // 그렇지 않으면 보정된 값 할당
                }
            }
        }

        // 다시 BGR 채널을 합쳐서 원래 이미지로 복원
        merge(bgr_channels, 3, img);  // 분리된 채널을 다시 합침
    }

     

    bgr_channels 배열은 B, G, R 채널을 각각 분리해서 저장할 공간이다.

    split 함수로 입력 이미지 img를 B, G, R 채널로 분리한다.

    for문은 B 채널, G 채널, R 채널을 각각 따로 보정한다.

    sum 부분은 채널(B, G, R)의 각 픽셀 값들을 모두 더해서 합계를 구한다.

    i는 행(row), j는 열(column)이고, at<uchar>로 각 픽셀의 값을 가져온다.

    avg는 각 채널의 평균 픽셀 값을 계산한다. 이미지의 총 픽셀 수(행 × 열)로 합계를 나누면 평균이 나온다.

     

    temp = (128 / avg) * bgr_channels[c].at<uchar>(i, j);

    이 부분이 화이트 밸런싱의 핵심인데 평균값을 128로 맞추기 위해 현재 채널의 픽셀 값들을 조정한다.

    128은 이미지의 중립적인 회색톤 값이다. 평균을 기준으로 픽셀 값을 비율에 맞춰 늘리거나 줄이는 거다.

    계산된 값이 255보다 크면 255로 제한한다. 

    조정이 끝난 B, G, R 채널을 merge를 통해 다시 합쳐서 원래 이미지로 복원한다.

     

    이렇게 보정을 해줌으로써 이미지의 색 균형을 맞춘다. 

    예를 들어, 이미지가 너무 푸르게 보인다면, 이 코드가 B 채널을 조정해서 균형을 맞춰 더 자연스러운 색으로 만들어준다.

     

    '컴공지식 > 컴퓨터비전' 카테고리의 다른 글

    Sobel 엣지 검출기(Sobel Edge Detector) 구현  (0) 2024.09.25
    엣지 픽셀(Edge pixels)과 엣지(Edges)  (1) 2024.09.25
    Pseudo Coloring 예제  (0) 2024.09.20
    HSI 예제  (1) 2024.09.20
    Split/Merge  (0) 2024.09.20
Designed by Tistory.