https://blog.csdn.net/cai13160674275/article/details/72991049?locationNum=7&fps=1

四种简单的图像显著性区域特征提取方法-----> AC/HC/LC/FT。

上文讲了几种简单的方法,显著性检测就是把一幅图像中最吸引人注意的部分提取出来。
我用opencv重写了LC,AC,FT三种算法,代码和效果如下:
 
 
1.,后面的方法其实大概都是基于这个实现的,代码样子差不多
LC思路就是利用对某个像素点累加其与全幅像素的距离(欧式距离),然后归一化到0-255,由于是rgb信息,于是用直方图优化,提前计算好每个颜色与其他的距离和
  1. void SalientRegionDetectionBasedonLC(Mat &src){
  2. int HistGram[256]={0};
  3. int row=src.rows,col=src.cols;
  4. int gray[row][col];
  5. //int Sal_org[row][col];
  6. int val;
  7. Mat Sal=Mat::zeros(src.size(),CV_8UC1 );
  8. Point3_<uchar>* p;
  9. for (int i=0;i<row;i++){
  10. for (int j=0;j<col;j++){
  11. p=src.ptr<Point3_<uchar> > (i,j);
  12. val=(p->x + (p->y) *2 + p->z)/4;
  13. HistGram[val]++;
  14. gray[i][j]=val;
  15. }
  16. }
  17. int Dist[256];
  18. int Y,X;
  19. int max_gray=0;
  20. int min_gray=1<<28;
  21. for (Y = 0; Y < 256; Y++)
  22. {
  23. val = 0;
  24. for (X = 0; X < 256; X++)
  25. val += abs(Y - X) * HistGram[X];                //    论文公式(9),灰度的距离只有绝对值,这里其实可以优化速度,但计算量不大,没必要了
  26. Dist[Y] = val;
  27. max_gray=max(max_gray,val);
  28. min_gray=min(min_gray,val);
  29. }
  30. for (Y = 0; Y < row; Y++)
  31. {
  32. for (X = 0; X < col; X++)
  33. {
  34. Sal.at<uchar>(Y,X) = (Dist[gray[Y][X]] - min_gray)*255/(max_gray - min_gray);        //    计算全图每个像素的显著性
  35. //Sal.at<uchar>(Y,X) = (Dist[gray[Y][X]])*255/(max_gray);        //    计算全图每个像素的显著性
  36. }
  37. }
  38. imshow("sal",Sal);
  39. waitKey(0);
  40. }
效果图
 
 

2.AC算法也挺有意思,利用了类似图像金字塔算法,在不同纬度(具体实现是用大小不同的均值滤波器过滤图像)与标准图像做差并累加,然后归一化,实现如下:

  1. void SalientRegionDetectionBasedonAC(Mat &src,int MinR2, int MaxR2,int Scale){
  2. Mat Lab;
  3. cvtColor(src, Lab, CV_BGR2Lab);
  4. int row=src.rows,col=src.cols;
  5. int Sal_org[row][col];
  6. memset(Sal_org,0,sizeof(Sal_org));
  7. Mat Sal=Mat::zeros(src.size(),CV_8UC1 );
  8. Point3_<uchar>* p;
  9. Point3_<uchar>* p1;
  10. int val;
  11. Mat filter;
  12. int max_v=0;
  13. int min_v=1<<28;
  14. for (int k=0;k<Scale;k++){
  15. int len=(MaxR2 - MinR2) * k / (Scale - 1) + MinR2;
  16. blur(Lab, filter, Size(len,len ));
  17. for (int i=0;i<row;i++){
  18. for (int j=0;j<col;j++){
  19. p=Lab.ptr<Point3_<uchar> > (i,j);
  20. p1=filter.ptr<Point3_<uchar> > (i,j);
  21. //cout<<(p->x - p1->x)*(p->x - p1->x)+ (p->y - p1->y)*(p->y-p1->y) + (p->z - p1->z)*(p->z - p1->z) <<" ";
  22. val=sqrt( (p->x - p1->x)*(p->x - p1->x)+ (p->y - p1->y)*(p->y-p1->y) + (p->z - p1->z)*(p->z - p1->z) );
  23. Sal_org[i][j]+=val;
  24. if(k==Scale-1){
  25. max_v=max(max_v,Sal_org[i][j]);
  26. min_v=min(min_v,Sal_org[i][j]);
  27. }
  28. }
  29. }
  30. }
  31. cout<<max_v<<" "<<min_v<<endl;
  32. int X,Y;
  33. for (Y = 0; Y < row; Y++)
  34. {
  35. for (X = 0; X < col; X++)
  36. {
  37. Sal.at<uchar>(Y,X) = (Sal_org[Y][X] - min_v)*255/(max_v - min_v);        //    计算全图每个像素的显著性
  38. //Sal.at<uchar>(Y,X) = (Dist[gray[Y][X]])*255/(max_gray);        //    计算全图每个像素的显著性
  39. }
  40. }
  41. imshow("sal",Sal);
  42. waitKey(0);
  43. }

