matlabcomputer-visionsurfmatlab-cvstcbir

SURF Descriptor and Matching for Multiple Image in Matlab


I'm working on Content based image retrieval project using matlab when I apply the function point=detectSURFFeatures(image) I get 83*1 surf point that has the following information:

         `Scale: [83x1 single]
          SignOfLaplacian: [83x1 int8]
          Orientation: [83x1 single]
          Location: [83x2 single]
          Metric: [83x1 single]
          Count: 83`

I need to know how I can extract a (distinctive and Fixed) feature vector that represents each image in a database that contains thousands of images,any help please ?
Here is the samples of the database. (Wang database)


Solution

  • Currently, I am using imread to read the image as follows. Matlab's detectSURFFeatures function only works on greyscale images.

    I = rgb2gray( imread( '434.jpg' ) );
    

    You can run this line to get the SURF features.

    points = detectSURFFeatures( I );
    

    You can plot the surf features using the following.

    imshow( I );
    hold on;
    plot( point.selectStrongest(10) );
    hold off;
    

    Here is the visualization of the image I worked with.

    enter image description here

    This printing the points object, you can get the following properties showing 41 features.

              Scale: [41x1 single]
    SignOfLaplacian: [41x1 int8]
        Orientation: [41x1 single]
           Location: [41x2 single]
             Metric: [41x1 single]
              Count: 41
    

    If you have all the grayscale images stored in a cell object called cellimg (one cell element for each image), you can run detectSURFFeatures on each one as follows.

    cellsurf = cellfun( @(I) detectSURFFeatures( I ), cellimg, 'UniformOutput', false );
    

    Each element of cellsurf will contain SURF points. Since you want a set of distinctive and fixed features that will identify each image, you can select the strongest points on each image in cellsurf. You can either use the top n number of features or set n = min( points ). Calculate the min number of features using the following code.

    n = min( cellfun( @(S) S.Count, cellsurf ) );
    

    Then you can select the strongest points by running selectStrongest on each cell in cellsurf.

    F = cellfun( @(S) S.selectStrongest( n ), cellsurf, 'UniformOutput', false);
    

    The variable F will contain a constant set of features. You can change n accordingly to change the number of strongest features you want. To match two sets of features, you can use the builtin matchFeatures function.

    Notes