OpenCV 直方图统计

30 min read

OpenCV 中的直方图统计是一种将图像中的像素值分为不同区间进行计数的方法。这个技术有助于我们了解一幅图像的像素分布,以便进行图像处理和分析。

在 OpenCV 中,可以使用 cv::calcHist() 函数计算一个或多个通道的直方图。这个函数需要以下参数:

  • 输入图像
  • 使用的通道
  • 直方图的维数
  • 每个维度的直方图大小和范围
  • 直方图需要处理的像素值范围
  • 是否使用均衡化

下面是一个使用 cv::calcHist() 函数计算灰度图像直方图的示例:

// Read image
cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);

// Set histogram parameters
int histSize = 256; // 256 bins
float range[] = { 0, 256 }; // pixel values range from 0 to 255
const float* histRange = { range };
bool uniform = true, accumulate = false;

// Calculate histogram
cv::Mat hist;
cv::calcHist(&image, 1, 0, cv::Mat(), hist, 1, &histSize, &histRange, uniform, accumulate);

// Display histogram
int hist_w = 512, hist_h = 400;
int bin_w = cvRound((double)hist_w / histSize);
cv::Mat histImage(hist_h, hist_w, CV_8UC1, cv::Scalar(0));
normalize(hist, hist, 0, histImage.rows, cv::NORM_MINMAX, -1, cv::Mat());
for (int i = 1; i < histSize; i++)
{
    line(histImage, cv::Point(bin_w*(i - 1), hist_h - cvRound(hist.at<float>(i - 1))), cv::Point(bin_w*(i), hist_h - cvRound(hist.at<float>(i))), cv::Scalar(255), 2, 8, 0);
}
namedWindow("Histogram", cv::WINDOW_AUTOSIZE);
imshow("Histogram", histImage);
waitKey(0);

这段代码将计算灰度图像的直方图,并将其显示在一个窗口中。首先使用 cv::imread() 函数读入图像,并将其转换为灰度图像。然后定义了一个包含 256 个 bin 的直方图。在直方图计算后,使用 cv::normalize() 函数将其归一化,并绘制其直线表示。最后通过 cv::namedWindow() 和 cv::imshow() 函数将直方图显示在一个窗口中。

OpenCV 的直方图统计功能对于图像处理和分析来说非常有用。通过计算直方图,可以分析一幅图像的亮度和颜色分布,并根据需要进行调整和改变。