OpenCV基础(3)
1.图像直方图
1.1.像素统计
计算图像均值:
Scalar cv::mean(InputArray src,InputArray mask=noArray());
- src:输入图像
- mask:掩膜层过滤
返回值是对输入图像通道数计算均值后的Scalar对象
计算图像均值与方差:
void cv::meanStdDev(InputArray src,OutputArray mean,OutputArray stddev,InputArray mask=noArray());
- src:输入图像
- mean:输出图像通道的均值
- stddev:输出图像通道的方差
- mask:掩膜层
查找最大值和最小值及其位置:
double cv::minMaxLoc(InputArray src, OutputArray minVal, OutputArray maxVal, OutputArray minLoc, OutputArray maxLoc, InputArray mask = noArray());
- src:输入图像或矩阵,可以是单通道、多通道或彩色图像。
- minVal:输出参数,指向一个double类型的指针,用于存储计算得到的最小值。
- maxVal:输出参数,指向一个double类型的指针,用于存储计算得到的最大值。如果不提供此参数,则默认为0。
- minLoc:输出参数,指向一个Point类型的指针,用于存储计算得到的最小值的位置。如果不提供此参数,则默认为0。
- maxLoc:输出参数,指向一个Point类型的指针,用于存储计算得到的最大值的位置。如果不提供此参数,则默认为0。
- mask:可选参数,输入图像或矩阵,用于指定感兴趣区域。只有位于mask内的像素才会被计算最小值和最大值。如果不提供此参数,则默认为noArray()。
1.2.直方图计算和绘制
void calcHist(const Mat* images, //输入的数组或数据集int nimages, //输入数组的个数const int* channels, //需要统计的通道(dim)索引 InputArray mask, //可选的操作掩码,用于标记出统计直方图的数组元素数据OutputArray hist, //输出的目标直方图 int dims, //需要计算的直方图的维数const int* histSize, //存放每个直方图尺寸的数组const float** ranges, //每一维数值的取值范围bool uniform = true, //指示直方图是否均匀的标识符bool accumulate = false //累计标识符,主要是允许多从多个阵列中计算单个直方图,或者用于在特定的时间更新直方图。
)
- 第一个参数:const Mat* 类型的 iamges,输入的数组(或数据集),它们需为相同的深度(CV_8U 或 CV_32F)和相同的尺寸。
- 第二个参数:int 类型的 nimages,输入数组的个数,也就是第一个参数中存放了多少张 “图像”,有几个原数组。
- 第三个参数:const int* 类型的 channels,需要统计的通道(dim)索引。第一个数组通道从 0 到 images[0].channels() - 1,而第二个数组通道从 images[0].channels() 计算到 images[0].channels() + images[1].channels() - 1。
- 第四个参数:InputArray 类型的 mask,可选的操作掩码。如果此掩码不为空,那么它必须为 8 位,并且与 images[i] 有同样的大小和尺寸。这里的非零掩码元素用于标记出统计直方图的数组元素数据。
- 第五个参数:OutputArray 类型的 hist,输出的目标直方图,一个二维数组。
- 第六个参数:int 类型的 dims,需要计算的直方图的维数,必须是正数,且不大于 CV_MAX_DIMS(在 OpenCV3 中等于 32)。
- 第七个参数:const int* 类型的 histSize,存放每个维度的直方图尺寸的数组。
- 第八个参数:const float** 类型的 ranges,表示每一个维度数组(第六个参数 dims)的每一维的边界阵列,可以理解为每一维数值的取值范围。
- 第九个参数:bool 类型的 uniform,指示直方图是否均匀的标识符,有默认值 true。
- 第十个参数:bool 类型的 accumulate,累计标识符,有默认值 false。若其为 true,直方图在配置阶段不会被清零。此功能主要是允许多从多个阵列中计算单个直方图,或者用于在特定的时间更新直方图。
绘制H-S直方图
#include<opencv2/opencv.hpp>
#include<time.h>
#include<iostream>using namespace std;
using namespace cv;int main() {system("color 2F");//载入原图,转化为 HSV 颜色模型Mat srcImage, hsvImage;srcImage = imread("1.jpg");cvtColor(srcImage, hsvImage, COLOR_BGR2HSV);//将色调量化为 30 个等级,将饱和度量化为 32 个等级int hueBinNum = 30; //色调的直方图直条数量int saturationBinNum = 32; //饱和度的直方图直条数量int histSize[] = { hueBinNum,saturationBinNum };//定义色调的变化范围为 0 到 179float hueRanges[] = { 0,180 };//定义饱和度的变化范围为 0(黑、白、灰)到 255(纯光谱颜色)float saturationRanges[] = { 0,256 };const float* ranges[] = { hueRanges,saturationRanges };MatND dstHist; //Mat 一般指二维矩阵,MatND 指多维矩阵( > 2 )//calcHist 函数中将计算第 0 通道和第 1 通道的直方图int channels[] = { 0,1 };//正式调用 calcHist ,进行直方图计算calcHist(&hsvImage, //输入的数组1, //数组个数为 1channels, //通道索引Mat(), //不使用掩膜dstHist, //输出的目标直方图2, //需要计算的直方图的维度为 2histSize, //存放每个维度的直方图尺寸的数组ranges, //每一维数值的取值范围数组true, //指示直方图是否均匀的标识符,true 表示均匀的直方图false //累计标识符,false 表示直方图在配置阶段会被清零);//为绘制直方图准备参数double maxValue = 0; //最大值//查找数组和子数组的全局最小值和最大值存入 maxValue 中minMaxLoc(dstHist, 0, &maxValue, 0, 0); int scale = 10; //直方图放大倍数Mat histImage = Mat::zeros(saturationBinNum * scale, hueBinNum * 10, CV_8UC3);//双重循环,实现直方图绘制for (int hue = 0; hue < hueBinNum; hue++) {for (int saturation = 0; saturation < saturationBinNum; saturation++) {//直方图直条的值float binValue = dstHist.at<float>(hue, saturation);int intensity = cvRound(binValue * 255 / maxValue); //强度//正式进行绘制rectangle(histImage,Point(hue * scale, saturation * scale),Point((hue + 1) * scale - 1, (saturation + 1) * scale - 1),Scalar::all(intensity),FILLED);}}imshow("素材图", srcImage);imshow("H-S 直方图", histImage);waitKey(0);return 0;
}
绘制一维直方图
#include<opencv2/opencv.hpp>
#include<time.h>
#include<iostream>using namespace std;
using namespace cv;int main() {system("color 2F");Mat srcImage = imread("1.jpg", 0);imshow("原图", srcImage);if (!srcImage.data) {printf("图像读取失败!");return 0;}MatND dstHist;int dims = 1;float hranges[] = { 0,255 };const float *ranges[] = { hranges }; //这里需为 const 类型 int size = 256;int channels = 0;//计算图像的直方图calcHist(&srcImage, 1, &channels, Mat(), dstHist, dims, &size, ranges);int scale = 1;Mat dstImage(size * scale, size, CV_8U, Scalar(0));//获取最大值和最小值double minValue = 0;double maxValue = 0;minMaxLoc(dstHist, &minValue, &maxValue, 0, 0);//绘制出直方图int hpt = saturate_cast<int>(0.9 * size);for (int i = 0; i < 256; i++) {float binValue = dstHist.at<float>(i); //注意 hist 中是 float 类型int realValue = saturate_cast<int>(binValue * hpt / maxValue);rectangle(dstImage, Point(i * scale, size - 1), Point((i + 1) * scale - 1, size - realValue), Scalar(255)); }imshow("一维直方图", dstImage);waitKey(0);return 0;
}
1.3.直方图均衡化
void cv::equalizeHist(
InputArray src,//输入图像
OutputArray dst//输出图像
)
1.4.直方图比较
double cv::campareHist( InputArray H1, InputArray H2, int method )
H1和H2是两个直方图数据,method表示衡量直方图数据相似性的计算方法。
- HISTCMP_CORREL:相关性相似比较
- HISTCMP_CHISQP:卡方相似比较
- HISTCMP_INTERSECT:交叉相似比较
- HISTCMP_BHATTACHARYYA:巴氏距离相似比较
- HISTCMP_HELLINGER:海林格距离相似比较,与巴氏距离相似比较相同
- HISTCMP_CHISQR_ALT:可变卡方相似比较
- HISTCMP_KL_DIV:基于KL散度相似比较
对相关性相似比较与交叉相似比较方法来说,直方图数据相似度越低,值就越低;而对卡方相似比较与巴氏距离相似比较方法来说,直方图数据相似度越低,值就越高;其中巴氏距离相似比较方法的取值范围是[0,1],0表示完全相同,1表示完全
1.5.直方图反向投影
void cv::calcBackProject(const Mat *images, //输入图像int nimages, //输入图像数量const int *channels, //不同图像的索引通道,编号从0开始InputArray hist, //输入的模板直方图数据OutputArray backProject, //反向投影后的输出const float **ranges, //通道的取值范围double scale=1, //输出数据的缩放,1表示保持原值bool uniform=true //表示一致性,对边界数据的处理方式,取值为false表示不处理
)
2.图像平滑操作
2.1.均值滤波
void blur( InputArray src, OutputArray dst,Size ksize, Point anchor = Point(-1,-1),int borderType = BORDER_DEFAULT
);参数说明:
参数1:被处理的图像
参数2:均值滤波处理之后的图像
参数3:滤波核大小,其格式为(高度,宽度),建议使用(3,3),(5,5),(7,7)等 宽、高相等的奇数边长。滤波核越大,处理之后的图像越模糊
参数4:滤波核的锚点,建议采用默认值,可以自动计算锚点
参数5:边界样式,建议采用默认值
2.2.高斯滤波
void GaussianBlur( InputArray src, OutputArray dst, Size ksize,double sigmaX, double sigmaY = 0,int borderType = BORDER_DEFAULT
);参数说明:
参数1:待处理的图像
参数2:高斯滤波处理之后的图像
参数3:滤波核的大小,宽高必须是奇数,与均值滤波相同
参数4:卷积核水平方向的标准差,建议填0,会根据滤波核的大小自动计算合适的权重比例
参数5:卷积核垂直方向的标准差,建议填0,会根据滤波核的大小自动计算合适的权重比例
参数6:边界样式,建议使用默认值
2.3.中值滤波
void medianBlur( InputArray src, OutputArray dst, int ksize );参数说明:
参数1:待处理的图像
参数2:中值滤波处理后的图像
参数3:滤波核大小,其值表示边长,必须是大于1的奇数 3,5,7等
2.4.双边滤波
void bilateralFilter( InputArray src, OutputArray dst, int d,double sigmaColor, double sigmaSpace,int borderType = BORDER_DEFAULT
);参数说明:
参数1:待处理的图像
参数2:双边滤波处理后的图像
参数3:以当前像素为中心的整个滤波区域的直径。如果d<0,则自动根据sigmaSpace参数 计算得到。该值与保留的边缘信息数量成正比,与方法运行效率成反比
参数4:参与计算的颜色范围,这个值是像素颜色值与周围颜色值的最大差值,只有颜色值 之差小于这个值时,周围的像素才进行滤波计算。值为255时,表示所有颜色都参与计算
参数5:坐标空间的σ(sigma)值,该值越大,参与计算的像素数量就越多
参数6:边界样式,建议默认值
相关文章:
OpenCV基础(3)
1.图像直方图 1.1.像素统计 计算图像均值: Scalar cv::mean(InputArray src,InputArray masknoArray()); src:输入图像mask:掩膜层过滤 返回值是对输入图像通道数计算均值后的Scalar对象 计算图像均值与方差: void cv::meanSt…...
大语言模型---RewardBench 介绍;RewardBench 的主要功能;适用场景
文章目录 1. RewardBench 介绍2. RewardBench 的主要功能3. 适用场景 1. RewardBench 介绍 RewardBench: Evaluating Reward Models是一个专门用于评估 Reward Models(奖励模型) 的公开平台,旨在衡量模型在多种任务上的性能,包括…...
泷羽sec-linux
基础之linux 声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团…...
栈、队列、链表
一、栈 1. 定义 栈是一种线性数据结构,遵循后进先出(LIFO, Last In First Out)的原则。这意味着最后被添加到栈中的元素将会是最先被移除的元素。 2. 基本操作 Push:将一个元素添加到栈顶。Pop:移除并返回栈顶的元…...
【maven】配置下载私有仓库的快照版本
1、setting.xml配置 <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/SETTINGS/1.0.0https://maven.apache.org/xsd/settings-1.0.0.…...
LabVIEW引用类型转换问题
一、问题描述 在LabVIEW中,refnum(引用编号)用于引用各种资源,如文件、队列、控件等。这些引用是与具体类型相关的,通常情况下,LabVIEW会根据引用的类型自动进行处理。然而,当不同类型的引用需…...
GUI智能代理:用AI代理玩米哈游游戏《崩坏》
项目名称:The Dawn of GUI Agent研究对象:Claude 3.5 Computer Use特点:首个公测版GUI智能代理系统 技术创新 首创性:这是首个提供公测版图形界面控制功能的前沿AI模型。交互方式:实现了从自然语言到桌面操作的端到端控制,用户可以通过简单的自然语言指令完成复杂的桌面…...
系统思考—环路图的好处
每次内部学习,我们都会用系统环路图拆解那些动态性复杂的议题。这不仅仅是我们教学的工具,更是我们在实践中不断应用和打磨的利器。 我常在课程中和大家分享,什么原因要持续使用系统环路图? 🎯 1. 落地全局思维 环路图…...
torch.set_printoptions
torch.set_printoptions 设置pytorch打印张量时的选项,比如限制打印的元素数量、设置精度等。在打印大张量或者需要更精确控制输出格式时非常有用。 torch.set_printoptions(precisionNone, thresholdNone, edgeitemsNone, linewidthNone, profileNone, sci_modeN…...
Nexus搭建go私有仓库,加速下载go依赖包
一、搭建go私库 本文我们梳理一下go依赖包的私库搭建以及使用。 它只分为proxy和group两种仓库,这一点和maven仓库有所不同。 1、创建Blob Stores 为了区分不同的私库依赖包,存储的位置分隔开。 2、新建go proxy官网 Remote storage:htt…...
Qt6 Android设置文件读写权限设置
一.概述 1.在Qt中设置Android应用程序的文件读写权限,你需要在Android的Manifest文件中声明所需的权限。对于文件读写,通常需要声明以下权限: android.permission.READ_EXTERNAL_STORAGE:允许应用程序从外部存储读取数据。 android.permission.WRITE_EXTERNAL_STORAGE:允…...
TCP快速重传机制为啥出现重复ACK?
TCP快速重传机制为啥出现重复ACK 简单来说,丢失数据包后发送方至少发了三个请求,每个请求返回接收方下一次期待的序列号ACK,也就是丢失数据包之前的一个正常请求的确认ACK值 在 TCP(Transmission Control Protocol,传…...
SSM--SpringMVC复习(二)
请求 URL匹配: RequestMapping RequestMapping 负责将请求映射到对应的控制器方法上。 RequestMapping 注解可用于类或方法上。用于类上,表示类中的所有响应请求的方法都以该地址作为父路径。 在整个 Web 项目中,RequestMapping 映射的请求…...
C语言蓝桥杯组题目
系列文章目录 文章目录 系列文章目录前言题目第一题.1, 2, 3, 4 能组成多少个互不相同且无重复数字的三位数?都是多少?思路 第二题: 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少…...
【解决】Unity TMPro字体中文显示错误/不全问题
问题描述:字体变成方块 原因:字体资源所承载的长度有限 1.找一个中文字体放入Assets中 2.选中字体创建为TMPro 字体资源 3.选中创建好的字体资源(蓝色的大F) 在右边的属性中找到Atlas Width h和 Atlas Heigth,修改的大一点&…...
【Threejs进阶教程-着色器篇】9.顶点着色器入门
【Threejs进阶教程-着色器篇】9.顶点着色器入门 本系列教程第一篇地址,建议按顺序学习认识顶点着色器varying介绍顶点着色器与片元着色器分别的作用Threejs在Shader中的内置变量各种矩阵gl_Position 尝试使用顶点着色器增加分段数增强效果 制作平面鼓包效果鼓包效果…...
质量留住用户:如何通过测试自动化提供更高质量的用户体验
在当今竞争异常激烈的市场中,用户手头有无数种选择,但有一条真理至关重要: 质量留住用户。 产品的质量,尤其是用户体验 (UX),直接决定了客户是留在您的品牌还是转而选择竞争对手。随着业务的发展,出色的用户…...
【CSP CCF记录】201803-1第13次认证 跳一跳
题目 样例输入 1 1 2 2 2 1 1 2 2 0 样例输出 22 思路 没有技术含量的一道题,解题的关键是理解游戏规则。用state标记跳跃状态,以下是对游戏规则的分析: 1. state1,跳到方块上但没跳到中心,得1分 2. state2…...
详解Qt 中使用虚拟键盘(软键盘qtvirtualkeyboard)
文章目录 详解 Qt 中使用虚拟键盘(软键盘:QtVirtualKeyboard)1. 虚拟键盘简介1.1 虚拟键盘的应用场景 2. 安装和配置2.1 安装 QtVirtualKeyboard2.2 配置环境变量 3. 使用虚拟键盘3.1 示例代码main.cppwidget.hwidget.cpp 4. 总结 详解 Qt 中…...
cocoscreater3.8.4生成图集并使用
1.安装texturepacker,去官网下载https://www.codeandweb.com/texturepacker 2.将图片拖动进来,即可自动生成精灵表,这里输出选用cocos2d-x,打包用免费版的“基本”就行,高级模式是收费的,然后点击“发布精…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
