C/C++教程

【手撕算法】HC显著性检测算法

本文主要是介绍【手撕算法】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的显著值,如方程:

图片

算法实现

算法步骤:

  1. 量化颜色通道。找出图像中一共有多少种颜色以及对应的像素总数。
  2. 按照像素总数从大到小排序,并同时记录相应颜色。
  3. 找出像素数目覆盖图像不小于95%的高频颜色,以及其他的不高于5%的颜色种类,假设高频颜色共有maxnum种。
  4. 把低频颜色的像素归类到与它lab颜色距离相距最近的高频颜色中。
  5. 在maxnum种颜色中,计算颜色i到所有其他颜色j的颜色距离。并按照距离从小到大排序,记录相应j的颜色种类。
  6. 按照方程3计算每一种颜色的显著值。根据第5步,可以找到距离颜色i相距最近的m种颜色,从而可以根据方程4计算每种颜色显著值,即最终的显著值。
  7. 为图像中每一个像素分配显著值。像素(i,j)是什么颜色,就赋予它相应颜色的显著值。
  8. 至此,显著图生成。进行归一化、线性空间滤波。

算法实现:

这个算法一共200来行,,就不贴这儿有碍观瞻了吧,放微信群了。

看看算法效果。

算法效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

THE END

今天就到这里啦,微信搜索【Opencv视觉实践】,对【计算机视觉/机器视觉】算法和软件开发感兴趣的小伙伴可以一起来学习呀。

关注后 后台回复

【电子书资源】可以领取10G计算机视觉/软件开发相关电子书

【手撕算法代码】可以领取手撕算法系列专栏的所有代码和PDF版论文

【加群】可以加入我们的视觉算法靓仔群~

这篇关于【手撕算法】HC显著性检测算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!