《sift算法的MATLAB程序》由会员分享,可在线阅读,更多相关《sift算法的MATLAB程序(2页珍藏版)》请在人人文库网上搜索。
1、 image, descriptors, locs = sift(imageFile)% This function reads an image and returns its SIFT keypoints.% Input parameters:% imageFile: the file name for the image.% Returned:% image: the image array in double format% descriptors: a K-by-128 matrix, where each row gives an invariant%descriptor for 。
2、one of the K keypoints. The descriptor is a vector%of 128 values normalized to unit length.% locs: K-by-4 matrix, in which each row has the 4 values for a%keypoint location (row, column, scale, orientation). The%orientation is in the range -PI, PI radians.% Credits: Thanks for initial version of thi。
3、s program to D. Alvaro and%J.J. Guerrero, Universidad de Zaragoza (modified by D. Lowe)function image, descriptors, locs = sift(imageFile)% Load imageimage = imread(imageFile);% If you have the Image Processing Toolbox, you can uncomment the following% lines to allow input of color images, which wil。
4、l be converted to grayscale.% if isrgb(image)% image = rgb2gray(image);% endrows, cols = size(image);% Convert into PGM imagefile, readable by keypoints executablef = fopen( tmp.pgm , w );if f = -1error(Could not create file tmp.pgm.);endfprintf(f, P5n%dn%dn255n , cols, rows);fwrite(f, image, uint8 。
5、);fclose(f);% Call keypoints executableif isunixcommand = !./sift ;elsecommand = !siftWin32 ;endcommand = command tmp.key ;eval(command);% Open tmp.key and check its headerg = fopen( tmp.key , r );if g = -1error( Could not open file tmp.key. ); endheader, count = fscanf(g, %d %d , 1 2);if count = 2e。
6、rror( Invalid keypoint file beginning. ); endnum = header(1);len = header(2);if len = 128);%row col scale orierror( Keypoint descriptor length invalid (should be 128). end% Creates the two output matrices (use known size for efficiency) locs = double(zeros(num, 4);descriptors = double(zeros(num, 128。
7、);% Parse tmp.keyfor i = 1:numvector, count = fscanf(g, %f %f %f %f , 1 4); if count = 4error( Invalid keypoint file format ); endlocs(i, :) = vector(1, :);descrip, count = fscanf(g, %d , 1 len); if (count = 128)error( Invalid keypoint file value. ); end% Normalize each input vector to unit length descrip = descrip / sqrt(sum(descrip.A2); descriptors(i, :) = descrip(1, :);end fclose(g。