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 |