[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 라이브러리를 활용하여 이미지 처리 작업을 보다 간단하고 효율적으로 수행할 수 있습니다.