从Opencv之图像直方图源码,探讨高性能计算设计思想

news2025/1/18 7:41:25

前言

        纸上得来终觉浅,绝知此事要躬行。学会算法的理论很重要,但是把理论高效的实现也是需要一点点练习的。

        图像直方图的理论很简单,就是把一个图像的像素区间划分为几个子区间,然后统计图像中的像素包含在子区间内的个数。这里,我们可以很容易想到,图像每个像素之间对结果的影响是独立的,所以,代码实现时候可以考虑并行化设计。

  • 输入:image[h][w], bins, low, hign
  • 输出: hist[bins]

Opencv的实现

opencv的实现流程,以uint8编码的图像为例

1,建立0-255到bins子区间的映射table。

即table[256], index是0-255, table[index]是在histogram[bins]中的index。

 opencv建立table的接口函数

static void calcHistLookupTables_8u( const Mat& hist, 
                                const SparseMat& shist,
                                 int dims, const float** ranges, 
                                 const double* uniranges,
                                 bool uniform, bool issparse, 
                                 vector<size_t>& _tab )

关键逻辑代码:

double t = bins/(high - low);
double a = t
double b = -t*low
for (int j=low; j<high; j++)
{
    int idx =cvFloor( j*a +b);
    table[j-low]=idx;
}

2,统计图像上0-255各像素值对应的个数。

opencv每次统计四个相邻位置的像素,好像为利用了CPU流水线加速的原理,即同一指令,不同空间可以并行执行。
 

opencv接口函数:

static void calcHist_8u( vector<uchar*>& _ptrs, 
            const vector<int>& _deltas,
            Size imsize, Mat& hist, int dims, 
            const float** _ranges,
            const double* _uniranges, bool uniform )

关键逻辑代码: 

int matH[256] = { 0, };
for( x = 0; x <= imsize.width - 4; x += 4 )
 {
    int t0 = p0[x], t1 = p0[x+1];
    matH[t0]++; matH[t1]++;

    t0 = p0[x+2]; t1 = p0[x+3];
    matH[t0]++; matH[t1]++;
                        
  }
 p0 += x;
 for( ; x < imsize.width; x++, p0 += step)
     matH[*p0]++;

3,合并matH和table,得到最终hist的输出。

OUT_OF_RANGE =bins;
uchar* H = hist.data;
for(int i = 0; i < 256; i++ )
{
    size_t hidx = tab[i];
    if( hidx < OUT_OF_RANGE )
         *(int*)(H + hidx) += matH[i];
}

整体流程关系:

设计思路探讨

1,为什么要拆分成三步完成呢?这样的时间复杂度=O(256+256+h*w)

在遍历一次图像时候,为什么不同时完成hist的统计呢?可能opencv的映射查表用时更短,拆分步骤中1,2步可以同时完成。

for i in range(Height):

        for j in range(width):

                scale=bins/(high-low)

                index=image[i][i]*scale

                hist[index]+=1

2,在实现遍历图像,每个点对结果的影响又是独立的,那么软件层面如何进行并行化加速?

是不是能够分成多个线程读写image,在读取了image的像素值后,要对hist[pixes]或者matH[pixes]同一位置写数时候,加一个锁保护,即同一位置一次只能一个线程写数,只能串行,不能并行。

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

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

相关文章

什么是网络变压器,它是干什么用的?作用/参数表/价格及型号体系有哪些?怎么测量网络变压器好坏

什么是网络变压器&#xff1f; 网络变压器是在以太网网络传输设备中&#xff0c;主板上芯片PHY与网口RJ45之间的一个黑黑的小方块&#xff0c;里面的结构是磁环及铜线组成&#xff0c;这个小方块就是我们俗称的网络变压器 有的变压器中心抽头接到地。而接电源时&#xff0c;电…

深度学习入门(五十七)循环神经网络——循环神经网络从零开始实现

深度学习入门&#xff08;五十七&#xff09;循环神经网络——循环神经网络从零开始实现前言循环神经网络——循环神经网络从零开始实现教材1 独热编码(one-hot)2 初始化模型参数3 循环神经网络模型4 预测5 梯度裁剪6 训练7 小结前言 核心内容来自博客链接1博客连接2希望大家多…

【Hack The Box】linux练习-- Pandora

HTB 学习笔记 【Hack The Box】linux练习-- Pandora &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月27日&#x1f334; &#x1f…

TensorFlow之文本分类算法-4

1 前言 2 收集数据 3 探索数据 4 选择模型 5 准备数据 6 模型-构建训练评估 机器学习主要包括模型构建、模型训练、模型评估&#xff0c;在选择模型章节中已经对如何根据S/W的比率进行模型的选择&#xff0c;其包括n-gram模型或者序列模型&#xff0c;本章节内容主要描述…

LeetCode-813-最大平均值和的分组

1、动态规划法 我们可以利用数组dp[i][j]dp[i][j]dp[i][j]来表示我们将数组中区间[0,i−1][0,i-1][0,i−1]的元素分为jjj组的平均值的总和。因此我们可以得到状态转化方程如下&#xff1a;{dp[i][j]∑r0i−1nums[r]i,j1dp[i][j]maxx≥j−1(dp[x][j−1]∑rxi−1nums[r]i−x),j&…

计算机五大部件是指什么

计算机五大部件&#xff1a; 计算机硬件系统由运算器、控制器、存储器&#xff08;内外存储器&#xff09;、输入设备和输出设备五部分组成。 1、控制器&#xff1a;控制器就是一个系统中枢&#xff0c;控制计算机如何运行、运转的基本单元。 每一个运算器都需一个单独的控制…

D-016 JTAG硬件电路设计

