【OpenCV4】绘制直方图,调用calcHist()函数(图片美化版本)

2023-10-29

calcHist() 函数详解

具体请参考:
https://blog.csdn.net/qq_42067550/article/details/122533459

绘制直方图的代码

注意:这里的代码用于生产灰度图的直方图,如果要获得彩色图片多个通道的直方图,需要先分离各个通道,再分别绘制!

#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"
#include <string>

using namespace std;

cv::Mat getHistogramImage(cv::Mat hist)
{
	cv::Mat histData= hist.clone();
	int histSize = histData.rows;
	int targetPoint = 225;
	
	//int bin_w = cvRound((double)hist_w / histSize);
	int bin_w = 3; // 一个桶所占的宽度
	int hist_w = histSize * bin_w + 50; // 加上 50 是为了在图像两边各留 25 个像素的冗余
	int hist_h = cvRound(hist_w * 2 / 3) + 50; // 绘制长方形图片,同样预留边框
	// 创建直方图画布
	cv::Mat histImage(hist_h, hist_w, CV_8UC3, cv::Scalar(255, 255, 255));

	// 绘制坐标轴
	cv::line(histImage, cv::Point(hist_w - 20, hist_h - 20), cv::Point(20, hist_h - 20), cv::Scalar(0, 0, 0), 2, 4, 0);
	cv::line(histImage, cv::Point(20, hist_h - 20), cv::Point(20, 20), cv::Scalar(0, 0, 0), 2, 4, 0);

	// 绘制坐标轴刻度
	int seg = 16; // 每隔开 32 个桶设一个标记,256/32=8 共 9 个标记位(加上 0)
	int segs = histSize / seg;

	for (int i = 0; i <= segs; i++)
	{
		cv::line(histImage, cv::Point(26 + i * seg * bin_w, hist_h - 20), cv::Point(26 + i * seg * bin_w, hist_h - 15), cv::Scalar(0, 0, 0), 1, 4, 0);
		string text = to_string(i * seg);
		cv::putText(histImage, text, cv::Point(20 + i * seg * bin_w, hist_h - 5), 1, 0.8, cv::Scalar(0, 0, 0), 1, 8, false);
	}
	for (int i = 0; i <= segs; i++)
	{
		cv::line(histImage, cv::Point(20, hist_h - 20 - i * (hist_h - 40) / 8), cv::Point(15, hist_h - 20 - i * (hist_h - 40) / 8), cv::Scalar(0, 0, 0), 1, 4, 0);
	}


	/// 将直方图归一化到范围 [ 0, histImage.rows ]
	cv::normalize(histData, histData, 0, hist_h - 50, cv::NORM_MINMAX, -1, cv::Mat());

	/// 在直方图画布上画出直方图
	for (int i = 1; i < histSize; i++)
	{
		cv::line(histImage, cv::Point(26 + i * bin_w, hist_h - 20 - cvRound(histData.at<float>(i))),
			cv::Point(26 + (i - 1) * bin_w, hist_h - 20 - cvRound(histData.at<float>(i-1))),
			cv::Scalar(10), 1, cv::LINE_AA, 0);
	}

	return histImage;
}

int main()
{
	cv::Mat img = cv::imread("./dog.jpeg", 0); // 读取灰度图
	cv::Mat histogram;
	int histSize = 256;
	float range[] = {0, 255};
	int channels[] = {0};
	const float *histRanges = { range };
	bool uniform = true;
	bool accumulate = false;
	cv::calcHist(&img, 1, channels, cv::Mat(), histogram, 1, &histSize, &histRanges, uniform, accumulate);
	cv::Mat histImage = getHistogramImage(histogram);
	cv::imshow("1", histImage);
	cv::waitKey(0);
	return 0;
}

测试图片

在这里插入图片描述

