integral函数Opencv源码理解-leetcode动态规划的使用场景

9 篇文章 0 订阅
订阅专栏

前言

            Opencv有一个integral()函数,也就是积分图算法。有三种积分图类型,求和(sum),求平方和(sqsum),求旋转45°和(titled)。根据名字可知道,前两个是统计输出每个坐标的左上方像素和、左上方像素平方和,旋转45°的积分图则是统计每个像素点左上方45°到右上方45°区域的像素和。

        作为一名合格的算法工程师,肯定都有leetcode的刷题经验,leetcode上的经典动态规划类型题目,可以完美的在integral函数的代码中体现。

        通过本文,你会知道积分图的sum, sqsum, titled的使用和实现细节。看到动态规划中时间复杂度和内存优化的思想是如何被一步步设计的。

integral()函数的介绍

        积分图是数字图像处理中常用的一种方法,通常能够很大程度的加速计算过程。其思想是,当需要统计一张图像中矩形区域的像素和时候,如果我们之前统计过该图像的积分图结果,就可以直接调用积分图数据,做两次加法两次减法就能得到结果了,而不用再遍历这个图像的所有像素点。

        如下图,假设积分图用summ表示, ABCD区域的像素和用S表示,则S=summ[A] + summ[D]-summ[C]-summ[B]。粉色标记区域就是点A的累计像素和区域,分别对应了sum, sqsum积分图和titled积分图。

        另外,使用积分图时候,一般会给一个左上角的点A(x,y, h,w), 其对应的矩形B,C,D的坐标关系,在sum,titled里具有不一样的含义。比如在opencv 文档里的示例,一个正常的矩形 Rect(4,4,3,2) 和一个倾斜45度的矩形Rect(5,1,2,3)。其坐标对应关系如下,请注意stright和titled矩形的P0,P1,P2,P3并非一一对应,只有同一张图里的P0,P1,P2,P3四个点的相对位置是对应的,这里可能会给人造成误解。

        integral积分图有三种构建方式,定义如下。前两种sum,sqsum比如可以用在相似度匹配算法NCC, 第三种titled常用在人脸检测算法的Harr特征提取场景。

 integral的代码实现设计

        由定义可知,sum, sqsum两种积分图除了累加定义不同,其实现思路是一样的。为了描述方便,后面代码设计主要以sum,title两种方式为典型进行分析。

sum模式的代码实现设计

        把一张图按照从左到右,从上到下的顺序遍历,sum是以统计每个像素点的之前的像素值累计之和,那么如果没有优化思想,每个输出像素点都要重新从头开始遍历图像并累加和,那么时间复杂度就是O(H *W *(1+2+3+...+H*W)≈O(H*W)^2,实际上完全没有必要。

        根据定义,我们可以发现当前像素点的积分结果与其左边和上边一个是有关系的!利用这个关系,可以重复利用之前统计过的像素值,而不用重新统计新坐标位置之前的像素和了,实现“看一遍”就出结果的效果。

        如下图,假设原图用src表示, sum表示积分图结果。现在要计算p(x,y)的积分结果,可以有两种实现设计,其时间复杂度都是O(H*W), 只是空间复杂度不同。

设计一(左边):

需要一个额外的空间数组Buf,长度和图像宽w相同。 buf[i]表示该列累计到i的像素和。

sum(x,y)=sum(x-1,y) +Buf(x-1)+src(x,y)

设计二(右边):

需要一个额外空间变量Sx,表示该行累计到x坐标之前的像素和。

sum(x,y)=sum(x,y-1)+Sx+src(x,y)

titled模式的代码实现设计

        同样,我们也可以观察到titled模式的积分统计也是有规律的,当前像素的结果与其周边的几个点也有关系。最终也有两种实现设计方式。

        我们同样用src指代原图,用titled指代旋转45度的积分图结果。

设计一(左边):

需要一个额外的空间数组Buf,长度和图像宽w相同。 buf[i]表示到第i行,其右斜对角的像素和。

titled(x,y)= titled(x-1,y-1)+Buf(x)+Buf(x+1)+src(x,y)

设计二(右边):

titled(x,y)= titled(x-1,y-1)+ titled(x+1,y-1)- titled(x,y-2)+src(x,y)+src(x,y-1)

        另外对于titled模式,请注意,上面示意的只是中间位置像素点的计算,当第一行,或者第一列,最后一列时候的处理关系如下,上面两种设计对这种边界的处理是相同的。

  • titled(x,y)=src(x,y),   if y=0
  • titled(x,y)=titled(x+1,y-1)+src(x,y)+src(x,y-1),  if x=0
  • titled(x,y)=titled(x-1,y-1)+src(x,y)+src(x,y-1),  if x=w-1

小结

        对于sum, titled,opencv的实现分别采用了设计2,设计1。并且为了使计算代码更简洁,在实现时候,sum,titled的内存分配都会比src多一行和一列。最终的结果在去掉这一行一列。

        至此,将integral积分图的代码实现流程已经分析完毕,sum, sqsum的计算比较容易复现,titled模式下,对维护每行斜对角累计像素和的Buf更新,有点不太容易理解。后面如果大家有需求,欢迎留言,再把我写的python实现代码贴一下,今天就到这里啦。

        整体代码实现的设计思路就是用到了动态规划的思想,想想自己之前刷过的题,感觉好亲切啊,有没有?

写文章

热门文章

  • SCI-HUB,免费科研论文下载的网址(亲测有效) 123748
  • 正定矩阵与半正定矩阵定义与判别 104402
  • 数学建模竞赛经验分享(从本科生到研究生,获奖成功率100%,我从数模所学) 91437
  • ENVI5.2裁剪遥感图像指定区域 83404
  • 纳什均衡(Nash equilibrium)及经典案例 71380

分类专栏

  • 大模型 2篇
  • 工作的成长一刻 9篇
  • 硬件与芯片 18篇
  • onnx与pytorch 5篇
  • 机器学习&深度学习 38篇
  • 性能测试 7篇
  • 灵光一现的编程题 1篇
  • LeetCode/竞赛/算法分析 57篇
  • 感悟&分享&职场 7篇
  • 开源相关 6篇
  • 有趣的智力问题/悖论/哲学 4篇
  • 整书学习笔记
  • C++ Primer Plus (第6版) 9篇
  • SystemC入门(第2版) 7篇
  • C 语言 & 数据结构 11篇
  • 计算机操作系统 11篇
  • 计算机是怎么工作的? 22篇
  • 百面机器学习 12篇
  • 通用技术&工具&方案
  • ubuntu/linux新系统必要的工具软件安装教程 13篇
  • 即时问题记录及解决方案分享 57篇
  • 技术教程 44篇
  • 研发通用工具/代码汇总 12篇

最新评论

  • C和C++的二进制,八进制,十六进制输出格式(全面版)

    CrasenTry: 二进制输出可不可以不设置输出位数

  • int类型在计算机中的存储(原码,反码,补码)

    irving928: 32位的取值范围说错了吧,怎么可能才231

  • Github新手创建第一个 repository流程

    Briwisdom: 感觉像是仓库指向地址不对,检查一下名字对吗,仓库存在不

  • Github新手创建第一个 repository流程

    Sw1tRevenge: 这个是什么问题啊,push不上去 error: src refspec master does not match any error: failed to push some refs to 'https://github.com/Sw1tRevenge/Sw1tRevenge.github.io.git'

  • 计算机的“记忆”是怎么做到的?

    碎梦逐星: 深入浅出

大家在看

  • 常见web安全类攻击的定义及对应防御方法(一) 383
  • 【最快最简单的排序 —— 桶排序算法】 64
  • 游戏服务器遇到攻击怎么办?什么是游戏盾? 832
  • 基于mimo系统的信道估计算法matlab仿真,对比LS,MMSE以及OMP压缩感知三种算法
  • 复合材料机器学习,需要的来

最新文章

  • AI技术好书推荐:《AI系统-原理与架构》
  • 简单理解数字电路的时序图:写优先模式
  • 大模型基架:Transformer如何做优化?
2024年17篇
2023年40篇
2022年73篇
2021年55篇
2020年48篇
2019年41篇
2018年73篇
2017年1篇
2016年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Briwisdom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家东莞透光玻璃钢雕塑生产商扬州商场新年美陈贵州创意玻璃钢雕塑生产厂家江西商业街玻璃钢雕塑设计公司商场美陈道具销售杨浦玻璃钢雕塑厂古代玻璃钢卡通雕塑推荐厂家商场美陈布置装饰布置阿坝玻璃钢动物雕塑资阳玻璃钢花盆福建商场主题创意商业美陈经验广西卡通造型玻璃钢雕塑价格玻璃钢公园雕塑厂家定制校园题材玻璃钢雕塑衢州大型玻璃钢雕塑批发附近玻璃钢鹿雕塑厂家青海动物玻璃钢雕塑定做佛山玻璃钢挑担人物雕塑商场开业灯光美陈厂家北京玻璃钢花盆市场报价天津玻璃钢雕塑效果图宁波玻璃钢名人雕塑福建玻璃钢雕塑厂招聘栾川玻璃钢花盆花器玻璃钢雕塑 有骨架吗安庆人物玻璃钢雕塑设计玻璃钢雕塑欧洲建筑河北玻璃钢景观雕塑报价芜湖玻璃钢校园雕塑设计玻璃钢化妆品雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化