福州大学《嵌入式系统综合设计》实验七:图像灰度直方图

一、实验目的

直方图是一种统计特征,在图像中广为使用,因为具有计算简便、不受平移、旋转的影响,因此可以作为图像的一种有效的局部/全局特征来表示图像,是图像的重要特征之一。直方图在SIFT算法、HOG算法、直方图均衡等图像特征检测算法中都广为使用。本实验的目的是让大家掌握bmcv_calc_hist、和OpenCV中calcHist函数的使用,可以计算出图像的直方图。

二、实验内容

搭建BMCV环境并成功运行bmcv_calc_hist例程

三、开发环境

开发主机:Ubuntu 22.04 LTS

硬件:算能SE5

四、实验器材

开发主机 + 云平台

五、实验过程与结论

本实验涉及的程序框架与实验4的图4-1一致,仅需根据具体调用的API函数配置相关参数即可,因此接下来重点介绍bmcv_calc_hist API函数的参数及其调用方法。图像灰度直方图因为可以反映图像中灰度的分布情况,常作为图像的一种重要特征。可以通过bmcv提供的bmcv_calc_hist函数实现。

5.1 bmcv_calc_hist函数介绍

bmcv_calc_hist函数形式如下:

bm_status_t bmcv_calc_hist ( bm_handle_t handle, bm_device_mem_t input,
bm_device_mem_t output,
int C, int H, int W,
const int *channels,
int dims,
const int *histSizes,
const float *ranges,
int inputDtype);

其中,handle为bm_handle 句柄; input为已分配好 device memory的输入信息,该device memory 空间存储了输入数据,类型可以是float32 或者uint8,由参数inputDtype决定,其大小为C*H*W*sizeof(Dtype);Output为已分配好 device memory的直方图输出结果信息,该 device memory 空间存储了输出结果,类型为 float, 其大小为 histSizes[0]* histSizes[1]*…… *histSizes[n]*sizeof(float)。

C为输入通道数,H为输入通道高度,W为输入通道宽度,channels为需要计算直方图的 channel 列表,其长度为 dims,每个元素的值必须小于 C; 例如,RGB图像的C=3, 而如果只需要计算R通道图像的直方图,则dims=1;

histSizes:对应每个 channel 统计直方图的份数, ranges:每个通道参与统计的范围,其长度为 2*dims; 例如,对位深为24bit的RGB图像,如果三个通道的颜色值都参加直方图统计,每个通道颜色取值范围从0到255, 因此ranges为[0, 255, 0, 255, 0, 255],如果每个通道的值被分为8个bins,则histSizes为:[8,8,8];

inputDtype:输入数据的类型:0 表示 float,1 表示 uint8。

代码使用范例如下:

int H = 1024;
int W = 1024;
int C = 3;
int dim = 3;
int channels[3] = {0, 1, 2};
int histSizes[] = {15000, 32, 32};
float ranges[] = {0, 1000000, 0, 256, 0, 256};
int totalHists = 1;for (int i = 0; i < dim; ++i) {
totalHists *= histSizes[i];
}
bm_handle_t handle = nullptr;
bm_status_t ret = bm_dev_request(&handle, 0);
float *inputHost = new float[C * H * W];
float *outputHost = new float[totalHists];for (int i = 0; i < C; ++i) {
for (int j = 0; j < H * W; ++j)
inputHost[i * H * W + j] = static_cast<float>(rand() % 1000000);
}//创建图像input,和保持直方图结果的output对象,分配内存;
ret = bmcv_calc_hist(handle,input, output, C, H, W,  channels, dim, histSizes, ranges, 0);
5.2 OpenCV calcHist函数

OpenCV 提供calcHist函数来实现直方图的计算,具体形式如下:

void cv::calcHist (	const Mat * images,int 	    nimages,const int * channels,InputArray 	mask,OutputArray hist,int 	    dims,const int * histSize,const float ** ranges,bool 	    uniform = true,bool 	    accumulate = false 
)
  1. 其中,images为输入的图像的指针;nimages为输入图像个数;channels为需要统计直方图的第几通道。
  2. mask:掩模,mask必须是一个8位(CV_8U)的数组并且和images的数组大小相同;如果其值不为空,则,值为1的点将用来计算直方图。
  3. hist:直方图计算的输出值;dims:输出直方图的维度(由channels指定);histSize:直方图中每个dims维度需要分成多少个区间(如果把直方图看作一个一个竖条的话,就是竖条的个数);ranges:统计像素值的区间;uniform=true:是否对得到的直方图数组进行归一化处理;accumulate= false:在多个图像时,是否累积计算像素值的个数;

调用时,参考代码如下:

