中文opencv calcHist函数
时间: 2023-05-28 12:07:05 浏览: 66
calcHist函数用于计算一幅图像的直方图。
函数原型:
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
函数参数:
- images: 输入图像
- channels: 需要统计的通道
- mask: 掩码图像
- histSize: 直方图的大小
- ranges: 值的范围
- hist: 输出的直方图
- accumulate: 是否累加
返回值:
输出的直方图。
示例代码:
```python
import cv2
import numpy as np
img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 计算灰度图像的直方图
hist = cv2.calcHist([gray], [0], None, [256], [0, 256])
# 绘制直方图
hist_norm = cv2.normalize(hist, None).flatten()
plt.plot(hist_norm)
plt.xlim([0, 256])
plt.show()
```
以上代码计算灰度图像的直方图,并绘制出来。
相关问题
中文 opencv calcHist函数
calcHist是OpenCV中的一个函数,用于计算直方图。该函数的原型如下:
cv::calcHist(const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, int dims, const int* histSize, const float** ranges, bool uniform = true, bool accumulate = false)
其中,参数的含义如下:
- images:输入图像的指针数组。
- nimages:输入图像的数量。
- channels:要计算的通道的数组。例如,对于RGB图像,[0, 1, 2]表示计算红、绿、蓝三个通道的直方图。
- mask:掩码图像。如果提供了掩码图像,则只有掩码内的像素会被用于计算直方图。
- hist:输出的直方图。
- dims:直方图的维数。
- histSize:每个维度的直方图大小。
- ranges:每个维度的像素值范围。
- uniform:是否将直方图均匀分布到每个bin中。
- accumulate:是否累加直方图。
例如,如果要计算一张灰度图像的直方图,可以按照以下方式调用calcHist函数:
```c++
Mat image = imread("image.jpg", IMREAD_GRAYSCALE);
int histSize = 256;
float range[] = {0, 256};
const float* ranges[] = {range};
Mat hist;
calcHist(&image, 1, 0, Mat(), hist, 1, &histSize, ranges);
```
以上代码将计算一张灰度图像的直方图,其中直方图的大小为256,像素值范围为[0, 256]。
opencv calchist函数C++实现
以下是使用C++实现OpenCV中的calcHist函数的示例代码:
```c++
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat image = imread("test.jpg", IMREAD_GRAYSCALE); //读入灰度图像
if (image.empty()) //判断图像是否为空
{
cerr << "Failed to load image!" << endl;
return -1;
}
int histSize = 256; //直方图中bin的数量
float range[] = { 0, 256 }; //像素值范围
const float* histRange = { range };
bool uniform = true, accumulate = false;
Mat hist; //用于保存直方图的Mat
calcHist(&image, 1, 0, Mat(), hist, 1, &histSize, &histRange, uniform, accumulate); //计算直方图
int hist_w = 512, hist_h = 400; //直方图的宽和高
int bin_w = cvRound((double)hist_w / histSize); //每个bin的宽度
Mat histImage(hist_h, hist_w, CV_8UC1, Scalar(0)); //用于绘制直方图的Mat
normalize(hist, hist, 0, histImage.rows, NORM_MINMAX, -1, Mat()); //将直方图归一化到[0, histImage.rows]范围内
for (int i = 1; i < histSize; i++)
{
line(histImage, Point((i - 1) * bin_w, hist_h - cvRound(hist.at<float>(i - 1))),
Point(i * bin_w, hist_h - cvRound(hist.at<float>(i))), Scalar(255), 2, LINE_AA); //在直方图上绘制每个bin的高度
}
imshow("Image", image);
imshow("Histogram", histImage);
waitKey(0);
return 0;
}
```
首先,使用`imread`函数读入灰度图像。然后,定义直方图的bin数量、像素值范围、是否均匀化、是否累加等参数,并创建一个用于保存直方图的Mat。接着,调用`calcHist`函数计算直方图。
计算完直方图后,定义用于绘制直方图的Mat,并将直方图归一化到[0, histImage.rows]范围内。最后,在直方图上绘制每个bin的高度,然后显示原始图像和直方图,等待用户按下任意键后程序结束。