生成的直方图

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【OpenCV4】绘制直方图,调用calcHist()函数(图片美化版本) 的相关文章

  • 使用 cvcreateimage 使用 opencv 创建简单的黑色图像

    来自 OpenCV 新手的非常基本的问题 我只想创建一个图像 每个像素设置为0 黑色的 我在 main 函数中使用了以下代码 IplImage imgScribble cvCreateImage cvSize 320 240 8 3 我得到
  • 检测骰子的上侧

    是否可以检测骰子的上面 虽然从顶部看这将是一项简单的任务 但从许多角度来看 可以看到多个侧面 Here is an example of a dice feel free to take your own pictures 您通常想知道自己
  • 从视频/图像中提取元数据

    我从 IP 摄像机获取 MJPEG 流 我正在查看该流并将其保存在计算机上 可以找到我的操作代码here https stackoverflow com questions 21702477 how to parse mjpeg http
  • 有没有办法检测图像是否模糊? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想知道是否有一种方法可以通过分析图像数据来确定图像是否模糊 估计图像清晰度的另一种非常简单的方法是使用拉普拉斯 或 LoG 滤波器并
  • OpenCV 中“IplImage”和“CvMat”的全称是什么?

    有一个IplImage and CvMat在 OpenCV 中 他们的全名是什么 IPL in IplImage代表英特尔处理库 这是Intel维护OpenCV时的残余 CV in cvMat代表计算机视觉矩阵 这是图形中常用的数据结构 I
  • OpenCV:视频录制太快

    我有一个简单的录像机 录制来自网络摄像头的视频 theVideoWriter open filename countAsString ext CV FOURCC X V I D 30 Size 1920 1080 true while re
  • 如何使用 SimpleBlobDetector 获取 blob 的额外信息?

    robot sherrick 回答了我这个问题 https stackoverflow com a 13534094 1705967 这是他回答的后续问题 cv SimpleBlobDetectorOpencv 2 4 中的 看起来非常令人
  • 在 Android 中使用 OpenCV 查找图像匹配

    我正在尝试构建一个 Android 应用程序 该应用程序可以比较设备相机拍摄的照片 以在一组图像中找到匹配项 我已经在 Android Studio 上配置了 OpenCV 但仅此而已 有人可以通过链接到资源或建议教程来提供帮助吗 Open
  • OpenCV Android - 无法解析相应的JNI函数

    我正在尝试按照此处概述的本教程使用 Opencv 设置 Android Studio https www youtube com watch v OTw GIQNbD8 https www youtube com watch v OTw G
  • OpenCV,捕获的视频比原始相机视频运行得更快!

    我正在使用 openCV 从相机捕获视频并将其存储到 avi 文件 问题是当我完成捕获并运行 avi 文件时 视频流看起来速度很快 这是代码 void main CvCapture capture cvCaptureFromCAM 0 in
  • ValueError:当数组不是序列时设置带有序列的数组元素

    您好 此代码旨在存储使用 open cv 绘制的矩形的坐标 并将结果编译为单个图像 import numpy as np import cv2 im cv2 imread 1 jpg im3 im copy gray cv2 cvtColo
  • 如何在 opencv 3.0 Beta 中从文件读取 UMat?

    我想用UMat所以我的代码可以使用 OpenCL OpenCV 3 0 0 Beta 在 GPU 和 CPU 上运行 但我找不到将图像文件读入的方法UMat或转换一个Mat to UMat 如何将图像读入UMat 样品用于Mat to UM
  • 使用 SURF 在检测到的对象周围绘制矩形

    我正在尝试从涉及冲浪检测器的以下代码中检测对象 我不想绘制匹配项 我想在检测到的对象周围绘制一个矩形 但不知何故我无法获得正确的单应性 请任何人指出在哪里我走错了 include
  • OpenCV 读取视频文件时内存不足

    此示例从文件中读取视频cv2 VideoCapture在 python OpenCV 中内存不足 import cv2 cap cv2 VideoCapture file mp4 while True ret frame cap read
  • GrabCut - bgdModel 和 fgdModel 为空 - 断言错误

    我正在尝试使用 OpenCV2 1 C 中的 GrabCut 算法进行图像分割 这是我的代码 Mat rgbWorkImage imread argv 1 Mat mask mask Scalar 0 Mat bgdModel fgdMod
  • 如何将 OpenCV 的测试框架与 CMake 结合使用?

    好像 OpenCV 有一个测试框架 https github com Itseez opencv tree ef91d7e8830c36785f0b6fdbf2045da48413dd76 modules ts include opencv
  • 将yuv420p原始数据转换为opencv图像

    我有来自 rtmp 服务器的原始数据 像素格式为 yuv420p 我使用管道来读取数据 但我不知道如何将原始数据解码为图像 command ffmpeg command extend loglevel fatal i rtmp localh
  • 在OpenCV中将YUV转换为BGR或RGB

    我有一个电视采集卡 其输入内容为 YUV 格式 我在这里看到了与此问题类似的其他帖子 并尝试尝试所述的所有可能的方法 但它们都没有提供清晰的图像 目前最好的结果是 OpenCVcvCvtColor scr dst CV YUV2BGR 函数
  • 如何平滑循环列向量

    这是一个 OpenCV2 问题 我有一个矩阵代表closed空间曲线 cv Mat
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查