//需要计算的图像的通道,灰度图像为3,BGR图像需要指定B,G,Rconst int channels[] - {0 };Mat hist; //定义输出Mat类型int dims = 1;int dims = 1;//设置直方图维度const int histSize[] - { 256 }; //直方图每一个维度划分的柱条的数目//每一个维度取值范围float pranges[] - { 0, 255 }; //取值区间const float* ranges[] - { pranges };calcHist(&gray,1, channels, Mat(), hist, dims, histSize,ranges, true, false);
5.3 画直方图

最后输出的结果可以通过OpenCVrectangle函数将点连接起来画出直方图:

int scale = 2;int hist_height = 256;Mat hist_img = Mat::zeros(hist_height, 256 * scale, CV_8UC3);double max_val;Mat hist = Mat::zeros(1, 256 , CV_32FC3);;for (int i = 0; i < 250; i++){hist.at<float>(i) = outputHost[i];}minMaxLoc(hist, 0, &max_val, 0, 0);for (int i = 0; i < 250; i++){float bin_val = hist.at<float>(i);int intensity = cvRound(bin_val * hist_height / max_val);rectangle(hist_img, Point(i * scale, hist_height - 1), Point((i + 1) * scale - 1, hist_height - intensity), Scalar(255, 255, 255));}imwrite("bmcv_calc_hist_out.jpg", hist_img);
7.4 执行结果

按照上述步骤,生成可执行文件并上传到算能盒子给可执行文件赋权限并执行:

root@ab162899a93b:/tmp/tmp6l8uq_dw# chmod 777 bmcv_calc_hist

root@ab162899a93b:/tmp/tmp6l8uq_dw# ./bmcv_calc_hist encodeImage.jpg

Open /dev/jpu successfully,device index = 0, jpu fd = 8,vpp fd = 9

执行结果如下:

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

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

相关文章

重庆数字孪生技术推进制造业升级,工业物联网可视化应用加速

重庆数字孪生、5G、人工智能、物联网、大数据等新一代信息技术的出现及终端计算设备的发展&#xff0c;带来了研发模式、生产模式、消费模式、体制机制的系统性变革&#xff0c;企业应该建设适应工业4.0时代发展要求的新型生产体系。巨蟹数科数字孪生智能工厂通过部署多样化用例…

Spring cloud - Feign

Feign的作用 Feign是Netflix公司开发的声明式web客户端组件&#xff0c;Spring对Feign做了无缝集成&#xff1a; Feign is a declarative web service client. It makes writing web service clients easier. To use Feign create an interface and annotate it. It has plugg…

初出茅庐的小李之C语言必备知识预处理

编译预处理 编译预处理就是在编译源代码之前进行的一系列处理&#xff0c;将源程序中的一些特殊命令进行展开或处理&#xff0c;生成扩展的源代码。这些特殊命令通常以“#”开头&#xff0c;占单独的行&#xff0c;语句尾部不需要加分号。 宏定义 (#define)是一种常见的编译…

国产航顺HK32F030M: 简易篮球计分器(便携计分器)

【自制】《基于航顺HKF030MF4P6手持比赛计分牌》&#xff08;便携计分器&#xff09; 1. 简介 便携篮球计分器是一种小型化设计的设备&#xff0c;主要用于记录和显示篮球比赛的得分和计时。以下是由Type-C充电电路TP5400/ASM1117电路、HK32F030MF4单片机最小系统、数码管显示…

AlDente Pro v1.22.2(mac电池最大充电限制工具)

AlDente Pro是一款适用于Mac操作系统的小工具&#xff0c;可以帮助您限制电池充电量以延长电池寿命。通常情况下&#xff0c;电池在充满的状态下会继续接受电源充电&#xff0c;这可能会导致电池寿命缩短。使用AlDente Pro&#xff0c;您可以设置电池只充到特定的充电水平&…

【机器学习】聚类(二):原型聚类:LVQ聚类(学习向量量化)

文章目录 一、实验介绍1. 算法流程2. 算法解释3. 算法特点4. 应用场景5. 注意事项 二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入必要的库1. LVQ类a. 构造函数b. 闵可夫斯基距离c. LVQ聚类过程e. 聚类结果可视化 2. 辅助函数3. 主函数a. 命令行界面 &#xff…

超实用:通过文字就可以操纵这款AI表格,不需要你懂Excel函数

公众号「架构成长指南」&#xff0c;专注于生产实践、云原生、分布式系统、大数据技术分享。 工具介绍 今天给大家分享超实用的AI表格ChatExcel&#xff0c;这个工具是由北大团队在2022年3月开始开发的AI表格处理神器&#xff0c;上传你的表格后&#xff0c;只需要用文字描述你…

Javascript每天一道算法题(十八)——矩阵置零-中等

