#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. 颜色color转为rgb格式

    function convertHexToRGB(color) {       if (color.length === 4) {             let extendedColor = &q ...

  2. react 和 vue 的优缺点总结

    React推广了Virtual DOM并创造了新的语法——JSX,JSX允许开发者在JavaScript中书写HTML Vue使用模板系统而不是JSX,但能对现有应用的升级更加容易,这是因为模板用的就 ...

  3. 控制台输出Scanner和BufferedReader区别

    Scanner取得输入的依据是空格符,包括空格键,Tab键和Enter键.当按下这其中的任一键 时,Scanner就会返回下一个输入. 当你输入的内容中间包括空格时,显然,使用Scanner就不能完整 ...

  4. 后端——框架——缓存框架——memcached——《Memcached教程》阅读笔记

    Memcached的知识点大致可以分为三个部分. 服务器部分:环境搭建. 概念:存储的数据类型,指令,内存的替换策略. 集成:与Java语言的集成. 1.搭建环境 1.1 Linux环境 在Linux ...

  5. jQuery添加/删除元素

    jQuery append() 方法 jQuery append() 方法在被选元素的结尾插入内容(仍然该元素的内部). 追加前:<p>这是一个文本段落</p> $(" ...

  6. Spring整合Mybatis错误解决方案

    ERROR:java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransactionFactory. ...

  7. 关于testbench

    区别与verilog HDL代码,主要留意以下内容: 1,语言本身支持的特征和可综合的代码是两回事,不是所有verilog语言都可以转化为硬件的. 2,testbench作为top module,不需 ...

  8. yii2模型

    多对多可以使用all()来调用 对数据提供者进行修改 /** * Lists all ArticleCate models. * @return mixed */ public function ac ...

  9. Flink架构(四)- 状态管理

    状态管理 之前我们提到过大多数流应用是有状态的.很多operators会不断的访问并更新某中状态,例如一个window中收集了多少条记录,输入源中当前读到的位置,亦或是用户定义的特定operators ...

  10. 4.用springboot写的第一个程序--helloworld

    这是我自己在controller层建的hello类 运行,选画方框的那个.我查了一晚上,可算知道为啥运行不了了. 然后再浏览器输入网址就ok了 为了大力!好好学习!