FT算法原理
FT算法出自论文:
Frequency-tuned salient region detection
FT算法实现也非常简单,该方法从频率角度分析图像。
图像在频率域可以分成低频部分和高频部分。低频部分反映了图像的整体信息,如物体的轮廓,基本的组成区域。高频部分反映了图像的细节信息,如物体的纹理。显著性区域检测用到的更多的是低频部分的信息。
在实际进行计算时,FT方法使用窗口5*5的高斯平滑来实现对最高频的舍去。像素的显著性可以用下面公式计算:
其中,Iu为图像的平均特征,使用Lab颜色特征,后一项为像素p在高斯平滑后的Lab颜色特征,||.||为L2范式,即计算前一项和后一项在了Lab颜色空间的欧氏距离。
算法实现
FT方法实现简单,只需要高斯平滑和平均值计算。
程序编写:
void FT::calculateSaliencyMap(Mat *src, Mat * dst, bool corlor,int ksize)
{
if (corlor && (*src).channels() == 3) //处理彩色域
{
Mat img3f = (*src);
img3f.convertTo(img3f, CV_32FC3, 1.0 / 255);
Mat sal(img3f.size(), CV_32F), tImg;
GaussianBlur(img3f, tImg, Size(ksize, ksize), 0);//高斯平滑去除高频信息
cvtColor(tImg, tImg, COLOR_BGR2Lab);//转换为LAB颜色空间
Scalar colorM = mean(tImg); //计算整幅图像的LAB颜色均值
//遍历图像
for (int r = 0; r < tImg.rows; r++)
{
float *s = sal.ptr<float>(r);
float *lab = tImg.ptr<float>(r);
for (int c = 0; c < tImg.cols; c++, lab += 3)
//计算每个像素LAB值与LAB均值的差,即为显著性
s[c] = (float)(sqr(colorM[0] - lab[0]) + sqr(colorM[1] - lab[1]) + sqr(colorM[2] - lab[2]));
}
normalize(sal, *dst, 0, 1, NORM_MINMAX);
}
else //灰度域
{
Mat imgf, tImg;
imgf = *src;
if (imgf.channels() == 3)
{
cvtColor(imgf, imgf, COLOR_RGB2GRAY);
}
imgf.convertTo(imgf, CV_32FC1, 1.0 / 255);
Scalar colorM = mean(imgf);
GaussianBlur(imgf, tImg, Size(ksize, ksize), 0);
Mat sal(imgf.size(), CV_32F);
for (int r = 0; r < tImg.rows; r++)
{
float *s = sal.ptr<float>(r);
float *gray = tImg.ptr<float>(r);
for (int c = 0; c < tImg.cols; c++)
s[c] = (colorM[0] - gray[c])*(colorM[0] - gray[c]);
}
normalize(sal, *dst, 0, 1, NORM_MINMAX);
}
}
算法效果
THE END
四个显著性检测算法到此就更完了,这四个是最最最简单的了,但也足够对显著性检测有个认识了。后续打算更图像修复的内容。
除了AC/FT/HC/LC这四个,还有很多经典的显著性检测算法,但不打算写了,这要写啥时候写的完... ...