文章目录 1、问题2、示例3、解决方法&#xff08;1&#xff09;方法1——标记数组 1、问题 给定一个 y x x 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 2、示例 示例 1&#xff1a; 输入&#xff1a;matrix [[…

使用ETLCloud实现CDC实时数据集成:从MySQL到ClickHouse的实时数据同步

背景 在上一篇文章中体验了 ETLCloud 的离线数据迁移功能&#xff0c;就像大数据领域里有离线计算和实时计算&#xff0c; ETLCloud 还提供了基于 CDC &#xff08;Change Data Capture&#xff09;的实时数据集成功能&#xff1a;实时数据集成是指通过变化数据捕获技术&#…

【MySQL】数据库基础操作

&#x1f451;专栏内容&#xff1a;MySQL⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、数据库操作1、创建数据库2、查看所有数据库3、选定指定数据库4、删除数据库 二、数据表操作1、创建数据表2、查看所有表3、…

1.Linux基础命令

1.打开命令窗口 crtlaltt 2.显示当前目录中的文件 ls 3.创建目录/文件夹 mkdir 文件名 4.进入文件夹 cd 目录 cd . .回到上一级目录 cd . ./. ./回到上上级目录 5.创建文本 gedit 文本名 6.删除文件 删除文件夹 rm -r 文件名&#xff08;强制删除&#xff09; 删除文本 rm…

python -opencv 图像锐化

python -opencv 图像锐化 图像锐化其实&#xff0c;是一种增强图片对比度的技术&#xff0c;我们可以通过计算图像的导数&#xff0c;把导数绝对值数值大于零的数值加回原图像&#xff0c;通过这种方法&#xff0c;可以增强图像的对比度。 实现代码如下&#xff1a; import c…

3、点亮一个LED

新建工程 project—>New uVision Project LED介绍 中文名&#xff1a;发光二极管 外文名&#xff1a;Light Emitting Diode 简称&#xff1a;LED 用途&#xff1a;照明、广告灯、指引灯 电路图分析 进制的转换 生成下载文件&#xff1a; 代码 //导包 #inclu…

【从浅识到熟知Linux】基本指定之find、grep、head和tail

&#x1f388;归属专栏&#xff1a;从浅学到熟知Linux &#x1f697;个人主页&#xff1a;Jammingpro &#x1f41f;每日一句&#xff1a;一篇又一篇&#xff0c;学写越上头。 文章前言&#xff1a;本文介绍find、grep、head和tail指令用法并给出示例和截图。 文章目录 find基本…

大中小协作 共筑科学梦——华中科技大学附属花城中学举办首届科技节

为普及科学知识&#xff0c;张扬科学精神&#xff0c;创设浓郁的科学氛围&#xff0c;11月24日&#xff0c;华中科技大学附属花城中学举办了以“走近科学&#xff0c;触碰未来”为主题的首届科技节暨科创文化展示周活动。学生们在学习中感受科技的魅力&#xff0c;在“玩”中感…

实现简单的操作服务器和客户端(上)

一、说明 描述:本教程介绍如何使用 simple_action_server 库创建斐波那契动作服务器。此示例操作服务器生成斐波那契序列,目标是序列的顺序,反馈是计算的序列,结果是最终序列。 内容 创建操作消息编写一个简单的服务器 代码

【LM、LLM】浅尝二叉树在前馈神经网络上的应用

前言 随着大模型的发展&#xff0c;模型参数量暴涨&#xff0c;以Transformer的为组成成分的隐藏神经元数量增长的越来越多。因此&#xff0c;降低前馈层的推理成本逐渐进入视野。前段时间看到本文介绍的相关工作还是MNIST数据集上的实验&#xff0c;现在这个工作推进到BERT上…

[极客大挑战 2019]Secret File1

[极客大挑战 2019]Secret File1 在bp里面发现secr3t.php 将secr3t.php 直接加在网站后面&#xff0c;发现了有关flag的信息&#xff0c;一个flag.php文件 在遇到flag.php时候&#xff0c;联想到php伪协议&#xff0c;构造伪协议方式 secr3t.php?filephp://filter/readconver…

0002Java程序设计-springboot在线考试系统小程序

文章目录 **摘 要****目录**系统实现开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;776871563 摘 要 本毕业设计的内容是设计并且实现一个基于springboot的在线考试系统小程序。它是在Windows下&#xff0c;以MYSQL为数据库开发平台&…

FFmpeg零基础学习(一)——初步介绍与环境搭建

目录 前言正文一、开发环境二、搭建环境三、测试代码四、调用库的介绍End、遇到的问题2、Qt 在线安装容易报错&#xff0c;断开问题1、在线安装QMaintainTool很慢2、Qt5.15 无法调试FFmpeg 参考 前言 FFmpeg是一个开源的跨平台多媒体处理框架&#xff0c;它包含了一组用于处理…