#include <opencv2/opencv.hpp>
#include <iostream> using namespace cv;
using namespace std; int main(int argc, char** argv)
{
Mat src = imread("f:/images/butterfly.jpg");
if (src.empty())
{
printf("Could not find the image!\n");
return -1;
} namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src); vector<Mat> mv;
split(src, mv); // 计算直方图
int histSize = 256;
float range[] = { 0, 255 };
const float* histRanges = { range };
Mat b_hist, g_hist, r_hist;
calcHist(&mv[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRanges, true, false);
calcHist(&mv[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRanges, true, false);
calcHist(&mv[2], 1, 0, Mat(), r_hist, 1, &histSize, &histRanges, true, false); Mat result = Mat::zeros(Size(600, 400), CV_8UC3);
int margin = 50;
int maxValue = result.rows - 2 * margin;
// 归一化
normalize(b_hist, b_hist, 0, maxValue, NORM_MINMAX, -1, Mat());
normalize(g_hist, g_hist, 0, maxValue, NORM_MINMAX, -1, Mat());
normalize(r_hist, r_hist, 0, maxValue, NORM_MINMAX, -1, Mat()); float step = 500.0 / 256.0;
// 绘制直方图
for (int i = 0; i < 255; i++) {
float bh1 = b_hist.at<float>(i, 0);
float gh1 = g_hist.at<float>(i, 0);
float rh1 = r_hist.at<float>(i, 0); float bh2 = b_hist.at<float>(i + 1, 0);
float gh2 = g_hist.at<float>(i + 1, 0);
float rh2 = r_hist.at<float>(i + 1, 0); line(result,
Point(step * i + margin, maxValue + 50 - bh1),
Point(step * (i + 1) + margin, maxValue + 50 - bh2),
Scalar(255, 0, 0), 1, 8, 0);
line(result,
Point(step * i + margin, maxValue + 50 - gh1),
Point(step * (i + 1) + margin, maxValue + 50 - gh2),
Scalar(0, 255, 0), 1, 8, 0);
line(result,
Point(step * i + margin, maxValue + 50 - rh1),
Point(step * (i + 1) + margin, maxValue + 50 - rh2),
Scalar(0, 0, 255), 1, 8, 0);
} imshow("result", result); waitKey(0);
destroyAllWindows();
}

函数抽取:

void show_hist(string name, Mat src) {
vector<Mat> mv;
split(src, mv); // 计算直方图
int histSize = 256;
float range[] = { 0, 255 };
const float* histRanges = { range };
Mat b_hist, g_hist, r_hist;
calcHist(&mv[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRanges, true, false);
calcHist(&mv[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRanges, true, false);
calcHist(&mv[2], 1, 0, Mat(), r_hist, 1, &histSize, &histRanges, true, false); Mat result = Mat::zeros(Size(600, 400), CV_8UC3);
int margin = 50;
int maxValue = result.rows - 2 * margin;
// 归一化
normalize(b_hist, b_hist, 0, maxValue, NORM_MINMAX, -1, Mat());
normalize(g_hist, g_hist, 0, maxValue, NORM_MINMAX, -1, Mat());
normalize(r_hist, r_hist, 0, maxValue, NORM_MINMAX, -1, Mat()); float step = 500.0 / 256.0;
// 绘制直方图
for (int i = 0; i < 255; i++) {
float bh1 = b_hist.at<float>(i, 0);
float gh1 = g_hist.at<float>(i, 0);
float rh1 = r_hist.at<float>(i, 0); float bh2 = b_hist.at<float>(i + 1, 0);
float gh2 = g_hist.at<float>(i + 1, 0);
float rh2 = r_hist.at<float>(i + 1, 0); line(result,
Point(step * i + margin, maxValue + 50 - bh1),
Point(step * (i + 1) + margin, maxValue + 50 - bh2),
Scalar(255, 0, 0), 1, 8, 0);
line(result,
Point(step * i + margin, maxValue + 50 - gh1),
Point(step * (i + 1) + margin, maxValue + 50 - gh2),
Scalar(0, 255, 0), 1, 8, 0);
line(result,
Point(step * i + margin, maxValue + 50 - rh1),
Point(step * (i + 1) + margin, maxValue + 50 - rh2),
Scalar(0, 0, 255), 1, 8, 0);
} imshow(name, result);
}

opencv:绘制图像直方图的更多相关文章

  1. OpenCV 绘制图像直方图

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

  2. opencv —— calcHist、minMaxLoc 计算并绘制图像直方图、寻找图像全局最大最小值

    直方图概述 简单来说,直方图就是对数据进行统计的一种方法,这些数据可以是梯度.方向.色彩或任何其他特征.它的表现形式是一种二维统计表,横纵坐标分别是统计样本和该样本对应的某个属性的度量. 计算直方图: ...

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

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

  4. OpenCV绘制图像中RGB三个通道的直方图

    一开始是看<OpenCV计算机视觉编程攻略(第2版)>这本书学做直方图,但是书本里说直方图的部分只详细说了黑白图像(单通道)的直方图绘制方法,RGB图像的直方图只说了如何计算,没有说计算完 ...

  5. 学习OpenCV——绘制彩色直方图(HSV2BGR)

    #include <cv.h> #include <highgui.h> #include <iostream> using namespace std; int ...

  6. OpenCV(7)-图像直方图

    直方图定义可参考这里.图像的直方图用来表示图像像素的统计信息,它统计了图像每一个通道(如果是多通道)中,每个像素的个数(比例). 计算直方图 OpenCV提供了直接计算直方图的函数 void calc ...

  7. 8、OpenCV Python 图像直方图

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

  8. OPENCV(5) —— 图像直方图

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

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

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

随机推荐

  1. [HDU4609] 3-idiots - 多项式乘法,FFT

    题意:有\(n\)个正整数,求随机选取一个3组合,能构成三角形的概率. Solution: 很容易想到构造权值序列,对其卷积得到任取两条边(可重复)总长度为某数时的方案数序列,我们希望将它转化为两条边 ...

  2. 中国城市区号脚本-mysql

    中国城市区号 300个. SET NAMES utf8mb4; ; DROP TABLE IF EXISTS `citycode`; CREATE TABLE `citycode` ( `codeId ...

  3. java.util.UUID工具类

    生成数据表的主键Id会用到此工具类 /** * <获取主鍵> * <获取32位UUID> * @return * @see [类.类#方法.类#成员] */ public st ...

  4. [CERC2014] Outer space invaders

    题目链接 题意 你受到一群外星人的攻击,第 $i$ 个外星人会在 $ai$ 时间出现,与你的距离为 $di$,且必须在 $bi$ 时间前消灭.你有一个区域冲击波器,每次攻击可以设定一个功率 $R$,这 ...

  5. mongo 改数据库名称

    用命令 db.copyDatabase('old_name', 'new_name') 可以备份出一个新的数据库. 然后  use old_name 并db.dropDatabase() 即可删除旧的 ...

  6. Apache Kafka(一)- Kakfa 简介与术语

    Apache Kafka 1. Kafka简介.优势.以及使用场景 Kafka的优势: 开源 分布式,弹性架构,fault tolerant 水平扩展: 可以扩展到100个brokers 可以扩展到每 ...

  7. 在java中使用FFmpeg处理视频与音频

    FFmpeg是一个非常好用的视频处理工具,下面讲讲如何在java中使用该工具类. 一.首先,让我们来认识一下FFmpeg在Dos界面的常见操作 1.拷贝视频,并指定新的视频的名字以及格式 ffmpeg ...

  8. RESTful api设计风格

    简介 REST(Representational State Transfer):表象层状态转变   RESTful对api进行规范和约束,使得api统一规范,增强api的可读性,便于开发.   设计 ...

  9. 网站调用qq第三方登录

    1. 准备工作 (1) 接入QQ登录前,网站需首先进行申请,获得对应的appid与appkey,以保证后续流程中可正确对网站与用户进行验证与授权. ① 注册QQ互联开发者账号  网址  https:/ ...

  10. JDBC简单代码

    1..写简单sql语句执行 DROP TABLE IF EXISTS `jdbctest`; CREATE TABLE `jdbctest` ( `id` ) NOT NULL AUTO_INCREM ...