LC算法的基本思想是:计算某个像素在整个图像上的全局对比度,即该像素与图像中其他所有像素在颜色上的距离之和作为该像素的显著值 。
图像
其中
其中N表示图像中像素的数量。
给定一张图像,每个像素
LC算法的代码实现:
1、直接调用OpenCV接口,实现图像中像素的直方图统计,即统计[0,255]中每个灰度值的数量。
#直方图,统计图像中每个灰度值的数量 hist_array=cv2.calcHist([image_gray],[0],None,[256],[0.0,256.0])
2、计算像素与其他所有像素在灰度值上的距离。
defcal_dist(hist): dist={} forgrayinrange(256): value=0.0 forkinrange(256): value =hist[k][0]*abs(gray-k) dist[gray]=value returndist
3、将灰度值图像中的像素值更新为对比度值(即距离度量)。
foriinrange(image_width): forjinrange(image_height): temp=image_gray[j][i] image_gray_copy[j][i]=gray_dist[temp] image_gray_copy=(image_gray_copy-np.min(image_gray_copy))/(np.max(image_gray_copy)-np.min(image_gray_copy))
github上有代码的具体实现:https://github.com/asdfv1929/Saliency_LC_Algorithm
HC算法和LC算法没有本质的区别,HC算法相比于LC算法考虑了彩色信息,而不是像LC那样只用像素的灰度信息,由于彩色图像最多有256*256*256种颜色,因此直接采用基于直方图技术的方案不适用于彩色图片。但是实际上一幅彩色图像并不会用到那么多种颜色,因此提出了降低颜色数量的方案,将RGB各分量分别映射成12等份,则隐射后的图最多只有12*12*12种颜色,这样就可以构造一个较小的直方图用来加速,但是由于过渡量化会对结果带来一定的影响,因此又用了一个平滑的过程。 最后和LC不同的是,对图像处理在Lab空间进行的,而由于Lab空间和RGB并不是完全对应的,其量化过程还是在RGB空间完成的 。
AC算法是基于局部对比度的,采用Lab颜色空间计算距离。AC算法通过计算一个感知单元在不同邻域上的局部对比度来实现多尺度显著性计算。内部区域R1,外部区域R2,计算R1和R2的局部对比度时,通过改变R2的大小实现多尺度显著性计算 。
感知单元R1可以是一个像素或一个像素块,其邻域为R2,(R1)R2所包含的所有像素的特征值的平均值作为(R1)R2的特征值。设像素p为R1和R2的中心,p所在位置局部对比度为:
其中N1和N2分别是R1和R2中像素的个数。vk是k这个位置的特征值或特征向量。
AC方法采用Lab颜色特征,采用欧氏距离计算特征距离。R1默认为一个像素,R2边长为[L/8,L/2]之间的正方形区域,L为长宽中较小者。多个尺度的特征显著图通过直接相加得到完整的显著图。
FT算法从频率角度分析图像。图像在频率域可以分成低频部分和高频部分。低频部分反映了图像的整体信息,如物体的轮廓,基本的组成区域。高频部分反映了图像的细节信息,如物体的纹理。显著性区域检测用到的更多的是低频部分的信息 。在实际进行计算时,FT方法使用窗口5*5的高斯平滑来实现对最高频的舍去。像素的显著性可以用下面公式计算:
其中,
matlab代码实现思路如下:
1、对图像进行5*5的高斯平滑。
2、转换颜色空间。RGB颜色空间转换为CIELAB颜色空间。
3、计算整幅图片的l、a、b的平均值。
4、按照算法中的公式,计算每个像素l、a、b值同图像三个l、a、b均值的欧氏距离。得到显著图
5、归一化。图像中每个像素的显著值除以最大的那个显著值。得到最终的显著图。