Opencv计算机视觉编程攻略-第四节 图直方图统计像素

news2025/4/26 10:23:23

Opencv计算机视觉编程攻略-第四节 图直方图统计像素

  • 1.计算图像直方图
  • 2.基于查找表修改图像
  • 3.直方图均衡化
  • 4.直方图反向投影进行内容查找
  • 5.用均值平移法查找目标
  • 6.比较直方图搜索相似图像
  • 7.用积分图统计图像

1.计算图像直方图

图像统计直方图的概念
图像统计直方图是一种用于描述图像中像素分布情况的工具。具体来说,灰度直方图是一个关于灰度级别的函数,它记录了图像中每种灰度级别对应的像素数量。这种分布反映了图像亮度的整体特性。

对于彩色图像(如RGB),可以通过将每个颜色通道分别映射到特定索引来构建其直方图,并利用核密度估计的方法来累积权重,从而得到更精确的颜色分布信息。

统计直方图主要基于opencv 的calcHist函数实现,其具体配置如下

		calcHist(&image, 
			1,			// histogram of 1 image only
			channels,	// the channel used
			Mat(),	// no mask is used
			hist,		// the resulting histogram
			1,			// it is a 1D histogram
			histSize,	// number of bins
			ranges		// pixel value range
		);

学习文中给出的手绘统计直方图,基于统计的频数,绘制线高 line

    // Create an image representing a histogram
    static Mat getImageOfHistogram(const Mat &hist, int zoom) {
        // Get min and max bin values
        double maxVal = 0;
        double minVal = 0;
        minMaxLoc(hist, &minVal, &maxVal, 0, 0);
        // get histogram size
        int histSize = hist.rows;
        // Square image on which to display histogram
        Mat 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 bin
        for (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 table
 LUT(image,lookup,result);

在这里插入图片描述
在这里插入图片描述

3.直方图均衡化

上文了解了统计直方图和查找表,基于直方图统计结果构建均衡化的查找表,从而全局修改图像整体颜色

equalizeHist(image,result); // 直接使用opencv函数实现均衡化

在这里插入图片描述
在这里插入图片描述
统计直方图的原理一般是值选择一定像素值范围,将该范围的像素映射的一个更大范围的像素值范围中,从而使得整体图像显得更均匀,手动实现代码如下:

    Mat stretch(const Mat &image, float percentile) {
        // number of pixels in percentile
        float number= image.total()*percentile;
        // Compute histogram first
        Mat hist = getHistogram(image);
        // find left extremity of the histogram
        int imin = 0;
        for (float count=0.0; imin < 256; imin++) {
            // number of pixel at imin and below must be > number
            if ((count+=hist.at<float>(imin)) >= number)
                break;
        }
        // find right extremity of the histogram
        int imax = 255;
        for (float count=0.0; imax >= 0; imax--) {
            // number of pixel at imax and below must be > number
            if ((count += hist.at<float>(imax)) >= number)
                break;
        }
        // Create lookup table
        int 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 table
        Mat result;
        result = applyLookUp(image, lookup);
        return result;
    }

在这里插入图片描述

4.直方图反向投影进行内容查找

区域内图像的统计直方图某种程度表示了整体颜色分布特征,因而可以使用区域的统计直方图作为特征进行相似内容查找,以区域内白云的颜色为例进行统计
在这里插入图片描述
在这里插入图片描述

calcBackProject(&image,
                      1,            // we only use one image at a time
                      channels,     // vector specifying what histogram dimensions belong to what image channels
                      shistogram,   // the histogram we are using
                      result,       // the resulting back projection image
                      ranges,       // the range of values, for each dimension
                      255.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 histogram
	int ch[1]={0};
	finder.setThreshold(-1.0f); // no thresholding
	cv::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 times
		1);     // 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 intersection
		return 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 image
	for (int y=110; y<120; y++) {
		for (int x=0; x<secondImage.cols-width; x++) {

			// compute histogram of 16 bins using integral image
			histogram= intHistogram(x,y,width,height);
			// compute distance with reference histogram
			double distance= cv::compareHist(refHistogram,histogram, cv::HISTCMP_INTERSECT);
			// find position of most similar histogram
			if (distance>maxSimilarity) {

				xbest= x;
				ybest= y;
				maxSimilarity= distance;
			}

			std::cout << "Distance(" << x << "," << y << ")=" << distance << std::endl;
		}
	}

在这里插入图片描述
如果看到这里,麻烦点一个赞再走,谢谢!相关代码同样上传代码库链接: 点击下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2325650.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习处理时间序列(5)

Keras中的循环层 上面的NumPy简单实现对应一个实际的Keras层—SimpleRNN层。不过&#xff0c;二者有一点小区别&#xff1a;SimpleRNN层能够像其他Keras层一样处理序列批量&#xff0c;而不是像NumPy示例中的那样只能处理单个序列。也就是说&#xff0c;它接收形状为(batch_si…

Mysql 索引性能分析

1.查看CRUD次数 show global status like Com_______&#xff08;7个下划线&#xff09; show global status like Com_______ 2.慢SQL分析 SET GLOBAL slow_query_log ON;-- 设置慢SQL日志记录开启 SET GLOBAL long_query_time 2; -- 设置执行超过 2 秒的查询为慢查询 开…

win11+ubuntu双系统安装

操作步骤&#xff1a; 官网下载ubuntu 最新镜像文件 准备U盘 准备一个容量不小于 8GB 的 U 盘&#xff0c;用于制作系统安装盘。制作过程会格式化 U 盘&#xff0c;请注意提前备份数据。 制作U盘启动盘 使用rufus工具&#xff0c;或者 balenaEtcher工具&#xff08;官网安…

linux-5.10.110内核源码分析 - 写磁盘(从VFS系统调用到I/O调度及AHCI写磁盘)

1、VFS写文件到page缓存(vfs_write) 1.1、写裸盘(dd) 使用如下命令写裸盘&#xff1a; dd if/dev/zero of/dev/sda bs4096 count1 seek1 1.2、系统调用(vfs_write) 系统调用栈如下&#xff1a; 对于调用栈的new_sync_write函数&#xff0c;buf为写磁盘的内容的内存地址&…

arinc818 fpga单色图像传输ip

arinc818协议支持的常用线速率如下图 随着图像分辨率的提高&#xff0c;单lane的速率无法满足特定需求&#xff0c;一种方式是通过多个LANE交叉的去传输图像&#xff0c;另外一种是通过降低图像的带宽&#xff0c;即通过只传单色图像达到对应的效果 程序架构如下图所示&#x…

业务流程先导及流程图回顾

一、测试流程回顾 &#xfeff; 1. 备测内容回顾 &#xfeff; 备测内容: 本次测试涵盖买家和卖家的多个业务流程&#xff0c;包括下单流程、发货流程、搜索退货退款、支付抢购、换货流程、个人中心优惠券等。 2. 先测业务强调 &#xfeff; 1&#xff09;测试业务流程 …

HCIP(RSTP+MSTP)

一、STP的重新收敛&#xff1a; 复习STP接口状态 STP初次收敛至少需要50秒的时间。STP的重新收敛情况&#xff1a; 检测到拓扑变化&#xff1a;当网络中的链路故障或新链路加入时&#xff0c;交换机会检测到拓扑变化。 选举新的根桥&#xff1a;如果原来的根桥故障或与根桥直…

《无线江湖五绝:BLE/WiFi/ZigBee的频谱大战》

点击下面图片带您领略全新的嵌入式学习路线 &#x1f525;爆款热榜 88万阅读 1.6万收藏 文章目录 **第一回武林大会&#xff0c;群雄并起****第二回WiFi的“降龙十八掌”****第三回BLE的“峨眉轻功”****第四回ZigBee的“暗器百解”****第五回LoRa的“千里传音”****第六回NB…

QT第六课------QT界面优化------QSS

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

C++ STL常用算法之常用算术生成算法

常用算术生成算法 学习目标: 掌握常用的算术生成算法 注意: 算术生成算法属于小型算法&#xff0c;使用时包含的头文件为 #include <numeric> 算法简介: accumulate // 计算容器元素累计总和 fill // 向容器中添加元素 accumulate 功能描述: 计算区间内容器元素…

Tof 深度相机原理

深度相机(TOF)的工作原理_tof相机原理-CSDN博客 深度剖析 ToF 技术&#xff1a;原理、优劣、数据纠错与工业应用全解析_tof技术-CSDN博客 飞行时间技术TOF_tof计算公式-CSDN博客 深度相机&#xff08;二&#xff09;——飞行时间&#xff08;TOF&#xff09;_飞行时间技术-C…

【Linux篇】进程入门指南:操作系统中的第一步

步入进程世界&#xff1a;初学者必懂的操作系统概念 一. 冯诺依曼体系结构1.1 背景与历史1.2 组成部分1.3 意义 二. 进程2.1 进程概念2.1.1 PCB&#xff08;进程控制块&#xff09; 2.2 查看进程2.2.1 使用系统文件查看2.2.2 使⽤top和ps这些⽤⼾级⼯具来获取2.2.3 通过系统调用…

SpringBean模块(一)定义如何创建生命周期

一、介绍 1、简介 在 Spring 框架中&#xff0c;Bean 是指由 Spring 容器 管理的 Java 对象。Spring 负责创建、配置和管理这些对象&#xff0c;并在应用程序运行时对它们进行依赖注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;。 通俗地讲&#xff0c;Sp…

Redis-04.Redis常用命令-字符串常用命令

一.字符串操作命令 set name jack 点击左侧name&#xff0c;显示出值。 get name get abc&#xff1a;null setex key seconds value&#xff1a;设置过期时间&#xff0c;过期后该键值对将会被删除。 然后再get&#xff0c;在过期时间内可以get到&#xff0c;过期get不到。…

Epub转PDF软件Calibre电子书管理软件

Epub转PDF软件&#xff1a;Calibre电子书管理软件 https://download.csdn.net/download/hu5566798/90549599 一款好用的电子书管理软件&#xff0c;可快速导入电脑里的电子书并进行管理&#xff0c;支持多种格式&#xff0c;阅读起来非常方便。同时也有电子书格式转换功能。 …

FAST-LIVO2 Fast, Direct LiDAR-Inertial-Visual Odometry论文阅读

FAST-LIVO2 Fast, Direct LiDAR-Inertial-Visual Odometry论文阅读 论文下载论文翻译FAST-LIVO2: 快速、直接的LiDAR-惯性-视觉里程计摘要I 引言II 相关工作_直接方法__LiDAR-视觉&#xff08;-惯性&#xff09;SLAM_ III 系统概述IV 具有顺序状态更新的误差状态迭代卡尔曼滤波…

【Git】--- Git远程操作 标签管理

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; Git 前面我们学习的操作都是在本地仓库进行了&#xff0c;如果团队内多人协作都在本地仓库操作是不行的&#xff0c;此时需要新的解决方案 --- 远程仓库。…

论文阅读笔记——ST-4DGS,WideRange4D

ST-4DGS ST-4DGS 论文 在 4DGS 中&#xff0c;变形场 F \mathcal{F} F 与运动参数 X 和形状参数 ( S , R ) (S,R) (S,R) 高度耦合&#xff0c;导致训练时高斯表示紧凑型退化&#xff0c;影响动态渲染质量。由此&#xff0c;本文提出两种方法解耦运动与形状参数&#xff0c;保…

[python]基于yolov8实现热力图可视化支持图像视频和摄像头检测

YOLOv8 Grad-CAM 可视化工具 本工具基于YOLOv8模型&#xff0c;结合Grad-CAM技术实现目标检测的可视化分析&#xff0c;支持图像、视频和实时摄像头处理。 功能特性 支持多种Grad-CAM方法实时摄像头处理视频文件处理图像文件处理调用简单 环境要求 Python 3.8需要电脑带有…

豪越科技消防一体化平台:打通消防管理“任督二脉”

在城市的车水马龙间&#xff0c;火灾隐患如潜藏的暗礁&#xff0c;威胁着人们的生命财产安全。传统消防管理模式在现代社会的复杂环境下&#xff0c;逐渐显露出诸多弊端。内部管理分散混乱&#xff0c;人员、装备、物资管理缺乏统一标准和高效流程&#xff1b;外部监管困难重重…