영상처리

Opencv Histogram C++

park__ 2024. 12. 13. 17:05

1. 히스토그램 함수

cv::calcHist(
    const std::vector<cv::Mat>& images,  // 입력 이미지 (벡터)
    const std::vector<int>& channels,   // 분석할 채널 (예: {0}은 그레이스케일)
    const cv::Mat& mask,                // ROI 마스크 (전체 이미지 사용 시 cv::Mat())
    cv::Mat& hist,                      // 출력 히스토그램
    const std::vector<int>& histSize,   // 히스토그램 bin 수 (예: {256})
    const std::vector<float>& ranges    // 픽셀 값 범위 (예: {0, 256})
);

 

2. 예제 코드

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
	// 이미지 읽기
	Mat image = imread(file_path, IMREAD_GRAYSCALE);
	if (image.empty()) {
		cout << "이미지를 불러올 수 없습니다." << endl;
		return -1;
	}

	// 히스토그램 계산
	Mat hist;
	int histSize = 256;             // Bin 개수
	float range[] = { 0, 256 };       // 픽셀 값 범위
	const float* histRange = { range };
	calcHist(&image, 1, 0, Mat(), hist, 1, &histSize, &histRange);

	// 히스토그램 정규화 (그래프 그리기 위해)
	int hist_w = 512, hist_h = 400;
	int bin_w = cvRound((double)hist_w / histSize);
	Mat histImage(hist_h, hist_w, CV_8UC1, Scalar(0));
	normalize(hist, hist, 0, histImage.rows, NORM_MINMAX);

	// 히스토그램 그래프 그리기
	for (int i = 1; i < histSize; i++) {
		line(histImage,
			Point(bin_w * (i - 1), hist_h - cvRound(hist.at<float>(i - 1))),
			Point(bin_w * i, hist_h - cvRound(hist.at<float>(i))),
			Scalar(255), 2, 8, 0);
	}

	// 결과 표시
	imshow("Original Image", image);
	imshow("Histogram", histImage);

	waitKey(0);
	return 0;
}

'영상처리' 카테고리의 다른 글

OpenCV Install Python  (0) 2024.12.14
OpenCV resize C++  (0) 2024.12.13
OpenCV filter2d Source Code (C++)  (1) 2024.12.13
이미지 합성 - 1 (OpenCV, C++)  (0) 2024.12.12
OpenCV rectangle(Python)  (0) 2024.12.12