OpenCV(7)-图像直方图

时间:2022-02-12 22:19:25

直方图定义可参考这里。图像的直方图用来表示图像像素的统计信息,它统计了图像每一个通道(如果是多通道)中,每个像素的个数(比例)。

计算直方图

OpenCV提供了直接计算直方图的函数

void 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:输入图像。图的depth和size必须大小相同。

nimages:输入图像个数

channels:计算通道的索引。

mask:可选。大小必须和images[i]相同,且是8-bit数组。非零的元素对应位置的像素用来计算直方图。

hist:输出的直方图

dims:直方图的维度

histSize:每个维度直方图的大小

ranges:每个维度,直方图的取值范围。

uniform:直方图是每个维度宽度是否相同。

accumulate:直方图是否累加。如果为true,每次计算不清空。

例子:

#include <iostream>
#include <opencv2/opencv.hpp> using namespace cv;
using namespace std;
int main(int argc, char* argv[]){
const char* path = "";
Mat img = imread(path);
if (!img.data){
cout << "wrong image " << endl;
return -1;
}
//把BGR图像分割为单通道图像
vector<Mat> bgr_planes;
split(img, bgr_planes);
//计算直方图
vector<Mat> hist_image;
hist_image.resize(3); //直方图统计像素类别数
const int histSize[] = { 255 };
float range[] = { 0, 255 };
const float* histRange = { range };
bool uniform = true;
bool accumulate = false; const int channels[] = { 0 }; calcHist(&bgr_planes[0], 1, channels, Mat(), hist_image[0], 1, histSize, &histRange, uniform, accumulate);
calcHist(&bgr_planes[1], 1, channels, Mat(), hist_image[1], 1, histSize, &histRange, uniform, accumulate);
calcHist(&bgr_planes[2], 1, channels, Mat(), hist_image[2], 1, histSize, &histRange, uniform, accumulate);
/// 将直方图高度归一化到范围 [ 0, histImage.rows ]
normalize(hist_image[0], hist_image[0], 0, hist_image[0].rows, NORM_MINMAX, -1, Mat());
normalize(hist_image[1], hist_image[1], 0, hist_image[1].rows, NORM_MINMAX, -1, Mat());
normalize(hist_image[2], hist_image[2], 0, hist_image[2].rows, NORM_MINMAX, -1, Mat()); // 创建直方图画布
int hist_w = 400; int hist_h = 400;
int bin_w = cvRound((double)hist_w / histSize[0]);//每个像素宽度 Mat histImage(hist_h, hist_w, CV_8UC3, Scalar(0, 0, 0)); /// 在直方图画布上画出直方图。Mat坐标系,原点在左上角,习惯用的坐标系原点在左下角,因此高度要调整。即画布height - y
for (int i = 1; i < histSize[0]; i++)
{
//R
line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(hist_image[2].at<float>(i - 1))),
Point(bin_w*(i), hist_h - cvRound(hist_image[2].at<float>(i))),
Scalar(0, 0, 255), 2, 8, 0);
//G
line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(hist_image[1].at<float>(i - 1))),
Point(bin_w*(i), hist_h - cvRound(hist_image[1].at<float>(i))),
Scalar(0, 255, 0), 2, 8, 0);
//B
line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(hist_image[0].at<float>(i - 1))),
Point(bin_w*(i), hist_h - cvRound(hist_image[0].at<float>(i))),
Scalar(255, 0, 0), 2, 8, 0);
} /// 显示直方图
imshow("Hist", histImage);
waitKey(0);
return 0;
}

直方图均衡化

直方图均衡化是用来调整图像对比度的方法。它的思想是把某些像素值集中的区间分配到其他像素值上,在直方图上的表现就是拉伸了直方图,但是直方图的面积(图像总亮度)未改变,只是重新分配了而已。

具体计算可以参考这里

经过直方图均衡化后,图像的像素间差异减少,一些图像细节可能消失或减弱。

OpenCV函数

void equalizeHist(InputArray src, OutputArray dst)

用来均衡化直方图。

例子:

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char* argv[]){ const char* path = "D:/image/sexy/yesky/20160318170735006671.jpg";
Mat img = imread(path);
if (!img.data)
return 1;
imshow("Original Image", img); ///三个通道直方图均衡化
vector<Mat> rgb_planes;
split(img, rgb_planes);
equalizeHist(rgb_planes[0], rgb_planes[0]);
equalizeHist(rgb_planes[1], rgb_planes[1]);
equalizeHist(rgb_planes[2], rgb_planes[2]); Mat new_img;
merge(rgb_planes, new_img);
imshow("New Image", new_img);
cvWaitKey(0); return 0;
}

参考

直方图计算

直方图均衡化

