【手撕算法】AC显著性检测算法
2021/4/19 12:55:21
本文主要是介绍【手撕算法】AC显著性检测算法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
【手撕算法】AC显著性检测算法
算法原理
论文名称:
Salient Region Detection and Segmentation
AC算法同样是计算每个像素的显著值,但却不是基于全局对比度,而是基于一定尺度的感知单元的。而且整个AC算法是融合了多个不同尺度的感知单元计算的显著值得到的最终显著图。
如上图,R1为当前像素,计算当前像素的显著值,需要计算该像素LAB三个通道的特征值与R2区域(上图为5*5)所有像素特征值的均值的差。
而R2区域的半径是可变的,算法设定R2区域的大小范围:
MinR2 = Min(Width, Height) / 8 最小为1/8
MaxR2 = Min(Width, Height) / 2 最大为1/2
在这个范围内等分为3份,也就是三个尺度,分别计算这三个尺度下的显著图,并相加,得到最终的显著图。如下图:
a为原图,b为三个不同尺度得到的显著图,c为加和后的显著图,d为抠图结果。
算法实现
算法步骤:
- 分别取三个不同尺度的R2
- 计算该三个R2区域的均值
- 计算图片每个像素每个尺度下的特征值
- 不同尺度的显著图叠加,得到最终显著图
算法代码:
void AC::calculateSaliencyMap(Mat *src, Mat * dst) { Mat img3f; (*src).convertTo(img3f, CV_32FC3, 1.0 / 255);//归一化在0-1之间表示统计的概率分布 // 存储显著性图 内部区域R1的均值 外部区域R2的均值 Mat sal(img3f.size(), CV_32F), MeanR1, MeanR2; GaussianBlur(img3f, MeanR1, Size(3, 3), -1);//高斯平滑 cvtColor(MeanR1, MeanR1, COLOR_BGR2Lab);//转LAB颜色空间 int Width = img3f.cols, Height = img3f.rows; int R1 = 0, Scale = 3; //计算MeanR1 if (R1 > 0) //如果R1=0,则表示就取原始像素 { blur(MeanR1, MeanR1, Size(R1, R1), Point(-1, -1)); } int MinR2 = min(Width, Height) / 8, MaxR2 = min(Width, Height)/2; for (int Z = 0; Z < Scale; Z++)//分3个尺度Scale进行计算 { MeanR1.copyTo(MeanR2); int radius = (MaxR2 - MinR2) * Z / (Scale - 1) + MinR2; //当前尺度半径 if (radius % 2 == 0)//如果半径为偶数,则加1变奇数 radius++; //计算MeanR2 blur(MeanR2, MeanR2, Size(radius, radius), Point(-1, -1)); //遍历像素值计算像素的显著性 for (int r = 0; r < Height; r++) { float *s = sal.ptr<float>(r); float *lab = MeanR1.ptr<float>(r); float *lab2 = MeanR2.ptr<float>(r); for (int c = 0; c < Width; c++, lab += 3, lab2 += 3) { //三个尺度累加到s[]显著性图中 s[c] += sqrt((float)(sqr((lab2[0] - lab[0])) + sqr((lab2[1] - lab[1])) + sqr((lab2[2] - lab[2])))); } } } //归一化操作 normalize(sal, *dst, 0, 1, NORM_MINMAX); }
算法效果
THE END
今天就到这里啦,微信搜索【Opencv视觉实践】,对【计算机视觉/机器视觉】算法和软件开发感兴趣的小伙伴可以一起来学习呀。
关注后 后台回复
【电子书资源】可以领取10G计算机视觉/软件开发相关电子书
【手撕算法代码】可以领取手撕算法系列专栏的所有代码和PDF版论文
【加群】可以加入我们的视觉算法靓仔群~
这篇关于【手撕算法】AC显著性检测算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 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专业技术文章分享