【手撕算法】HC显著性检测算法
2021/4/19 12:55:18
本文主要是介绍【手撕算法】HC显著性检测算法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
【手撕算法】HC显著性检测算法
前言
HC算法出自程明明老师的论文:
Global Contrast based Salient Region Detection
这个论文一共提到了两种算法,分别是HC与RC。
HC仅仅是考虑了颜色特征,而RC考虑了空间特征。我们上一篇文章介绍的LC算法就是仅考虑了颜色特征。
HC算法和LC算法本质上是没有什么区别的, 但上篇LC算法我们给出代码处理的是灰度图,而HC算法是在LAB颜色空间处理的彩色图。
RC以后再说。
此外我建了一个微信交流群,号主我比较菜,不过群里有厉害的哈哈,欢迎大家进群一起学习昂。
加微信【yanshilin216】备注【加群】。
算法原理
HC算法原理和LC有很多类似之处。最基本的算法思路可以说是完全相同:
该方法只用到了颜色特征。一个像素的显著值是通过与图像中的所有其它像素的色差来定义的。比如方程1:
其中D(Ik,Ii)是空间Lab中两个像素的颜色距离度量,上式经过扩展像素等级变为方程2:
其中N为图像I中的像素数量。
由于测量没考虑空间关系,同样颜色值的像素具有相同的显著值。从具有相同颜色值的像素被组合在一起的角度重新整理方程2,我们就得到每个颜色的显著值如下方程3:
其中,Cl是像素Ik中的颜色值,n是不同像素颜色的数量,fi是图像I中像素颜色Cj出现的频率。
但是按这个写代码同样有很大的时间复杂度,所以添加了两个优化方法以及一个辅助方法。
两个优化:
缩减颜色空间。三通道图像可能的像素值为255255255个。这就导致无法使用直方图来进行加速程序,因此我们将每个通道量化为12个颜色,这样就是121212个可能的像素值。
此外,算法还从图像中筛选出了可以覆盖图像95%像素的颜色值,剩余的5%的颜色值用直方图中的临近像素替代,从而进一步减少可能的颜色值。这样就苦于应用直方图加速了。
一个辅助:
为了达到更好的效果,可以进行一步平滑操作。
一些相似的颜色可能被数量化为不同的值。为了减少这类由于随机性给显著结果引入的噪声,采取一套平滑程序来改善每个颜色的显著值。用相似颜色的显著值加权平均来代替每个颜色(以Lab*距离测量)的显著值。选择m=n/4个最近的颜色作为代表来改善颜色c的显著值,如方程:
算法实现
算法步骤:
- 量化颜色通道。找出图像中一共有多少种颜色以及对应的像素总数。
- 按照像素总数从大到小排序,并同时记录相应颜色。
- 找出像素数目覆盖图像不小于95%的高频颜色,以及其他的不高于5%的颜色种类,假设高频颜色共有maxnum种。
- 把低频颜色的像素归类到与它lab颜色距离相距最近的高频颜色中。
- 在maxnum种颜色中,计算颜色i到所有其他颜色j的颜色距离。并按照距离从小到大排序,记录相应j的颜色种类。
- 按照方程3计算每一种颜色的显著值。根据第5步,可以找到距离颜色i相距最近的m种颜色,从而可以根据方程4计算每种颜色显著值,即最终的显著值。
- 为图像中每一个像素分配显著值。像素(i,j)是什么颜色,就赋予它相应颜色的显著值。
- 至此,显著图生成。进行归一化、线性空间滤波。
算法实现:
这个算法一共200来行,,就不贴这儿有碍观瞻了吧,放微信群了。
看看算法效果。
算法效果
THE END
今天就到这里啦,微信搜索【Opencv视觉实践】,对【计算机视觉/机器视觉】算法和软件开发感兴趣的小伙伴可以一起来学习呀。
关注后 后台回复
【电子书资源】可以领取10G计算机视觉/软件开发相关电子书
【手撕算法代码】可以领取手撕算法系列专栏的所有代码和PDF版论文
【加群】可以加入我们的视觉算法靓仔群~
这篇关于【手撕算法】HC显著性检测算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享