Commit a1aa3696 authored by jaco's avatar jaco

Spectral Residual Saliency added

parent 37f38854
...@@ -95,7 +95,9 @@ class CV_EXPORTS_W StaticSaliency : public virtual Saliency ...@@ -95,7 +95,9 @@ class CV_EXPORTS_W StaticSaliency : public virtual Saliency
Params(); Params();
}; };
//protected: bool computeBinaryMap( const Mat& saliencyMap, Mat& outputMat );
//protected:
//virtual bool computeSaliencyImpl( const Mat& image, Mat& saliencyMap ) = 0; //virtual bool computeSaliencyImpl( const Mat& image, Mat& saliencyMap ) = 0;
private: private:
...@@ -111,7 +113,7 @@ class CV_EXPORTS_W MotionSaliency : public virtual Saliency ...@@ -111,7 +113,7 @@ class CV_EXPORTS_W MotionSaliency : public virtual Saliency
Params(); Params();
}; };
//protected: //protected:
//virtual bool computeSaliencyImpl( const Mat& image, Mat& saliencyMap ) = 0; //virtual bool computeSaliencyImpl( const Mat& image, Mat& saliencyMap ) = 0;
private: private:
...@@ -128,7 +130,7 @@ class CV_EXPORTS_W Objectness : public virtual Saliency ...@@ -128,7 +130,7 @@ class CV_EXPORTS_W Objectness : public virtual Saliency
}; };
// protected: // protected:
// virtual bool computeSaliencyImpl( const Mat& image, Mat& saliencyMap ) = 0; // virtual bool computeSaliencyImpl( const Mat& image, Mat& saliencyMap ) = 0;
private: private:
Params params; Params params;
......
...@@ -65,6 +65,7 @@ class CV_EXPORTS_W StaticSaliencySpectralResidual : public StaticSaliency ...@@ -65,6 +65,7 @@ class CV_EXPORTS_W StaticSaliencySpectralResidual : public StaticSaliency
struct CV_EXPORTS Params struct CV_EXPORTS Params
{ {
Params(); Params();
Size resizedImageSize;
void read( const FileNode& fn ); void read( const FileNode& fn );
void write( FileStorage& fs ) const; void write( FileStorage& fs ) const;
}; };
...@@ -75,7 +76,7 @@ class CV_EXPORTS_W StaticSaliencySpectralResidual : public StaticSaliency ...@@ -75,7 +76,7 @@ class CV_EXPORTS_W StaticSaliencySpectralResidual : public StaticSaliency
void write( FileStorage& fs ) const; void write( FileStorage& fs ) const;
protected: protected:
bool computeKmeans( Mat& saliencyMap, Mat& outputMat );
bool computeSaliencyImpl( const Mat& src, Mat& dst ); bool computeSaliencyImpl( const Mat& src, Mat& dst );
AlgorithmInfo* info() const; AlgorithmInfo* info() const;
......
/*M///////////////////////////////////////////////////////////////////////////////////////
//
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
// By downloading, copying, installing or using the software you agree to this license.
// If you do not agree to this license, do not download, install,
// copy or use the software.
//
//
// License Agreement
// For Open Source Computer Vision Library
//
// Copyright (C) 2013, OpenCV Foundation, all rights reserved.
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistribution's of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistribution's in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// * The name of the copyright holders may not be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the Intel Corporation or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/
#include "precomp.hpp"
namespace cv
{
/**
* StaticSaliency
*/
/**
* Parameters
*/
StaticSaliency::Params::Params()
{
}
bool StaticSaliency::computeBinaryMap( const Mat& saliencyMap, Mat& BinaryMap )
{
Mat labels = Mat::zeros( saliencyMap.rows * saliencyMap.cols, 1, 1 );
Mat samples = Mat_<float>( saliencyMap.rows * saliencyMap.cols, 1 );
Mat centers;
TermCriteria terminationCriteria;
terminationCriteria.epsilon = 0.2;
terminationCriteria.maxCount = 1000;
terminationCriteria.type = TermCriteria::COUNT + TermCriteria::EPS;
int elemCounter = 0;
for ( int i = 0; i < saliencyMap.rows; i++ )
{
for ( int j = 0; j < saliencyMap.cols; j++ )
{
samples.at<float>( elemCounter, 0 ) = saliencyMap.at<float>( i, j );
elemCounter++;
}
}
kmeans( samples, 5, labels, terminationCriteria, 5, KMEANS_RANDOM_CENTERS, centers );
Mat outputMat = Mat_<float>( saliencyMap.size() );
int intCounter = 0;
for ( int x = 0; x < saliencyMap.rows; x++ )
{
for ( int y = 0; y < saliencyMap.cols; y++ )
{
outputMat.at<float>( x, y ) = centers.at<float>( labels.at<int>( intCounter, 0 ), 0 );
intCounter++;
}
}
// adaptative thresholding using Otsu's method, to make saliency map binary
threshold( outputMat, BinaryMap, 0, 255, THRESH_BINARY | THRESH_OTSU );
return true;
}
}/* namespace cv */
...@@ -54,7 +54,7 @@ namespace cv ...@@ -54,7 +54,7 @@ namespace cv
StaticSaliencySpectralResidual::Params::Params() StaticSaliencySpectralResidual::Params::Params()
{ {
resizedImageSize=Size(64,64);
} }
StaticSaliencySpectralResidual::StaticSaliencySpectralResidual( const StaticSaliencySpectralResidual::Params &parameters ) : StaticSaliencySpectralResidual::StaticSaliencySpectralResidual( const StaticSaliencySpectralResidual::Params &parameters ) :
...@@ -78,69 +78,30 @@ void StaticSaliencySpectralResidual::write( cv::FileStorage& fs ) const ...@@ -78,69 +78,30 @@ void StaticSaliencySpectralResidual::write( cv::FileStorage& fs ) const
params.write( fs ); params.write( fs );
} }
bool StaticSaliencySpectralResidual::computeKmeans( Mat& saliencyMap, Mat& outputMat )
{
Mat labels = Mat::zeros( saliencyMap.rows * saliencyMap.cols, 1, 1 );
Mat samples = Mat_<float>( saliencyMap.rows * saliencyMap.cols, 1 );
Mat centers;
TermCriteria terminationCriteria;
terminationCriteria.epsilon = 0.2;
terminationCriteria.maxCount = 1000;
terminationCriteria.type = TermCriteria::COUNT + TermCriteria::EPS;
int elemCounter = 0;
for ( int i = 0; i < saliencyMap.rows; i++ )
{
for ( int j = 0; j < saliencyMap.cols; j++ )
{
samples.at<float>( elemCounter, 0 ) = saliencyMap.at<float>( i, j );
elemCounter++;
}
}
kmeans( samples, 5, labels, terminationCriteria, 5, KMEANS_RANDOM_CENTERS, centers );
outputMat = Mat_<float>( saliencyMap.size() );
int intCounter = 0;
for ( int x = 0; x < saliencyMap.rows; x++ )
{
for ( int y = 0; y < saliencyMap.cols; y++ )
{
outputMat.at<float>( x, y ) = centers.at<float>( labels.at<int>( intCounter, 0 ), 0 );
intCounter++;
}
}
return true;
}
bool StaticSaliencySpectralResidual::computeSaliencyImpl( const Mat& image, Mat& saliencyMap ) bool StaticSaliencySpectralResidual::computeSaliencyImpl( const Mat& image, Mat& saliencyMap )
{ {
Mat grayTemp, grayDown; Mat grayTemp, grayDown;
std::vector<Mat> mv; std::vector<Mat> mv;
Size imageSize( 64, 64 ); Mat realImage( params.resizedImageSize, CV_64F );
Mat realImage( imageSize, CV_64F ); Mat imaginaryImage( params.resizedImageSize, CV_64F );
Mat imaginaryImage( imageSize, CV_64F );
imaginaryImage.setTo( 0 ); imaginaryImage.setTo( 0 );
Mat combinedImage( imageSize, CV_64FC2 ); Mat combinedImage( params.resizedImageSize, CV_64FC2 );
Mat imageDFT; Mat imageDFT;
Mat logAmplitude; Mat logAmplitude;
Mat angle( imageSize, CV_64F ); Mat angle( params.resizedImageSize, CV_64F );
Mat magnitude( imageSize, CV_64F ); Mat magnitude( params.resizedImageSize, CV_64F );
Mat logAmplitude_blur, imageGR; Mat logAmplitude_blur, imageGR;
if( image.channels() == 3 ) if( image.channels() == 3 )
{ {
cvtColor( image, imageGR, COLOR_BGR2GRAY ); cvtColor( image, imageGR, COLOR_BGR2GRAY );
resize( imageGR, grayDown, imageSize, 0, 0, INTER_LINEAR ); resize( imageGR, grayDown, params.resizedImageSize, 0, 0, INTER_LINEAR );
} }
else else
{ {
resize( image, grayDown, imageSize, 0, 0, INTER_LINEAR ); resize( image, grayDown, params.resizedImageSize, 0, 0, INTER_LINEAR );
} }
grayDown.convertTo( realImage, CV_64F ); grayDown.convertTo( realImage, CV_64F );
...@@ -176,17 +137,15 @@ bool StaticSaliencySpectralResidual::computeSaliencyImpl( const Mat& image, Mat& ...@@ -176,17 +137,15 @@ bool StaticSaliencySpectralResidual::computeSaliencyImpl( const Mat& image, Mat&
resize( magnitude, saliencyMap, image.size(), 0, 0, INTER_LINEAR ); resize( magnitude, saliencyMap, image.size(), 0, 0, INTER_LINEAR );
// CLUSTERING BY K-MEANS #ifdef SALIENCY_DEBUG
Mat outputMat; // visualize saliency map before and after K-means
computeKmeans( saliencyMap, outputMat );
imshow( "Saliency Map", saliencyMap ); imshow( "Saliency Map", saliencyMap );
imshow( "K-mean", outputMat ); #endif
// FINE CLUSTERING //TODO try the results and then delete
outputMat = outputMat * 255; /*outputMat = outputMat * 255;
outputMat.convertTo( outputMat, CV_8U ); outputMat.convertTo( outputMat, CV_8U );
saliencyMap = outputMat; saliencyMap = outputMat; */
return true; return true;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment