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

Posted jukan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单的图像显著性区域特征提取方法-----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.   
  18.     int Dist[256];  
  19.     int Y,X;  
  20.     int max_gray=0;  
  21.     int min_gray=1<<28;  
  22.     for (Y = 0; Y < 256; Y++)  
  23.     {  
  24.         val = 0;  
  25.         for (X = 0; X < 256; X++)   
  26.             val += abs(Y - X) * HistGram[X];                //    论文公式(9),灰度的距离只有绝对值,这里其实可以优化速度,但计算量不大,没必要了  
  27.         Dist[Y] = val;  
  28.         max_gray=max(max_gray,val);  
  29.         min_gray=min(min_gray,val);  
  30.     }  
  31.   
  32.       
  33.     for (Y = 0; Y < row; Y++)  
  34.     {  
  35.         for (X = 0; X < col; X++)  
  36.         {  
  37.             Sal.at<uchar>(Y,X) = (Dist[gray[Y][X]] - min_gray)*255/(max_gray - min_gray);        //    计算全图每个像素的显著性  
  38.             //Sal.at<uchar>(Y,X) = (Dist[gray[Y][X]])*255/(max_gray);        //    计算全图每个像素的显著性  
  39.           
  40.         }  
  41.     }  
  42.     imshow("sal",Sal);  
  43.     waitKey(0);  
  44.   
  45. }  
效果图
技术分享图片
 
 
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.   
  5.     int row=src.rows,col=src.cols;  
  6.     int Sal_org[row][col];  
  7.     memset(Sal_org,0,sizeof(Sal_org));  
  8.       
  9.     Mat Sal=Mat::zeros(src.size(),CV_8UC1 );  
  10.   
  11.     Point3_<uchar>* p;  
  12.     Point3_<uchar>* p1;  
  13.     int val;  
  14.     Mat filter;  
  15.   
  16.     int max_v=0;  
  17.     int min_v=1<<28;  
  18.     for (int k=0;k<Scale;k++){  
  19.         int len=(MaxR2 - MinR2) * k / (Scale - 1) + MinR2;  
  20.         blur(Lab, filter, Size(len,len ));  
  21.         for (int i=0;i<row;i++){  
  22.             for (int j=0;j<col;j++){  
  23.                 p=Lab.ptr<Point3_<uchar> > (i,j);  
  24.                 p1=filter.ptr<Point3_<uchar> > (i,j);  
  25.                 //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) <<" ";  
  26.                   
  27.                 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) );  
  28.                 Sal_org[i][j]+=val;  
  29.                 if(k==Scale-1){  
  30.                     max_v=max(max_v,Sal_org[i][j]);  
  31.                     min_v=min(min_v,Sal_org[i][j]);  
  32.                 }  
  33.             }  
  34.         }  
  35.     }  
  36.       
  37.     cout<<max_v<<" "<<min_v<<endl;  
  38.     int X,Y;  
  39.     for (Y = 0; Y < row; Y++)  
  40.     {  
  41.         for (X = 0; X < col; X++)  
  42.         {  
  43.             Sal.at<uchar>(Y,X) = (Sal_org[Y][X] - min_v)*255/(max_v - min_v);        //    计算全图每个像素的显著性  
  44.             //Sal.at<uchar>(Y,X) = (Dist[gray[Y][X]])*255/(max_gray);        //    计算全图每个像素的显著性  
  45.         }  
  46.     }  
  47.     imshow("sal",Sal);  
  48.     waitKey(0);  
  49. }  

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.   
  5.     int row=src.rows,col=src.cols;  
  6.   
  7.     int Sal_org[row][col];  
  8.     memset(Sal_org,0,sizeof(Sal_org));  
  9.       
  10.     Point3_<uchar>* p;  
  11.   
  12.     int MeanL=0,Meana=0,Meanb=0;  
  13.     for (int i=0;i<row;i++){  
  14.         for (int j=0;j<col;j++){  
  15.             p=Lab.ptr<Point3_<uchar> > (i,j);  
  16.             MeanL+=p->x;  
  17.             Meana+=p->y;  
  18.             Meanb+=p->z;  
  19.         }  
  20.     }  
  21.     MeanL/=(row*col);  
  22.     Meana/=(row*col);  
  23.     Meanb/=(row*col);  
  24.   
  25.     GaussianBlur(Lab,Lab,Size(3,3),0,0);  
  26.   
  27.     Mat Sal=Mat::zeros(src.size(),CV_8UC1 );  
  28.   
  29.     int val;  
  30.   
  31.     int max_v=0;  
  32.     int min_v=1<<28;  
  33.   
  34.     for (int i=0;i<row;i++){  
  35.         for (int j=0;j<col;j++){  
  36.             p=Lab.ptr<Point3_<uchar> > (i,j);  
  37.             val=sqrt( (MeanL - p->x)*(MeanL - p->x)+ (p->y - Meana)*(p->y-Meana) + (p->z - Meanb)*(p->z - Meanb) );  
  38.             Sal_org[i][j]=val;  
  39.             max_v=max(max_v,val);  
  40.             min_v=min(min_v,val);         
  41.         }  
  42.     }  
  43.       
  44.     cout<<max_v<<" "<<min_v<<endl;  
  45.     int X,Y;  
  46.     for (Y = 0; Y < row; Y++)  
  47.     {  
  48.         for (X = 0; X < col; X++)  
  49.         {  
  50.             Sal.at<uchar>(Y,X) = (Sal_org[Y][X] - min_v)*255/(max_v - min_v);        //    计算全图每个像素的显著性  
  51.             //Sal.at<uchar>(Y,X) = (Dist[gray[Y][X]])*255/(max_gray);        //    计算全图每个像素的显著性  
  52.         }  
  53.     }  
  54.     imshow("sal",Sal);  
  55.     waitKey(0);  
  56. }  


技术分享图片

 




以上是关于简单的图像显著性区域特征提取方法-----opencv实现LC,AC,FT的主要内容,如果未能解决你的问题,请参考以下文章

图像局部显著性—点特征

图像的特征提取有哪些算法

数字图像处理图像边缘锐化之微分运算

请问大虾们,opencv如何只对图像选择区域提取特征点

内容感知非监督深度单应估计

图像处理 : 特征提取