Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

OpenCV의 equalizeHist() 함수란? 히스토그램 평활화 완벽 정리

이미지의 히스토그램(histogram)은 픽셀 강도(intensity) 값의 빈도를 시각적으로 보여주는 도구입니다. 이미지 히스토그램에서 X축은 회색조 명도(그레이 레벨)를 나타내며, Y축은 해당 명도가 나타나는 빈도를 나타냅니다.

히스토그램 평활화(Histogram Equalization)는 이미지의 명도 범위를 넓혀 전체적인 대비(contrast)를 개선하는 대표적인 영상 처리 기법입니다. OpenCV에서는 equalizeHist() 함수를 사용하여 주어진 이미지의 히스토그램을 손쉽게 평활화할 수 있습니다.

기본 문법

equalizeHist() 함수의 기본적인 사용 형식은 다음과 같습니다.

equalizeHist(소스 행렬, 목적지 행렬)

그레이스케일 이미지와 컬러 이미지의 차이

이 함수는 기본적으로 그레이스케일 이미지에 적용됩니다. 그레이스케일 이미지는 채널이 하나뿐이므로, 해당 단일 채널의 픽셀 값만 평활화하면 됩니다.

반면 컬러 이미지에 이 함수를 적용하려면 소스 행렬과 목적지 행렬을 그대로 넘기는 방식으로는 처리할 수 없습니다. 대신 이미지를 여러 개의 채널로 분리한 뒤, 각 채널에 대해 개별적으로 평활화를 적용하고 다시 병합하는 과정이 필요합니다.

다음 프로그램은 OpenCV에서 equalizeHist() 함수를 컬러 이미지에 적용하는 과정을 보여줍니다. BGR 이미지를 YCrCb 색 공간으로 변환한 후 채널을 분리하고, 특정 채널에 평활화를 적용한 뒤 다시 BGR로 변환하는 흐름으로 구성되어 있습니다.

예제 코드

#include<iostream>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
int main(int argc, const char** argv) {
    Mat original;//행렬 선언//
    original = imread("sky.jpg");//이미지 불러오기//
    vectorchannels;//각 채널을 저장할 벡터//
    Mat hist;//행렬 선언//
    cvtColor(original, hist, COLOR_BGR2YCrCb);//BGR에서 YCrCb로 변환//
    split(hist, channels);//채널 분리//
    equalizeHist(channels[2], channels[2]);//두 번째 채널에 히스토그램 평활화 적용//
    Mat histeql;//행렬 선언//
    merge(channels, hist);//평활화된 채널을 원래 행렬과 병합//
    cvtColor(hist, histeql, COLOR_YCrCb2BGR);//다시 BGR로 변환//
    namedWindow("original");//원본 이미지를 표시할 창 생성//
    namedWindow("hist");//편집된 이미지를 표시할 창 생성//
    imshow("original", original);//원본 이미지 출력//
    imshow("hist", histeql);//편집된 이미지 출력//
    waitKey(0);//키 입력 대기//
    return 0;
}

실행 결과

프로그램을 실행하면 원본 이미지와 히스토그램 평활화가 적용된 이미지가 두 개의 창에 나란히 표시됩니다. 평활화가 적용된 이미지는 명도 분포가 고르게 펼쳐져 있어 어두운 부분과 밝은 부분의 구분이 더욱 뚜렷해진 것을 확인할 수 있습니다.

OpenCV의 equalizeHist() 함수란? 히스토그램 평활화 완벽 정리

정리

equalizeHist() 함수는 이미지의 대비를 개선하는 강력하고 간단한 도구입니다. 그레이스케일 이미지에는 바로 적용할 수 있으며, 컬러 이미지의 경우 YCrCb와 같은 색 공간으로 변환한 후 채널을 분리·처리·병합하는 절차를 거쳐야 한다는 점을 기억하시기 바랍니다.