|
|
¡¾´ð°¸¡¿Ó¦Öú»ØÌû
¡ï jjdg: ½ð±Ò+1, ¸Ðл²ÎÓë 2012-10-24 10:13:25
³ß¶È¿Õ¼äÀíÂÛ
×ÔÈ»½çÖеÄÎïÌåËæ×Ź۲â³ß¶È²»Í¬Óв»Í¬µÄ±íÏÖÐÎ̬¡£ÀýÈçÎÒÃÇÐÎÈݽ¨ÖþÎïÓá°Ãס±£¬¹Û²â·Ö×Ó¡¢Ô×ÓµÈÓá°ÄÉÃס±¡£¸üÐÎÏóµÄÀý×Ó±ÈÈçGoogleµØÍ¼£¬»¬¶¯Êó±êÂÖ¿ÉÒԸıä¹Û²âµØÍ¼µÄ³ß¶È£¬¿´µ½µÄµØÍ¼»æÖÆÒ²²»Í¬£»»¹ÓеçÓ°ÖеÄÀÉ쾵ͷµÈµÈ¡¡
³ß¶È¿Õ¼äÖи÷³ß¶ÈͼÏñµÄÄ£ºý³Ì¶ÈÖð½¥±ä´ó£¬Äܹ»Ä£ÄâÈËÔÚ¾àÀëÄ¿±êÓɽüµ½Ô¶Ê±Ä¿±êÔÚÊÓÍøÄ¤ÉϵÄÐγɹý³Ì¡£
³ß¶ÈÔ½´óͼÏñԽģºý¡£
ΪʲôҪÌÖÂ۳߶ȿռ䣿
ÓûúÆ÷ÊÓ¾õϵͳ·ÖÎöδ֪³¡¾°Ê±£¬¼ÆËã»ú²¢²»Ô¤ÏÈÖªµÀͼÏñÖÐÎïÌåµÄ³ß¶È¡£ÎÒÃÇÐèҪͬʱ¿¼ÂÇͼÏñÔÚ¶à³ß¶ÈϵÄÃèÊö£¬»ñÖª¸ÐÐËȤÎïÌåµÄ×î¼Ñ³ß¶È¡£ÁíÍâÈç¹û²»Í¬µÄ³ß¶È϶¼ÓÐͬÑùµÄ¹Ø¼üµã£¬ÄÇôÔÚ²»Í¬µÄ³ß¶ÈµÄÊäÈëͼÏñϾͶ¼¿ÉÒÔ¼ì²â³öÀ´¹Ø¼üµãÆ¥Å䣬Ҳ¾ÍÊdz߶Ȳ»±äÐÔ¡£
ͼÏñµÄ³ß¶È¿Õ¼ä±í´ï¾ÍÊÇͼÏñÔÚËùÓг߶ÈϵÄÃèÊö¡£
³ß¶È¿Õ¼ä±í´ïÓë½ð×ÖËþ¶à·Ö±æÂʱí´ï
¸ß˹ģºý
¸ß˹ºËÊÇΨһ¿ÉÒÔ²úÉú¶à³ß¶È¿Õ¼äµÄºË£¨¡¶Scale-space theory: A basic tool for analysing structures at different scales¡·£©¡£Ò»¸öͼÏñµÄ³ß¶È¿Õ¼äL(x,y,¦Ò) ,¶¨ÒåΪÔʼͼÏñI(x,y)ÓëÒ»¸ö¿É±ä³ß¶ÈµÄ2ά¸ß˹º¯ÊýG(x,y,¦Ò)¾í»ýÔËËã¡£
¶þά¿Õ¼ä¸ß˹º¯Êý£º
³ß¶È¿Õ¼ä£º
³ß¶ÈÊÇ×ÔÈ»¿Í¹Û´æÔڵ쬲»ÊÇÖ÷¹Û´´ÔìµÄ¡£¸ß˹¾í»ýÖ»ÊDZíÏֳ߶ȿռäµÄÒ»ÖÖÐÎʽ¡£
¶þά¿Õ¼ä¸ß˹º¯ÊýÊǵȸßÏß´ÓÖÐÐijÉÕýÌ«·Ö²¼µÄͬÐÄÔ²£º
·Ö²¼²»ÎªÁãµÄµã×é³É¾í»ýÕóÓëÔʼͼÏñ×ö±ä»»£¬¼´Ã¿¸öÏñËØÖµÊÇÖÜΧÏàÁÚÏñËØÖµµÄ¸ß˹ƽ¾ù¡£Ò»¸ö5*5µÄ¸ß˹ģ°æÈçÏÂËùʾ£º
¸ß˹ģ°æÊÇÔ²¶Ô³ÆµÄ£¬ÇÒ¾í»ýµÄ½á¹ûʹÔʼÏñËØÖµÓÐ×î´óµÄÈ¨ÖØ£¬¾àÀëÖÐÐÄÔ½Ô¶µÄÏàÁÚÏñËØÖµÈ¨ÖØÒ²Ô½Ð¡¡£
ÔÚʵ¼ÊÓ¦ÓÃÖУ¬ÔÚ¼ÆËã¸ß˹º¯ÊýµÄÀëÉ¢½üËÆÊ±£¬ÔÚ´ó¸Å3¦Ò¾àÀëÖ®ÍâµÄÏñËØ¶¼¿ÉÒÔ¿´×÷²»Æð×÷Óã¬ÕâЩÏñËØµÄ¼ÆËãÒ²¾Í¿ÉÒÔºöÂÔ¡£ËùÒÔ£¬Í¨³£³ÌÐòÖ»¼ÆËã(6¦Ò+1)*(6¦Ò+1)¾Í¿ÉÒÔ±£Ö¤Ïà¹ØÏñËØÓ°Ïì¡£
¸ß˹ģºýÁíÒ»¸öºÜÀ÷º¦µÄÐÔÖʾÍÊÇÏßÐÔ¿É·Ö£ºÊ¹Óöþά¾ØÕó±ä»»µÄ¸ß˹ģºý¿ÉÒÔͨ¹ýÔÚˮƽºÍÊúÖ±·½Ïò¸÷½øÐÐһά¸ß˹¾ØÕó±ä»»Ïà¼ÓµÃµ½¡£
O(N^2*m*n)´Î³Ë·¨¾ÍËõ¼õ³ÉÁËO(N*m*n)+O(N*m*n)´Î³Ë·¨¡££¨NΪ¸ß˹ºË´óС£¬m,nΪ¶þάͼÏñ¸ßºÍ¿í£©
Æäʵ¸ß˹ÕâÒ»²¿·ÖÖ»ÐèÒª¼òµ¥Á˽â¾Í¿ÉÒÔÁË£¬ÔÚOpenCVÒ²Ö»ÐèÒªÒ»¾ä´úÂ룺
[cpp] view plaincopy
GaussianBlur(dbl, dbl, Size(), sig_diff, sig_diff);
ÎÒÕâÀïÏêдÁËÒ»ÏÂÊÇÒòΪÕâ¿é¶ù¶Ô·ÖÎöË㷨ЧÂʱȽÏÓÐÓ㬶øÇÒ¸ß˹ģºýµÄËã·¨ÕæµÄºÜƯÁÁ~
½ð×ÖËþ¶à·Ö±æÂÊ
½ð×ÖËþÊÇÔçÆÚͼÏñ¶à³ß¶ÈµÄ±íʾÐÎʽ¡£Í¼Ïñ½ð×ÖËþ»¯Ò»°ã°üÀ¨Á½¸ö²½Ö裺ʹÓõÍͨÂ˲¨Æ÷ƽ»¬Í¼Ïñ£»¶Ôƽ»¬Í¼Ïñ½øÐнµ²ÉÑù£¨Í¨³£ÊÇˮƽ£¬ÊúÖ±·½Ïò1/2£©£¬´Ó¶øµÃµ½Ò»ÏµÁгߴçËõСµÄͼÏñ¡£
ÉÏͼÖУ¨a£©ÊǶÔÔʼÐźŽøÐеÍͨÂ˲¨£¬£¨b£©Êǽµ²ÉÑùµÃµ½µÄÐźš£
¶ø¶ÔÓÚ¶þάͼÏñ£¬Ò»¸ö´«Í³µÄ½ð×ÖËþÖУ¬Ã¿Ò»²ãͼÏñÓÉÉÏÒ»²ã·Ö±æÂʵij¤¡¢¿í¸÷Ò»°ë£¬Ò²¾ÍÊÇËÄ·ÖÖ®Ò»µÄÏñËØ×é³É£º
¶à³ß¶ÈºÍ¶à·Ö±æÂÊ
³ß¶È¿Õ¼ä±í´ïºÍ½ð×ÖËþ¶à·Ö±æÂʱí´ïÖ®¼ä×î´óµÄ²»Í¬ÊÇ£º
³ß¶È¿Õ¼ä±í´ïÊÇÓɲ»Í¬¸ß˹ºËƽ»¬¾í»ýµÃµ½£¬ÔÚËùÓг߶ÈÉÏÓÐÏàͬµÄ·Ö±æÂÊ£»
¶ø½ð×ÖËþ¶à·Ö±æÂʱí´ïÿ²ã·Ö±æÂʼõÉٹ̶¨±ÈÂÊ¡£
ËùÒÔ£¬½ð×ÖËþ¶à·Ö±æÂÊÉú³É½Ï¿ì£¬ÇÒÕ¼Óô洢¿Õ¼äÉÙ£»¶ø¶à³ß¶È±í´ïËæ×ų߶ȲÎÊýµÄÔö¼ÓÈßÓàÐÅÏ¢Ò²±ä¶à¡£
¶à³ß¶È±í´ïµÄÓŵãÔÚÓÚͼÏñµÄ¾Ö²¿ÌØÕ÷¿ÉÒÔÓüòµ¥µÄÐÎʽÔÚ²»Í¬³ß¶ÈÉÏÃèÊö£»¶ø½ð×ÖËþ±í´ïûÓÐÀíÂÛ»ù´¡£¬ÄÑÒÔ·ÖÎöͼÏñ¾Ö²¿ÌØÕ÷¡£
DoG£¨Difference of Gaussian£©
¸ß˹ÀÆÕÀ˹LoG½ð×ÖËþ
½áºÏ³ß¶È¿Õ¼ä±í´ïºÍ½ð×ÖËþ¶à·Ö±æÂʱí´ï£¬¾ÍÊÇÔÚʹÓó߶ȿռäʱʹÓýð×ÖËþ±íʾ£¬Ò²¾ÍÊǼÆËã»úÊÓ¾õÖÐ×îÓÐÃûµÄÀÆÕÀ˹½ð×ÓËþ£¨¡¶The Laplacian pyramid as a compact image code¡·£©¡£
¸ß˹ÀÆÕÀ˹LoG£¨Laplace of Guassian£©Ëã×Ó¾ÍÊǶԸß˹º¯Êý½øÐÐÀÆÕÀ˹±ä»»£º
ºËÐÄ˼Ï뻹ÊǸß˹£¬Õâ¸ö²»¶àÐðÊö¡£
¸ß˹²î·ÖDoG½ð×ÖËþ
DoG£¨Difference of Gaussian£©ÆäʵÊǶԸß˹ÀÆÕÀ˹LoGµÄ½üËÆ£¬Ò²¾ÍÊǶԵĽüËÆ¡£SIFTËã·¨½¨Ò飬ÔÚijһ³ß¶ÈÉϵÄÌØÕ÷¼ì²â¿ÉÒÔͨ¹ý¶ÔÁ½¸öÏàÁÚ¸ß˹³ß¶È¿Õ¼äµÄͼÏñÏà¼õ£¬µÃµ½DoGµÄÏìӦֵͼÏñD(x,y,¦Ò)¡£È»ºó·ÂÕÕLoG·½·¨£¬Í¨¹ý¶ÔÏìӦֵͼÏñD(x,y,¦Ò)½øÐоֲ¿×î´óÖµËÑË÷£¬ÔÚ¿Õ¼äλÖúͳ߶ȿռ䶨λ¾Ö²¿ÌØÕ÷µã¡£ÆäÖУº
kΪÏàÁÚÁ½¸ö³ß¶È¿Õ¼ä±¶ÊýµÄ³£Êý¡£
ÉÏͼÖУ¨a£©ÊÇDoGµÄÈýάͼ£¬£¨b£©ÊÇDoGÓëLoGµÄ¶Ô±È¡£
½ð×ÖËþ¹¹½¨
¹¹½¨¸ß˹½ð×ÖËþ
ΪÁ˵õ½DoGͼÏñ£¬ÏÈÒª¹¹Ôì¸ß˹½ð×ÖËþ¡£ÎÒÃǻعýÍ·À´¼ÌÐøËµ¸ß˹½ð×ÖËþ~
¸ß˹½ð×ÖËþÔÚ¶à·Ö±æÂʽð×ÖËþ¼òµ¥½µ²ÉÑù»ù´¡ÉϼÓÁ˸ß˹Â˲¨£¬Ò²¾ÍÊǶԽð×ÖËþÿ²ãͼÏñÓò»Í¬²ÎÊýµÄ¦Ò×ö¸ß˹ģºý£¬Ê¹µÃÿ²ã½ð×ÖËþÓжàÕŸß˹ģºýͼÏñ¡£½ð×ÖËþÿ²ã¶àÕÅͼÏñºÏ³ÆÎªÒ»×飨Octave£©£¬Ã¿×éÓжàÕÅ£¨Ò²½Ð²ãInterval£©Í¼Ïñ¡£ÁíÍ⣬½µ²ÉÑùʱ£¬½ð×ÖËþÉϱßÒ»×éͼÏñµÄµÚÒ»ÕÅͼÏñ£¨×îµ×²ãµÄÒ»ÕÅ£©ÊÇÓÉǰһ×飨½ð×ÖËþÏÂÃæÒ»×飩ͼÏñµÄµ¹ÊýµÚÈýÕŸôµã²ÉÑùµÃµ½¡£
ÒÔÏÂÊÇOpenCVÖй¹½¨¸ß˹½ð×ÖËþµÄ´úÂ룬ÎÒ¼ÓÁËÏàÓ¦µÄ×¢ÊÍ£º
[cpp] view plaincopy
// ¹¹½¨nOctaves×飨ÿ×énOctaves+3²ã£©¸ß˹½ð×ÖËþ
void SIFT::buildGaussianPyramid( const Mat& base, vector& pyr, int nOctaves ) const
{
vector sig(nOctaveLayers + 3);
pyr.resize(nOctaves*(nOctaveLayers + 3));
// precompute Gaussian sigmas using the following formula:
// \sigma_{total}^2 = \sigma_{i}^2 + \sigma_{i-1}^2¡¢
// ¼ÆËã¶ÔͼÏñ×ö²»Í¬³ß¶È¸ß˹ģºýµÄ³ß¶ÈÒò×Ó
sig[0] = sigma;
double k = pow( 2., 1. / nOctaveLayers );
for( int i = 1; i < nOctaveLayers + 3; i++ )
{
double sig_prev = pow(k, (double)(i-1))*sigma;
double sig_total = sig_prev*k;
sig = std::sqrt(sig_total*sig_total - sig_prev*sig_prev);
}
for( int o = 0; o < nOctaves; o++ )
{
// DoG½ð×ÓËþÐèÒªnOctaveLayers+2²ãͼÏñÀ´¼ì²ânOctaves²ã³ß¶È
// ËùÒÔ¸ß˹½ð×ÖËþÐèÒªnOctaveLayers+3²ãͼÏñµÃµ½nOctaveLayers+2²ãDoG½ð×ÖËþ
for( int i = 0; i < nOctaveLayers + 3; i++ )
{
// dstΪµÚo×飨Octave£©½ð×ÖËþ
Mat& dst = pyr[o*(nOctaveLayers + 3) + i];
// µÚ0×éµÚ0²ãΪÔʼͼÏñ
if( o == 0 && i == 0 )
dst = base;
// base of new octave is halved image from end of previous octave
// ÿһ×éµÚ0¸±Í¼ÏñʱÉÏÒ»×éµ¹ÊýµÚÈý·ùͼÏñ¸ôµã²ÉÑùµÃµ½
else if( i == 0 )
{
const Mat& src = pyr[(o-1)*(nOctaveLayers + 3) + nOctaveLayers];
resize(src, dst, Size(src.cols/2, src.rows/2),
0, 0, INTER_NEAREST);
}
// ÿһ×éµÚi¸±Í¼ÏñÊÇÓɵÚi-1¸±Í¼Ïñ½øÐÐsigµÄ¸ß˹ģºýµÃµ½
// Ò²¾ÍÊDZ¾×éͼÏñÔÚsigµÄ³ß¶È¿Õ¼äϵÄͼÏñ
else
{
const Mat& src = pyr[o*(nOctaveLayers + 3) + i-1];
GaussianBlur(src, dst, Size(), sig, sig);
}
}
}
}
¸ß˹½ð×ÖËþµÄ×éÊýΪ£º
´úÂë10-17ÐÐÊǼÆËã¸ß˹ģºýµÄϵÊý¦Ò£¬¾ßÌå¹ØÏµÈçÏ£º
ÆäÖУ¬¦ÒΪ³ß¶È¿Õ¼ä×ø±ê£¬sΪÿ×éÖвã×ø±ê£¬¦Ò0Ϊ³õʼ³ß¶È£¬SΪÿ×é²ãÊý£¨Ò»°ãΪ3~5£©¡£¸ù¾ÝÕâ¸ö¹«Ê½£¬ÎÒÃÇ¿ÉÒԵõ½½ð×ÖËþ×éÄÚ¸÷²ã³ß¶ÈÒÔ¼°×é¼ä¸÷ͼÏñ³ß¶È¹ØÏµ¡£
×éÄÚÏàÁÚͼÏñ³ß¶È¹ØÏµ£º
ÏàÁÚ×é¼ä³ß¶È¹ØÏµ£º
ËùÒÔ£¬ÏàÁÚÁ½×éµÄͬһ²ã³ß¶ÈΪ2±¶µÄ¹ØÏµ¡£
×îÖճ߶ÈÐòÁÐ×ܽáΪ£º
oΪ½ð×ÖËþ×éÊý£¬nΪÿ×é½ð×ÖËþ²ãÊý¡£
¹¹½¨DoG½ð×ÖËþ
¹¹½¨¸ß˹½ð×ÖËþÖ®ºó£¬¾ÍÊÇÓýð×ÖËþÏàÁÚͼÏñÏà¼õ¹¹ÔìDoG½ð×ÖËþ¡£
ÏÂÃæÎª¹¹ÔìDoGµÄ´úÂ룺
[cpp] view plaincopy
// ¹¹½¨nOctaves×飨ÿ×énOctaves+2²ã£©¸ß˹²î·Ö½ð×ÖËþ
void SIFT::buildDoGPyramid( const vector& gpyr, vector& dogpyr ) const
{
int nOctaves = (int)gpyr.size()/(nOctaveLayers + 3);
dogpyr.resize( nOctaves*(nOctaveLayers + 2) );
for( int o = 0; o < nOctaves; o++ )
{
for( int i = 0; i < nOctaveLayers + 2; i++ )
{
// µÚo×éµÚi¸±Í¼ÏñΪ¸ß˹½ð×ÖËþÖеÚo×éµÚi+1ºÍi×éͼÏñÏà¼õµÃµ½
const Mat& src1 = gpyr[o*(nOctaveLayers + 3) + i];
const Mat& src2 = gpyr[o*(nOctaveLayers + 3) + i + 1];
Mat& dst = dogpyr[o*(nOctaveLayers + 2) + i];
subtract(src2, src1, dst, noArray(), CV_16S);
}
}
}
Õâ¸ö±È½Ï¼òµ¥£¬¾ÍÊÇÒ»¸ösubtract()º¯Êý¡£
ÖÁ´Ë£¬SIFTµÚÒ»²½¾ÍÍê³ÉÁË¡£²Î¼û¡¶SIFTÔÀíÓëÔ´Âë·ÖÎö¡·
×ªÔØÇë×¢Ã÷³ö´¦£ºhttp://blog.csdn.net/xiaowei_cqu/article/details/8067881 |
|