# OpenCV中图像直方图与应用

## OpenCV中图像直方图与应用

- 图像像素直方图、

- 像素梯度直方图

- 像素角度直方图

OpenCV3.1.0中计算直方图的对应函数calcHist

`    // 加载图像    Mat src = imread("D:/gloomyfish/flower.png");    if (src.empty()) {        printf("could not load image...\n");        return -1;    }    namedWindow("refer faces", CV_WINDOW_AUTOSIZE);    imshow("refer faces", src);    // 三通道分离    vector<Mat> bgr_plane;    split(src, bgr_plane);    // 定义参数变量    const int channels[1] = { 0 };    const int bins[1] = { 256 };    float hranges[2] = { 0,255 };    const float* ranges[1] = { hranges };    Mat b_hist;    Mat g_hist;    Mat r_hist;    // 计算Blue, Green, Red通道的直方图    calcHist(&bgr_plane[0], 1, 0, Mat(), b_hist, 1, bins, ranges);    calcHist(&bgr_plane[1], 1, 0, Mat(), g_hist, 1, bins, ranges);    calcHist(&bgr_plane[2], 1, 0, Mat(), r_hist, 1, bins, ranges);    // 显示直方图    int hist_w = 512;    int hist_h = 400;    int bin_w = cvRound((double)hist_w / bins[0]);    Mat histImage = Mat::zeros(hist_h, hist_w, CV_8UC3);    // 归一化直方图数据    normalize(b_hist, b_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());     normalize(g_hist, g_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());    normalize(r_hist, r_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());    // 绘制直方图曲线    for (int i = 1; i < bins[0]; i++) {          line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(b_hist.at<float>(i - 1))),               Point(bin_w*(i), hist_h - cvRound(b_hist.at<float>(i))), Scalar(255, 0, 0), 2, 8, 0);        line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(g_hist.at<float>(i - 1))),            Point(bin_w*(i), hist_h - cvRound(g_hist.at<float>(i))), Scalar(0, 255, 0), 2, 8, 0);        line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(r_hist.at<float>(i - 1))),            Point(bin_w*(i), hist_h - cvRound(r_hist.at<float>(i))), Scalar(0, 0, 255), 2, 8, 0);    }    // 显示直方图    namedWindow("Histogram Demo", WINDOW_AUTOSIZE);       imshow("Histogram Demo", histImage);`

• src参数表示输入的图像，必须是8位灰度图像
• dst参数表示均衡化之后的图像，大小和类型必须跟输入图像一致

`    vector<Mat> dst_bgr(3);    equalizeHist(bgr_plane[0], dst_bgr[0]);    equalizeHist(bgr_plane[1], dst_bgr[1]);    equalizeHist(bgr_plane[2], dst_bgr[2]);    Mat dst = Mat::zeros(bgr_plane[0].size(), CV_8UC3);    merge(dst_bgr, dst);    imshow("EH Demo", dst);`

• 获取图像特征的区域-ROI
• 根据ROI生成直方图特征
• 利用直方图特征进行反向投影，在未知图像上寻找特征

OpenCV3.1.0中对应的直方图反向投影API函数为 calcBackProject， 参数就不再赘述啦，各位自己看一下API文档吧！ 这里以车牌识别中获取车牌区域为例，通过直方图反向投影可以获取。首先看模板图像

`    // 归一化直方图数据    normalize(b_hist, b_hist, 1.0, 0.0);    // 直方图反向映射 - 加载测试图片    Mat testImg = imread("D:/gloomyfish/5.jpg");    if (testImg.empty()) {        printf("could not load test image...\n");        return -1;    }    imshow("test image", testImg);    // 反向映射    vector<Mat> bgr;    split(testImg, bgr);    Mat result;    calcBackProject(&bgr[0], 1, channels, b_hist, result, ranges, 255);    // 将结果进行阈值化    threshold(result, result, 255*0.1, 255, THRESH_BINARY);    imshow("Histogram Back Projection Result", result);`

221 篇文章151 人订阅

0 条评论

## 相关文章

### OpenCV中神经网络介绍与使用

OpenCV中神经网络介绍与使用 一：神经网络介绍 人工神经网络(ANN) 简称神经网络(NN)，最早它的产生跟并行计算有关系，主要是学习生物神经元互联触发实现...

51611

4262

882

5786

### 卷积神经网络学习笔记

1.卷积神经网络的图像识别原理： 通过过滤函数 来描绘出图像的边界： 过滤函数和图像相同区域的数值进行相乘，得到新的图像， 新图像则只剩下边图像。 cros...

27910

3537

### OpenCV中导向滤波介绍与应用

OpenCV中导向滤波介绍与应用 导向滤波介绍 导向滤波是使用导向图像作为滤波内容图像，在导向图像上实现局部线性函数表达，实现各种不同的线性变换，输出变形之后的...

4837

1.9K5

5353

1491