[c++] 이미지 히스토그램 평활화

이미지 불러오기

우선, 이미지를 불러오는 라이브러리를 사용하여 이미지를 읽어들입니다. OpenCV 라이브러리는 이미지 처리에 유용하며, 다음과 같이 이미지를 불러올 수 있습니다.

#include <opencv2/opencv.hpp>

int main() {
    cv::Mat image = cv::imread("input.jpg", cv::IMREAD_GRAYSCALE);
    // 이미지 처리 코드 추가
    return 0;
}

히스토그램 계산

이미지의 히스토그램을 계산하기 위해 OpenCV의 calcHist 함수를 사용할 수 있습니다.

cv::Mat histogram;
int channels[] = {0};
int histSize[] = {256};
float range[] = {0, 256};
const float* ranges[] = {range};

cv::calcHist(&image, 1, channels, cv::Mat(), histogram, 1, histSize, ranges, true, false);

누적 분포 함수 계산

히스토그램을 이용하여 누적 분포 함수를 계산합니다.

cv::Mat cdf;
histogram.copyTo(cdf);

for (int i = 1; i < 256; i++) {
    cdf.at<float>(i) += cdf.at<float>(i - 1);
}

평활화된 히스토그램 적용

누적 분포 함수를 이용하여 이미지에 평활화된 히스토그램을 적용합니다.

cv::Mat equalized;
image.copyTo(equalized);

for (int i = 0; i < equalized.rows; i++) {
    for (int j = 0; j < equalized.cols; j++) {
        equalized.at<uchar>(i, j) = 255 * cdf.at<float>(image.at<uchar>(i, j)) / (image.rows * image.cols);
    }
}

결과 저장

처리가 완료된 이미지를 저장합니다.

cv::imwrite("output.jpg", equalized);

이렇게 하여 C++를 사용하여 이미지의 히스토그램 평활화를 구현할 수 있습니다. OpenCV 라이브러리를 활용하여 이미지 처리 작업을 보다 간단하고 효율적으로 수행할 수 있습니다.