随机推荐

  • 全局加载less变量文件

    css preprocessorOptions less modifyVars hack true import reference pathResolve src design var index less additionalData
  • 什么是websocket协议

    websocket和http协议一样 都是基于tcp协议而发展起来的 在TCP两端 同一时间内 双方都可以主动向对方发送数据 这就是所谓的全双工 http协议 是基于tcp的 但是在同一时间内 客户端和服务器只能有一方主动发数据 这就是所谓
  • MapStruct中文文档(一)——定义映射器

    文章目录 3 定义映射器 3 1 基本映射 示例1 定义映射器的Java接口 3 2 映射组合 实验性功能 3 3 向映射器添加自定义方法 示例2 由抽象类定义的映射器 3 4 映射方法具有多个源参数 示例3 具有多个源参数的映射方法 示例
  • 基于Spring+SpringMVC+Mybatis 开发的web在线租房系统

    项目介绍 本项目包含用户端和管理端 采用JSP模板引擎渲染页面 使用Ajax实现前后端异步交互 用户端包含房屋列表 房屋详情 房屋筛选 租房 二手房 新房可按租金 出租方式 面积 房型进行筛选 按价格 发布时间进行排序 并提供登录 注册 收
  • 机器学习技术(五)——特征工程与模型评估

    机器学习技术 五 特征工程与模型评估 2 文章目录 机器学习技术 五 特征工程与模型评估 two 二 模型评估 1 Accuracy score 2 Confusion matrix混淆矩阵 1 多值 2 二值 3 Hamming loss
  • 使用antd3.x版本实现选择年份,并设置默认年份

    在使用antd3 x的时候 需要用到只选择年份的选择器 会遇到的很多问题 点击可以查看这个文档 可能会对你有所帮助 下面的代码的实现部分 import React Component from react import DatePicker
  • NNIE的运行机制

    NNIE的运行机制 一 背景 由于当前主流算法中都使用了深度学习算法 而深度学习算法在移植过程中 基于带有的NNIE推理单元的Hisi芯片将极大的提高算法模型的推理 加速算法计算 从而便于算法落地上车 故而本文将简要说明NNIE的运行机制
  • 基于深度学习的对联自动生成系统

    对联自动生成系统 1 项目目标 设计一个基于深度学习的对联生成系统 最终结果可以是一个简单的界面 在界面中 我输入一句上联 通过点击相应按钮 系统生成相应下联并显示出来 2 国内外相关工作 对联是属于我们中华民族独有的一种文学形式 国外研究
  • 类中的向上转型与向下转型详解

    我们的类与类之间会存在继承关系 子类继承父类 一个父类可以有多个子类 例如Animal类就可以有Cat子类 Dog子类 等等 那么我们在运用的时候根据不同的场景会出现向上转型和向下转型的情况 一 向上转型 1 Animal a1 new C
  • 【AntDB数据库】AntDB数据库迁移(三)

    导出导入数据 导入数据 导出的数据文件为copy命令的sql文件 可以直接使用psql f参数执行 但是在文件数量比较多的时候 建议采用脚本封装的方式 可控的进行数据导入 编写导入脚本 该脚本通过命令行参数来控制是通过表名查找文件导入还是按
  • Java AES加密与C#互转

    和外部系统对接的时候 对方要求用AES AES ECB PKCS5Padding对参数进行加密 给出的Java类如下 import org springframework util Base64Utils import javax cryp
  • c语言int型变量写入char数组的方法

    c语言int型变量写入char数组的方法 include
  • android开发使用 ndk-stack 打印崩溃日志

    使用 ndk stack 的时候需要你的 lib 编译为 debug 版 通常需要下面的修改 1 修改 android mk 增加 为 LOCAL CFLAGS 增加 g 选项 2 修改 application mk 增加 APP OPTI
  • 这套浙大出品的Python简直就是学习Python界的天花板

    教材PDF PTT课件 源码PPT等 相信我真的很容易上手 文末领取 关于Python技术储备 学好 Python 不论是就业还是做副业赚钱都不错 但要学会 Python 还是要有一个学习规划 最后大家分享一份全套的 Python 学习资料
  • jQuery 入门教程(28): jQuery UI Datepicker 示例(一)

    jQuery UI提供的Datepicker 是一个有着非常灵活配置的选择日期的UI组件 你可以配置显示日期的格式 语言 限制所能选择的日期范围 添加按钮等 基本用法如下 1 lt doctype html gt 2
  • YOLACT

    论文 YOLACT Real time Instance Segmentation 2019 作者 Daniel Bolya Chong Zhou Fanyi Xiao Yong Jae Lee 团队 University of Calif
  • 等保合规2022系列

    2022等保合规指南 第四篇 山石网科带你深入走进 等保 通过 等保合规2022系列 今年 关于等保你该了解什么 等保合规2022系列 一个中心 三重防护 助力企业等级保护建设更科学 以及 等保合规2022系列 20余年来 等级保护在如何
  • 使用Python爬虫获取豆瓣影评,并用词云显示

    使用Python爬虫获取豆瓣影评 并用词云显示 Python语言流行到现在 目前最受开发者喜爱的功能莫过于它的爬虫功能 以至于很多人以为Python的英语发音也是 爬虫 其实它是读作 啪善 pa n 而爬取网络信息 只是它的一个功能 它同时
  • python:鸡兔同笼,已知鸡兔总头数为 h,总腿数为 f,编写程序计算鸡兔各有多少只。

    h eval input 请输入鸡兔的总头数 f eval input 请输入鸡兔的总腿数 fowl 4 h f 2 rabbit h fowl print 笼中有 只鸡和 只兔子 format fowl rabbit
  • 【OpenCV4】绘制直方图,调用calcHist()函数(图片美化版本)

    文章目录 calcHist 函数详解 绘制直方图的代码 测试图片 生成的直方图 calcHist 函数详解 具体请参考 https blog csdn net qq 42067550 article details 122533459 绘制