Opencv计算机视觉编程攻略-第四节 图直方图统计像素
Opencv计算机视觉编程攻略-第四节 图直方图统计像素
- 1.计算图像直方图
- 2.基于查找表修改图像
- 3.直方图均衡化
- 4.直方图反向投影进行内容查找
- 5.用均值平移法查找目标
- 6.比较直方图搜索相似图像
- 7.用积分图统计图像
1.计算图像直方图
图像统计直方图的概念
图像统计直方图是一种用于描述图像中像素分布情况的工具。具体来说,灰度直方图是一个关于灰度级别的函数,它记录了图像中每种灰度级别对应的像素数量。这种分布反映了图像亮度的整体特性。
对于彩色图像(如RGB),可以通过将每个颜色通道分别映射到特定索引来构建其直方图,并利用核密度估计的方法来累积权重,从而得到更精确的颜色分布信息。
统计直方图主要基于opencv 的calcHist函数实现,其具体配置如下
calcHist(&image, 1, // histogram of 1 image onlychannels, // the channel usedMat(), // no mask is usedhist, // the resulting histogram1, // it is a 1D histogramhistSize, // number of binsranges // pixel value range);
学习文中给出的手绘统计直方图,基于统计的频数,绘制线高 line
// Create an image representing a histogramstatic Mat getImageOfHistogram(const Mat &hist, int zoom) {// Get min and max bin valuesdouble maxVal = 0;double minVal = 0;minMaxLoc(hist, &minVal, &maxVal, 0, 0);// get histogram sizeint histSize = hist.rows;// Square image on which to display histogramMat histImg(histSize*zoom, histSize*zoom, CV_8U, Scalar(255));// set highest point at 90% of nbins (i.e. image height)int hpt = static_cast<int>(0.9*histSize);// Draw vertical line for each binfor (int h = 0; h < histSize; h++) {float binVal = hist.at<float>(h);if (binVal>0) {int intensity = static_cast<int>(binVal*hpt / maxVal);line(histImg, Point(h*zoom, histSize*zoom),Point(h*zoom, (histSize - intensity)*zoom), Scalar(0), zoom);}}return histImg;}

2.基于查找表修改图像
所谓的查找表,相当于是一个数组,每个数组对应i值的原像素值映射为目标像素值
人工构建查找表
cv::Mat lut(1,256,CV_8U); // 1x256 matrix
// Or:
// int dim(256);
// cv::Mat lut(1, // 1 dimension
// &dim, // 256 entries
// CV_8U); // uchar
for (int i=0; i<256; i++) {// 0 becomes 255, 1 becomes 254, etc.lut.at<uchar>(i)= 255-i;
}
通过opencv的LUT函数一键映射查找表,进行取反操作
Mat result;// apply lookup tableLUT(image,lookup,result);


3.直方图均衡化
上文了解了统计直方图和查找表,基于直方图统计结果构建均衡化的查找表,从而全局修改图像整体颜色
equalizeHist(image,result); // 直接使用opencv函数实现均衡化


统计直方图的原理一般是值选择一定像素值范围,将该范围的像素映射的一个更大范围的像素值范围中,从而使得整体图像显得更均匀,手动实现代码如下:
Mat stretch(const Mat &image, float percentile) {// number of pixels in percentilefloat number= image.total()*percentile;// Compute histogram firstMat hist = getHistogram(image);// find left extremity of the histogramint imin = 0;for (float count=0.0; imin < 256; imin++) {// number of pixel at imin and below must be > numberif ((count+=hist.at<float>(imin)) >= number)break;}// find right extremity of the histogramint imax = 255;for (float count=0.0; imax >= 0; imax--) {// number of pixel at imax and below must be > numberif ((count += hist.at<float>(imax)) >= number)break;}// Create lookup tableint dims[1] = { 256 };Mat lookup(1, dims, CV_8U);for (int i = 0; i<256; i++) {if (i < imin) lookup.at<uchar>(i) = 0;else if (i > imax) lookup.at<uchar>(i) = 255;else lookup.at<uchar>(i) = cvRound(255.0*(i - imin) / (imax - imin));}// Apply lookup tableMat result;result = applyLookUp(image, lookup);return result;}

4.直方图反向投影进行内容查找
区域内图像的统计直方图某种程度表示了整体颜色分布特征,因而可以使用区域的统计直方图作为特征进行相似内容查找,以区域内白云的颜色为例进行统计


calcBackProject(&image,1, // we only use one image at a timechannels, // vector specifying what histogram dimensions belong to what image channelsshistogram, // the histogram we are usingresult, // the resulting back projection imageranges, // the range of values, for each dimension255.0 // the scaling factor is chosen such that a histogram value of 1 maps to 255);


在灰度图内进行统计分析,难以分割出较好的效果,使用rgb往往可以获得不错的效果,彩色图使用同一个函数

5.用均值平移法查找目标

以这个猩猩的脸部特征生成统计特征图
// 颜色转为hsv 如上一节所说,hsv分辨皮肤更清晰cv::cvtColor(image, hsv, cv::COLOR_BGR2HSV);// Get back-projection of hue histogramint ch[1]={0};finder.setThreshold(-1.0f); // no thresholdingcv::Mat result= finder.find(hsv,0.0f,180.0f,ch);// 使用反向统计直方图获得图像上和目标区域的相似性概率图// search objet with mean shift 使用均值漂移算法在概率图中查找,最后在一张有偏移的图像上准确找到目标cv::TermCriteria criteria(cv::TermCriteria::MAX_ITER | cv::TermCriteria::EPS,10, // iterate max 10 times1); // or until the change in centroid position is less than 1px

6.比较直方图搜索相似图像
在传统数字图像处理领域,使用统计直方图进行图像相似度对比,是常用的方法,简单高效
double compare(const cv::Mat& image) {inputH= hist.getHistogram(image);// histogram comparison using intersectionreturn cv::compareHist(refH,inputH, cv::HISTCMP_INTERSECT);}

waves vs dog: 26535
waves vs marais: 12149
waves vs bear: 18353
waves vs beach: 33032 相似度最高的图像
waves vs polar: 20768
waves vs moose: 15225
waves vs lake: 15486
waves vs fundy: 14309

7.用积分图统计图像
积分图统计图像,本质就是数组的前缀和算法,通过一次性求解前缀,后续每个位置的要素数量就可以直接查询得到,避免每次的查找,这个在区域内进行搜索直方图特征中有较好的应用,实际操作中,将颜色维度从256压缩到更小空间从而实现加速:
double maxSimilarity=0.0;int xbest, ybest;// loop over a horizontal strip around girl location in initial imagefor (int y=110; y<120; y++) {for (int x=0; x<secondImage.cols-width; x++) {// compute histogram of 16 bins using integral imagehistogram= intHistogram(x,y,width,height);// compute distance with reference histogramdouble distance= cv::compareHist(refHistogram,histogram, cv::HISTCMP_INTERSECT);// find position of most similar histogramif (distance>maxSimilarity) {xbest= x;ybest= y;maxSimilarity= distance;}std::cout << "Distance(" << x << "," << y << ")=" << distance << std::endl;}}

如果看到这里,麻烦点一个赞再走,谢谢!相关代码同样上传代码库链接: 点击下载
相关文章:
Opencv计算机视觉编程攻略-第四节 图直方图统计像素
Opencv计算机视觉编程攻略-第四节 图直方图统计像素 1.计算图像直方图2.基于查找表修改图像3.直方图均衡化4.直方图反向投影进行内容查找5.用均值平移法查找目标6.比较直方图搜索相似图像7.用积分图统计图像 1.计算图像直方图 图像统计直方图的概念 图像统计直方图是一种用于描…...
深度学习处理时间序列(5)
Keras中的循环层 上面的NumPy简单实现对应一个实际的Keras层—SimpleRNN层。不过,二者有一点小区别:SimpleRNN层能够像其他Keras层一样处理序列批量,而不是像NumPy示例中的那样只能处理单个序列。也就是说,它接收形状为(batch_si…...
Mysql 索引性能分析
1.查看CRUD次数 show global status like Com_______(7个下划线) show global status like Com_______ 2.慢SQL分析 SET GLOBAL slow_query_log ON;-- 设置慢SQL日志记录开启 SET GLOBAL long_query_time 2; -- 设置执行超过 2 秒的查询为慢查询 开…...
win11+ubuntu双系统安装
操作步骤: 官网下载ubuntu 最新镜像文件 准备U盘 准备一个容量不小于 8GB 的 U 盘,用于制作系统安装盘。制作过程会格式化 U 盘,请注意提前备份数据。 制作U盘启动盘 使用rufus工具,或者 balenaEtcher工具(官网安…...
linux-5.10.110内核源码分析 - 写磁盘(从VFS系统调用到I/O调度及AHCI写磁盘)
1、VFS写文件到page缓存(vfs_write) 1.1、写裸盘(dd) 使用如下命令写裸盘: dd if/dev/zero of/dev/sda bs4096 count1 seek1 1.2、系统调用(vfs_write) 系统调用栈如下: 对于调用栈的new_sync_write函数,buf为写磁盘的内容的内存地址&…...
arinc818 fpga单色图像传输ip
arinc818协议支持的常用线速率如下图 随着图像分辨率的提高,单lane的速率无法满足特定需求,一种方式是通过多个LANE交叉的去传输图像,另外一种是通过降低图像的带宽,即通过只传单色图像达到对应的效果 程序架构如下图所示&#x…...
业务流程先导及流程图回顾
一、测试流程回顾  1. 备测内容回顾  备测内容: 本次测试涵盖买家和卖家的多个业务流程,包括下单流程、发货流程、搜索退货退款、支付抢购、换货流程、个人中心优惠券等。 2. 先测业务强调  1)测试业务流程 …...
HCIP(RSTP+MSTP)
一、STP的重新收敛: 复习STP接口状态 STP初次收敛至少需要50秒的时间。STP的重新收敛情况: 检测到拓扑变化:当网络中的链路故障或新链路加入时,交换机会检测到拓扑变化。 选举新的根桥:如果原来的根桥故障或与根桥直…...
《无线江湖五绝:BLE/WiFi/ZigBee的频谱大战》
点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 88万阅读 1.6万收藏 文章目录 **第一回武林大会,群雄并起****第二回WiFi的“降龙十八掌”****第三回BLE的“峨眉轻功”****第四回ZigBee的“暗器百解”****第五回LoRa的“千里传音”****第六回NB…...
QT第六课------QT界面优化------QSS
作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 🎂 作者介绍: 🎂🎂 🎂 🎉🎉🎉…...
本地化智能运维助手:基于 LangChain 数据增强 和 DeepSeek-R1 的K8s运维文档检索与问答系统 Demo
写在前面 博文内容为基于 LangChain 数据增强 和 Ollams 本地部署 DeepSeek-R1实现 K8s运维文档检索与问答系统 Demo通过 Demo 对 LEDVR 工作流, 语义检索有基本认知理解不足小伙伴帮忙指正 😃,生活加油 我看远山,远山悲悯 持续分享技术干货…...
C++ STL常用算法之常用算术生成算法
常用算术生成算法 学习目标: 掌握常用的算术生成算法 注意: 算术生成算法属于小型算法,使用时包含的头文件为 #include <numeric> 算法简介: accumulate // 计算容器元素累计总和 fill // 向容器中添加元素 accumulate 功能描述: 计算区间内容器元素…...
Tof 深度相机原理
深度相机(TOF)的工作原理_tof相机原理-CSDN博客 深度剖析 ToF 技术:原理、优劣、数据纠错与工业应用全解析_tof技术-CSDN博客 飞行时间技术TOF_tof计算公式-CSDN博客 深度相机(二)——飞行时间(TOF)_飞行时间技术-C…...
【Linux篇】进程入门指南:操作系统中的第一步
步入进程世界:初学者必懂的操作系统概念 一. 冯诺依曼体系结构1.1 背景与历史1.2 组成部分1.3 意义 二. 进程2.1 进程概念2.1.1 PCB(进程控制块) 2.2 查看进程2.2.1 使用系统文件查看2.2.2 使⽤top和ps这些⽤⼾级⼯具来获取2.2.3 通过系统调用…...
JavaScript 中的原型链与继承
JavaScript 是一种基于原型的编程语言,这意味着它的对象继承是通过原型链而非类的机制来实现的。原型链是 JavaScript 中对象与对象之间继承属性和方法的基础。本文将深入探讨 JavaScript 中的原型链和继承机制,帮助你理解这一重要概念。 一、原型&…...
无线通信技术(二):ITU、3GPP及传统波段对无线频谱的划分
目录 一.ITU波段划分 二.3GPP频带划分(仅介绍5G NR) 2.1 频带分类 2.2 频带划分表 2.2.1 FR1 2.2.2 FR2 2.3 全球部署趋势 三.传统波段划分 3.1 射频工程中的微波 3.2 军用雷达波段命名 本文介绍国际标准组织ITU、3GPP和传统波段对无线频谱的划…...
Android 系统ContentProvider流程
一、ContentProvider初始化注册流程 源码查看路径:http://xrefandroid.com/android-11.0.0_r48/ 涉及到源码文件: /frameworks/base/core/java/android/content/ContentProvider.java 自定义ContentProvider需要继承该类,内部类Transport继承关系如下,实…...
SpringBean模块(一)定义如何创建生命周期
一、介绍 1、简介 在 Spring 框架中,Bean 是指由 Spring 容器 管理的 Java 对象。Spring 负责创建、配置和管理这些对象,并在应用程序运行时对它们进行依赖注入(Dependency Injection,DI)。 通俗地讲,Sp…...
k8s存储介绍(六)StorangeClass
一、Kubernetes 存储类(StorageClass)详解 1. 什么是 StorageClass? 在 Kubernetes 中,StorageClass(存储类)是一种用于动态创建 PersistentVolume(PV)的资源对象。它允许管理员根…...
Redis-04.Redis常用命令-字符串常用命令
一.字符串操作命令 set name jack 点击左侧name,显示出值。 get name get abc:null setex key seconds value:设置过期时间,过期后该键值对将会被删除。 然后再get,在过期时间内可以get到,过期get不到。…...
golang接口-interface
interface接口 概述 接口(interface)是 Go 语言中的一种类型,用于定义行为的集合,它通过描述类型必须实现的方法,规定了类型的行为契约。 它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这…...
Epub转PDF软件Calibre电子书管理软件
Epub转PDF软件:Calibre电子书管理软件 https://download.csdn.net/download/hu5566798/90549599 一款好用的电子书管理软件,可快速导入电脑里的电子书并进行管理,支持多种格式,阅读起来非常方便。同时也有电子书格式转换功能。 …...
【自学笔记】PHP语言基础知识点总览-持续更新
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1. PHP 简介2. PHP 环境搭建3. 基本语法变量与常量数据类型运算符 4. 控制结构条件语句循环语句 5. 函数函数定义与调用作用域 6. 数组7. 字符串8. 表单处理9. 会话…...
FAST-LIVO2 Fast, Direct LiDAR-Inertial-Visual Odometry论文阅读
FAST-LIVO2 Fast, Direct LiDAR-Inertial-Visual Odometry论文阅读 论文下载论文翻译FAST-LIVO2: 快速、直接的LiDAR-惯性-视觉里程计摘要I 引言II 相关工作_直接方法__LiDAR-视觉(-惯性)SLAM_ III 系统概述IV 具有顺序状态更新的误差状态迭代卡尔曼滤波…...
【Git】--- Git远程操作 标签管理
Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: Git 前面我们学习的操作都是在本地仓库进行了,如果团队内多人协作都在本地仓库操作是不行的,此时需要新的解决方案 --- 远程仓库。…...
Docker学习之服务编排(day9)
文章目录 前言一、问题描述二、解决方案1.安装Docker Compose1.1 [github下载相应版本](https://github.com/docker/compose/releases)1.2 将下载的文件移动到 /usr/local/bin 目录,确保它能够被系统识别为可执行文件1.3 赋予执行权限1.4 验证安装1.5 创建软链 2. 使…...
前后端常见模型以及相关环境配置介绍
一、前端常见框架 Vue.js 特点:采用数据驱动的响应式编程,组件化的开发模式使得代码结构清晰,易于维护,且学习成本相对较低,适合初学者和快速迭代的项目。应用场景:广泛应用于各类 Web 应用开发ÿ…...
职能型组织、项目型组织、矩阵型组织的介绍及优缺点比较
PMP考试中,经常会涉及到职能型组织、项目型组织、矩阵型组织的比较,下面简单介绍下职能型组织、项目型组织、矩阵型组织及其优缺点: 一、职能型组织 定义:以专业职能划分部门(如财务、技术、市场等)&…...
Java基本类型深度解析:从内存模型到高效编程实践
Java基本类型深度解析:从内存模型到高效编程实践 一、Java基本类型概述 Java作为强类型语言,定义了8种基本数据类型(Primitive Types),这些类型直接存储数据值而非对象引用,是构建Java程序的基础。它们的…...
论文阅读笔记——ST-4DGS,WideRange4D
ST-4DGS ST-4DGS 论文 在 4DGS 中,变形场 F \mathcal{F} F 与运动参数 X 和形状参数 ( S , R ) (S,R) (S,R) 高度耦合,导致训练时高斯表示紧凑型退化,影响动态渲染质量。由此,本文提出两种方法解耦运动与形状参数,保…...
