https://blog.csdn.net/cai13160674275/article/details/72991049?locationNum=7&fps=1
上文讲了几种简单的方法,显著性检测就是把一幅图像中最吸引人注意的部分提取出来。
我用opencv重写了LC,AC,FT三种算法,代码和效果如下:
1.,后面的方法其实大概都是基于这个实现的,代码样子差不多
LC思路就是利用对某个像素点累加其与全幅像素的距离(欧式距离),然后归一化到0-255,由于是rgb信息,于是用直方图优化,提前计算好每个颜色与其他的距离和
void SalientRegionDetectionBasedonLC(Mat &src){
int HistGram[256]={0};
int row=src.rows,col=src.cols;
int gray[row][col];
//int Sal_org[row][col];
int val;
Mat Sal=Mat::zeros(src.size(),CV_8UC1 );
Point3_* p;
for (int i=0;i
for (int j=0;j
p=src.ptr > (i,j);
val=(p->x + (p->y) *2 + p->z)/4;
HistGram[val]++;
gray[i][j]=val;
}
}
int Dist[256];
int Y,X;
int max_gray=0;
int min_gray=1<<28;
for (Y = 0; Y
{
val = 0;
for (X = 0; X
val += abs(Y - X) * HistGram[X]; // 论文公式(9),灰度的距离只有绝对值,这里其实可以优化速度,但计算量不大,没必要了
Dist[Y] = val;
max_gray=max(max_gray,val);
min_gray=min(min_gray,val);
}
for (Y = 0; Y
{
for (X = 0; X
{
Sal.at(Y,X) = (Dist[gray[Y][X]] - min_gray)*255/(max_gray - min_gray); // 计算全图每个像素的显著性
//Sal.at(Y,X) = (Dist[gray[Y][X]])*255/(max_gray); // 计算全图每个像素的显著性
}
}