SalientRegionDetectionBasedonAC(test,test.rows/8,test.rows/2,3);

 
 
3.FT算法
lab空间的均值减去当前像素值
  1. void SalientRegionDetectionBasedonFT(Mat &src){
  2. Mat Lab;
  3. cvtColor(src, Lab, CV_BGR2Lab);
  4. int row=src.rows,col=src.cols;
  5. int Sal_org[row][col];
  6. memset(Sal_org,0,sizeof(Sal_org));
  7. Point3_<uchar>* p;
  8. int MeanL=0,Meana=0,Meanb=0;
  9. for (int i=0;i<row;i++){
  10. for (int j=0;j<col;j++){
  11. p=Lab.ptr<Point3_<uchar> > (i,j);
  12. MeanL+=p->x;
  13. Meana+=p->y;
  14. Meanb+=p->z;
  15. }
  16. }
  17. MeanL/=(row*col);
  18. Meana/=(row*col);
  19. Meanb/=(row*col);
  20. GaussianBlur(Lab,Lab,Size(3,3),0,0);
  21. Mat Sal=Mat::zeros(src.size(),CV_8UC1 );
  22. int val;
  23. int max_v=0;
  24. int min_v=1<<28;
  25. for (int i=0;i<row;i++){
  26. for (int j=0;j<col;j++){
  27. p=Lab.ptr<Point3_<uchar> > (i,j);
  28. val=sqrt( (MeanL - p->x)*(MeanL - p->x)+ (p->y - Meana)*(p->y-Meana) + (p->z - Meanb)*(p->z - Meanb) );
  29. Sal_org[i][j]=val;
  30. max_v=max(max_v,val);
  31. min_v=min(min_v,val);
  32. }
  33. }
  34. cout<<max_v<<" "<<min_v<<endl;
  35. int X,Y;
  36. for (Y = 0; Y < row; Y++)
  37. {
  38. for (X = 0; X < col; X++)
  39. {
  40. Sal.at<uchar>(Y,X) = (Sal_org[Y][X] - min_v)*255/(max_v - min_v);        //    计算全图每个像素的显著性
  41. //Sal.at<uchar>(Y,X) = (Dist[gray[Y][X]])*255/(max_gray);        //    计算全图每个像素的显著性
  42. }
  43. }
  44. imshow("sal",Sal);
  45. waitKey(0);
  46. }