JTAG硬件电路设计1 简介1.1 JTAG分类1.2 ARM调试器2 设计要点3 电路实战3.1 Xilinx3.2 ALTERA ------USB blaster1 简介 JTAG(Join Test Action Group)的中文名称为联合测试工作组&#xff0c;是一种国际标准测试协议&#xff0c;主要用于芯片内部测试&#xff1a;验证设计和P…

Ubuntu16.04 完整版 Gym 安装及说明

Ubuntu16.04 完整版 Gym 安装及说明1. 安装前言2. Gym 开发环境说明3. 完整版 Gym 的安装3.1 Anaconda 创建虚拟环境3.2 安装 gym[box2d]3.2.1 采用官方 GitHub 教程进行安装的报错及解决方案3.2.2 采用 Anaconda 进行安装3.2.3 测试能否成功运行 LunarLander-v2 环境3.3 安装 …

【一文秒懂——YAML配置文件】

目录 1. YAML配置文件 2. 实例 2.1 将原application.properties改为application.yml&#xff1a; 2.2 将原application-dev.properties改为application-dev.yml&#xff1a; 1. YAML配置文件 在Spring Boot项目中&#xff0c;还可以使用YAML配置文件&#xff0c;这是一种使…

一文搞懂漏洞严重程度分析

漏洞的级别定义主要从两个维度进行判断&#xff1b; 1、可利用性 2、影响性 可利用性指标 可利用性指标组刻画脆弱性组件&#xff08;即包含漏洞的事物&#xff09;的特征&#xff0c;反映漏洞利用的难易程度和技术要求等。可利用性指标组包含四个指标&#xff0c;分别是攻击…

最新阿里云GPU服务器租用配置费用价格表出炉(多配置报价)

阿里云GPU服务器优惠3折GPU云服务器vgn6i优惠价469.46元/月起&#xff0c;GPU云服务器gn6i和GPU云服务器gn6v均有活动&#xff0c;NVIDIA T4及V100均有活动&#xff0c;主机教程网 来详细说下阿里云GPU云服务器收费标准价格表&#xff0c;再来说说GPU云服务器计费模式&#xff…

Python学习笔记(十八)——Pandas进阶

文章主要内容文件操作&#xff1a; • 文件读取: read_csv(csv),read_table(表格),read_excl(excel) • 文件写入&#xff1a;to_csv, to_excel 数据清洗&#xff1a; • 处理缺失值&#xff1a;isnull(识别), dropna (过滤), fillna(填充) • 数据转换&#xff1a;drop_duplic…

MVCC多版本并发控制

目录 1、数据库并发场景 2、当前读和快照读 3、MVCC的隔离级别 4、实现原理 4.1、隐藏字段 ​​​​​​​4.2、Undo_log&#xff08;版本链&#xff09; 4.3、Read View&#xff08;读视图&#xff09; 4.4、RC、RR隔离级别下的快照读有什么区别 MVCC&#xff0c;多版…

文献认证!Kamiya艾美捷抗酒石酸酸性磷酸酶TRAP染色试剂盒

人类及动物体骨组织不断地进行着重建&#xff0c;骨重建过程包括骨的分解吸收与新骨的形成。破骨细胞&#xff08;Osteoclast&#xff0c;OC&#xff09;负责骨分解与吸收&#xff0c;而成骨细胞&#xff08;osteoblast&#xff0c;OB&#xff09;负责新骨形成。破骨细胞贴附在…

【WAX链游】发布一个免费开源的MiningNetwork合约脚本BTK

前言 挖矿网络&#xff08;Mining Network&#xff09;官网&#xff1a; https://miningnetwork.io 挖矿网络&#xff08;Mining Network&#xff09;合约脚本&#xff1a;https://github.com/encoderlee/MiningNetworkBot 回顾之前我们推出过的免费开源链游脚本&#xff1a…

【React技术】JSX在企业级项目的运用and一个元素渲染demo

JSX 它被称为JSX,是JavaScript的语法扩展。我们建议在React中使用JSX。JSX可以很好地描述UI应该呈现它应该具有的基本交互形式。JSX可能会让人想起模板语言,但它具有JavaScript的所有功能。 const element = <h1>Hello, world!</h1>;React认为渲染逻辑与其他UI…

红眼睛红外成像微型成像仪快速刷新与动态显示温度测量

默认参数下&#xff0c;设备的温度测量和数据输出频率为每秒 4Hz&#xff0c;这一输出速率基本可以保证所有计 算机和手机都能够正常显示实时画面&#xff0c;但导致的问题是实时画面有卡顿的感觉。数据的处理速度与 计算机和手机的配置高低有直接关系&#xff0c;下面仅以…

VScode 基础使用教程

VScode 的安装以及使用基础&#xff08;C配置&#xff09; 奉上VScode安装物资 VScode 的安装 进入VScode官网&#xff0c;点击 Download for windows 即可得到安装包&#xff0c;运行即可。 编译器G的配置 下载 MinGW&#xff0c;将其保存至任意磁盘中&#xff08;下面默认C…

在 Navicat 中执行数据库范围搜索

无论你选择的数据库是 MySQL、MariaDB、SQL Server、Oracle 和 PostgreSQL&#xff0c;还是基于云的服务&#xff0c;如 Amazon RDS、Amazon Aurora、Amazon Redshift、SQL Azure、Oracle Cloud 和 Google Cloud&#xff0c;你都将不可避免地要寻找一些你不知道位置的数据。在这…

简单3步轻松搭建个人博客

对于计算机专业的学生&#xff0c;课余时间最有价值的事莫过于写技术博客了。我们可以通过博客记录生活经历、学习过程、技术成长&#xff0c;同时博客还能树立个人品牌&#xff0c;结识更多兴趣相投的人。 从计算机技术角度而言&#xff0c;博客的搭建及维护会让你的技术不断…