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

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信息,于是用直方图优化,提前计算好每个颜色与其他的距离和

[cpp] view plain copy

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

[cpp] view plain copy

  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空间的均值减去当前像素值

[cpp] view plain copy

  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. }

原文地址:https://www.cnblogs.com/jukan/p/9209236.html

时间: 2024-10-07 20:52:47

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

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

laviewpbt  2014.8.4 编辑 Email:[email protected]   QQ:33184777 最近闲来蛋痛,看了一些显著性检测的文章,只是简单的看看,并没有深入的研究,以下将研究的一些收获和经验共享. 先从最简单的最容易实现的算法说起吧: 1. LC算法 参考论文:Visual Attention Detection in Video Sequences Using Spatiotemporal Cues. Yun Zhai and Mubarak Shah.  Pa

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

四种简单的图像显著性区域特征提取方法-----> AC/HC/LC/FT. 分类: 图像处理 2014-08-03 12:40 4088人阅读 评论(4) 收藏 举报 salient region detec显著性检测 laviewpbt  2014.8.3 编辑 Email:[email protected]   QQ:33184777 最近闲来蛋痛,看了一些显著性检测的文章,只是简单的看看,并没有深入的研究,以下将研究的一些收获和经验共享.      先从最简单的最容易实现的算法说起吧: 1

【图像算法】图像特征:三个图像显著性区域特征提取方法

SkySeraph Aug 11st 2011  HQU Email:[email protected]    QQ:452728574 Latest Modified Date:Aug 11st 2011  HQU ------------------------------------------------------------------------------------------------------------------------------- >第一种方法: 原理:Fr

图像局部显著性—点特征

基于古老的Marr视觉理论,视觉识别和场景重建的基础即第一阶段为局部显著性探测.探测到的主要特征为直觉上可刺激底层视觉的局部显著性--特征点.特征线.特征块. SalientDetection 已经好就没有复习过了,DNN在识别领域的超常表现在各个公司得到快速应用,在ML上耗了太多时间,求职时被CV的知识点虐死... 点探测总结(SIft.PCA-SIft.Surf.GLOH)         原文链接(SIFT):http://www.cnblogs.com/cfantaisie/archiv

图像特征提取方法:Bag-of-words

Bag-of-words简介 最初的Bag-of-words ,也叫做"词袋",在信息检索中,Bag-of-words model假定对于一个文本,忽略其词序和语法,句法,将其仅仅看做是一个词集合,或者说是词的一个组合,文本中每个词的出现都是独立的,不依赖于其他词是否出现. 应用于文本的BoW简单实例 John likes to watch movies. Mary likes too. John also likes to watch football games. 根据上述两句话中

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

简单几何图像一般包括点.直线.矩阵.圆.椭圆.多边形等等.首先认识一下opencv对像素点的定义.图像的一个像素点有1或者3个值,对灰度图像有一个灰度值,对彩色图像有3个值组成一个像素值,他们表现出不同的颜色. 那么有了点才能组成各种多边形. (一)首先绘制直线 函数为:cv2.line(img,Point pt1,Point pt2,color,thickness=1,line_type=8 shift=0) 有值的代表有默认值,不用给也行.可以看到这个函数主要接受参数为两个点的坐标,线的颜色

【火炉炼AI】机器学习050-提取图像的Star特征

[火炉炼AI]机器学习050-提取图像的Star特征 (本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 ) 对于图像的特征点,前面我们讨论过边缘检测方法,Harris角点检测算法等,这些检测算法检测的都是图像的轮廓边缘,而不是内部细节,如果要进一步提取图像内部细节方面的特征,需要用到SIFT特征提取器和Star特征提取器.上一篇我们讲解了SIFT特征提取器,下面我们来介绍Star特征提取器.

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

这篇文章是图像显著性领域最具代表性的文章,是在1998年Itti等人提出来的,到目前为止引用的次数超过了5000,是多么可怕的数字,在它的基础上发展起来的有关图像显著性论文更是数不胜数,论文的提出主要是受到灵长类动物早期视觉系统的神经结构和行为所启发而产生了视觉注意系统.灵长类动物具有很强的实时处理复杂场景的能力,视觉信息进行深入的处理之前,对所收集到的感觉信息进行选择,这些选择可能减少场景理解的复杂性,这个选择过程在一个空间有限的视野区域即所谓的注意焦点(focus of attention,

图像特征提取:图像的矩特征

1. 矩的概念 图像识别的一个核心问题是图像的特征提取,简单描述即为用一组简单的数据(图像描述量)来描述整个图像,这组数据越简单越有代表性越好.良好的特征不受光线.噪点.几何形变的干扰.图像识别发展几十年,不断有新的特征提出,而图像不变矩就是其中一个. 矩是概率与统计中的一个概念,是随机变量的一种数字特征.设X为随机变量,c为常数,k为正整数.则量E[(x−c)k]称为X关于c点的k阶矩. 比较重要的有两种情况: 1. c=0.这时ak=E(Xk)称为X的k阶原点矩 2. c=E(X).这时μk