简单的图像显著性区域特征提取方法-----opencv实现LC,AC,FT的更多相关文章

  1. 四种比较简单的图像显著性区域特征提取方法原理及实现-----> AC/HC/LC/FT。

    laviewpbt  2014.8.4 编辑 Email:laviewpbt@sina.com   QQ:33184777 最近闲来蛋痛,看了一些显著性检测的文章,只是简单的看看,并没有深入的研究,以 ...

  2. 四种简单的图像显著性区域特征提取方法-----AC/HC/LC/FT。

    四种简单的图像显著性区域特征提取方法-----> AC/HC/LC/FT. 分类: 图像处理 2014-08-03 12:40 4088人阅读 评论(4) 收藏 举报 salient regio ...

  3. 图像局部显著性—点特征(SURF)

    1999年的SIFT(ICCV 1999,并改进发表于IJCV 2004,本文描述):参考描述:图像特征点描述. 参考原文:SURF特征提取分析 本文有大量删除,如有疑义,请参考原文. SURF对SI ...

  4. 基于qml创建最简单的图像处理程序(3)-使用opencv&qml进行图像处理

    <基于qml创建最简单的图像处理程序>系列课程及配套代码基于qml创建最简单的图像处理程序(1)-基于qml创建界面http://www.cnblogs.com/jsxyhelu/p/83 ...

  5. Python下opencv使用笔记(二)(简单几何图像绘制)

    简单几何图像一般包含点.直线.矩阵.圆.椭圆.多边形等等.首先认识一下opencv对像素点的定义. 图像的一个像素点有1或者3个值.对灰度图像有一个灰度值,对彩色图像有3个值组成一个像素值.他们表现出 ...

  6. 图像局部显著性—点特征(GLOH)

    基于古老的Marr视觉理论,视觉识别和场景重建的基础即第一阶段为局部显著性探测.探测到的主要特征为直觉上可刺激底层视觉的局部显著性--特征点.特征线.特征块. 相关介绍:局部特征显著性-点特征(SIF ...

  7. 图像显著性论文(一)—A Model of saliency Based Visual Attention for Rapid Scene Analysis

    这篇文章是图像显著性领域最具代表性的文章,是在1998年Itti等人提出来的,到目前为止引用的次数超过了5000,是多么可怕的数字,在它的基础上发展起来的有关图像显著性论文更是数不胜数,论文的提出主要 ...

  8. Python用Pillow(PIL)进行简单的图像操作

    Python用Pillow(PIL)进行简单的图像操作 颜色与RGBA值 计算机通常将图像表示为RGB值,或者再加上alpha值(通透度,透明度),称为RGBA值.在Pillow中,RGBA的值表示为 ...

  9. 图像的全局特征--HOG特征、DPM特征

    HOG特征:方向梯度直方图(Histogram of Oriented Gradient,)特征是一种全局图像特征描述子. 它通过计算和统计图像局部区域的梯度方向直方图来构成特征.Hog特征结合SVM ...

随机推荐

  1. Django 框架 基本知识

    一.什么事web框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支持结构,使用框架可以使我们快速开发特定的系统,简单来说,就是讲实现方式的底层结构进行封装,提供相应的 ...

  2. CLR总览

    Contents 第1章CLR的执行模型... 4 1.1将源代码编译成托管代码模块... 4 1.2 将托管模块合并成程序集... 6 1.3加载公共语言运行时... 7 1.4执行程序集的代码.. ...

  3. Elasticsearch5.x批量插入数据(Java)

    先上官方示例代码:官方示例 Java代码: // 批量插入数据 public void InsertBatch() { try { // 设置集群名称 Settings settings = Sett ...

  4. (转载)Spring定时任务的几种实现

    spring框架定时任务 一.分类 从实现的技术上来分类,目前主要有三种技术(或者说有三种产品): Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerT ...

  5. 用xshell 连接docker Linux服务器

    用xshell 连接docker Linux服务器

  6. linux统计文件夹大小

    统计总大小: du -sh dirname 统计文件夹内部各文件大小及总大小: du -h dirname

  7. js异步请求方式

    一.使用defer 例: <script src="XXXXXX.js" defer></script> 二.使用promise 例: get('./moc ...

  8. oracle中实现md5加密

    记得要实现md5加密,在oracle 11g 和 12c中是有不同的方式的,在12c中较为简单,记得直接有预定义的函数. 但是在11g中要实现就需要自己进行一些额外的处理,以下给出一个md5函数的实现 ...

  9. 软工网络15团队作业4——Alpha阶段敏捷冲刺4.0

    软工网络15团队作业4--Alpha阶段敏捷冲刺4.0 1.每天举行站立式会议,提供当天站立式会议照片一张. 2.项目每个成员的昨天进展.存在问题.今天安排. 成员 昨天已完成 今天计划完成 郭炜埕 ...

  10. Cacti的使用

    前期准备 SNMP的安装,控制机和被控机,以及被控机的配置 1.SNMP的安装参考:http://www.cnblogs.com/smallcoderhujin/p/3785731.html 2.被控 ...