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

C++와 OpenCV를 활용한 히스토그램 평활화(Histogram Equalization) 적용 방법

히스토그램은 이미지의 명도(밝기 강도) 분포를 나타내는 그래프입니다. 예를 들어, 색상 깊이가 8비트인 이미지를 생각해 보겠습니다. 이는 모든 픽셀이 0부터 255까지의 색상 값을 가질 수 있다는 의미입니다. 만약 이미지가 RGB 이미지라면 빨강(Red), 초록(Green), 파랑(Blue) 세 개의 채널로 구성됩니다. 예를 들어, 이미지의 특정 지점에 빨간색만 존재한다면 해당 픽셀의 색상 정보는 빨간색 채널에 기록되며, 값은 0부터 255 사이에서 변합니다. 여기서 0은 빨간색이 전혀 없음을, 255는 빨간색이 가장 진함을 의미합니다.

히스토그램은 이러한 결과를 모든 채널과 모든 색상에 대해 보여줍니다. 픽셀 값을 조정하면 특정 색상의 강도를 변경할 수 있습니다. 예를 들어, 빨간색 채널의 밀도를 높이고 싶다면 빨간색 채널의 값을 변경하면 됩니다.

그레이스케일 이미지에 히스토그램 평활화 적용하기

먼저 그레이스케일(회색조) 이미지에 히스토그램 평활화를 적어보겠습니다. 그레이스케일 이미지는 검정과 흰색만 포함하므로 채널이 하나뿐입니다. 이 이미지 역시 8비트 이미지이며, 색상 깊이는 0부터 255까지입니다. 일반적으로 0은 검정을, 255는 흰색을 나타냅니다.

아래 코드에서는 컬러 이미지를 불러온 후 그레이스케일로 변환하고, OpenCV에서 제공하는 equalizeHist() 함수를 사용하여 픽셀 값을 평활화합니다. 히스토그램 평활화는 이미지의 대비(contrast)를 개선하여 어두운 부분과 밝은 부분의 차이를 더욱 뚜렷하게 만들어 주는 대표적인 영상 처리 기법입니다.

예제 코드

#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
int main() {
   Mat original;//행렬 선언//
   original = imread("view.jpg");//이미지 불러오기
   Mat gray;//행렬 선언//
   cvtColor(original, gray, COLOR_BGR2GRAY);//그레이스케일 변환//
   Mat hist;//행렬 선언//
   equalizeHist(gray, hist);//히스토그램 평활화 적용
   namedWindow("Original");//원본 이미지 창//
   namedWindow("gray");//그레이스케일 이미지 창//
   namedWindow("histogram");//히스토그램 창//
   imshow("Original", original);//원본 이미지 출력//
   imshow("gray", gray);//그레이스케일 이미지 출력//
   imshow("histogram", hist);//히스토그램 평활화 결과 출력
   waitKey(0);//키 입력 대기//
   return(0);
}

코드 설명

위 코드의 동작 과정을 단계별로 살펴보면 다음과 같습니다.

1. 이미지 로드: imread() 함수를 사용해 "view.jpg" 파일을 Mat 객체로 불러옵니다.

2. 그레이스케일 변환: cvtColor() 함수와 COLOR_BGR2GRAY 옵션을 사용하여 BGR 컬러 이미지를 단일 채널의 그레이스케일 이미지로 변환합니다.

3. 히스토그램 평활화: equalizeHist() 함수에 그레이스케일 이미지를 입력하면, 누적 분포 함수(CDF)를 기반으로 픽셀 값이 재분배되어 대비가 향상된 결과가 출력 행렬에 저장됩니다.

4. 결과 확인: namedWindow()imshow() 함수를 통해 원본 이미지, 그레이스케일 이미지, 평활화된 이미지를 각각 별도의 창에 표시합니다.

5. 프로그램 종료 대기: waitKey(0)는 사용자가 키를 누를 때까지 프로그램을 대기 상태로 유지하여 결과 화면을 확인할 수 있게 합니다.

실행 결과

프로그램을 실행하면 원본 이미지, 그레이스케일로 변환된 이미지, 그리고 히스토그램 평활화가 적용된 이미지 세 개의 창이 순차적으로 나타납니다. 평활화가 적용된 이미지는 원본에 비해 명암 대비가 뚜렷해지고, 어두운 영역의 디테일이 더 잘 드러나는 것을 확인할 수 있습니다.