OpenCV(7)-图像直方图的更多相关文章

  1. 【图像处理】基于OpenCV实现图像直方图的原理

    背景 图像的直方图是衡量图像像素分布的一种方式,可以通过分析像素分布,使用直方图均衡化对图像进行优化,让图像变的清晰. opencv官方对图像直方图的定义如下: 直方图是图像中像素强度分布的图形表达方 ...

  2. 8、OpenCV Python 图像直方图

    __author__ = "WSX" import cv2 as cv import numpy as np from matplotlib import pyplot as pl ...

  3. OPENCV&lpar;5&rpar; &mdash&semi;&mdash&semi; 图像直方图

    新版本对直方图不再使用之前的histogram的形式,而是用统一的Mat或者MatND的格式来存储直方图,可见新版本Mat数据结构的优势. C++: void calcHist(const Mat* ...

  4. opencv:图像直方图均衡化

    // 直方图均衡化 Mat gray, dst; cvtColor(src, gray, COLOR_BGR2GRAY); equalizeHist(gray, dst); imshow(" ...

  5. OpenCV 绘制图像直方图

    OpenCV绘制图像直方图,版本2.4.11 直方图可展示图像中的像素分布,是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数.可以借助观察该直方图了解需要如何调整亮度分布.这种直方 ...

  6. opencv:图像直方图相似性比较

    void hist_compare(Mat src1, Mat src2) { int histSize[] = { 256, 256, 256 }; int channels[] = { 0, 1, ...

  7. OpenCV成长之路&lpar;5&rpar;:图像直方图的应用

    正如第4篇文章所说的图像直方图在特征提取方面有着很重要的作用,本文将举两个实际工程中非常实用的例子来说明图像直方图的应用. 一.直方图的反向映射. 我们以人脸检测举例,在人脸检测中,我们第一步往往需要 ...

  8. OpenCV成长之路&lpar;4&rpar;:图像直方图

    一.图像直方图的概念 图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的.纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比. 图 ...

  9. OpenCV成长之路:图像直方图的应用

    OpenCV成长之路:图像直方图的应用 2014-04-11 13:57:03 标签:opencv 图像 直方图 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否 ...

随机推荐

  1. gulp复制整个文件夹或文件到指定目录(包括拷贝单个文件)

    整个目录: gulp.task('copy', function() { return gulp.src('src/**/*') .pipe(gulp.dest('dist')) }); gulp拷贝 ...

  2. CodeChef COUNTARI Arithmetic Progressions(分块 &plus; FFT)

    题目 Source http://vjudge.net/problem/142058 Description Given N integers A1, A2, …. AN, Dexter wants ...

  3. TortoiseGit 相关操作

    1.TortoiseGit 记住用户名和密码的方法当你安装且配置好git后,在C:\Documents and Settings\Administrator\ 目录下有一个  .gitconfig 的 ...

  4. 01 Node&period;js简介&comma; 安装&amp&semi;配置

    Node.js 简介 Node.js 是什么 Node.js 有着强大而灵活的包管理器(node package manager,npm) 目前, 已经有强大第三方工具模块, 例如数据库连接, 网站开 ...

  5. leetcode算法思想快速一览

    整理了一下思路,想深入了解还得多去写,无奈时间紧迫的情况下抛砖引玉也不失为下策: 1.Two Sum Easy 给出一个数组,找出其中两个和为目标值的坐标.思路: [1]排序. 和为目标值,一般的思路 ...

  6. Volley(五)—— 自定义Request

    详细解读Volley(四)—— 自定义Request Volley中提供了几个Request,如果我们有特殊的需求,完全可以自定义Request的,自定义Request自然要继承Request,那么本 ...

  7. TypeScript的崛起

    今天要讨论的话题是TypeScript.之前在微博上转载过一篇<The Rise of TypeScript?>的文章,今天来谈一下我的感想. 很多朋友应该都了解,TypeScript是微 ...

  8. 微信公众平台开发&lpar;110&rpar; 微信连Wi-Fi

    关键字:微信公众平台 微信连Wi-Fi 微信 WiFi 硬件鉴权作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/p/weixin-wifi.html 微信连Wi- ...

  9. hadoop异常: 到目前为止解决的最牛逼的一个异常(java&period;io&period;IOException&colon; Incompatible clusterIDs)

    (注意: 本人用的版本为hadoop2.2.0, 旧的版本和此版本的解决方法不同) 异常为: 9 (storage id DS-2102177634-172.16.102.203-50010-1384 ...

  10. 菜鸟做HTML5小游戏 - 翻翻乐

    记录下开放过程.做小游戏开发,又要跨平台,flash又不支持iPhone,html5是最好的选择. 先看看最后效果: 好了,开始demo. 1.准备工作: 图片素材(省略...最后代码一起打包) 了解 ...