[图像处理] 请熟悉图像处理的帮忙一下
hailong4688199
2012-02-22
我在网上下载了使用java实现的SIFT算法,但不知道如何使用。我的使用目的是能够抽取某一张图片的特征向量值,和比较匹配两张图片特征的相似度。最好能贴上代码,不胜感激! 文件列表如下所示: Java_SIFT-src
如有需要可以继续贴上来,这里面的SIFT_Test.java代码是
/** * Extract and display Scale Invariant Features after the method of David Lowe * \cite{Lowe04} in an image. * * BibTeX: * <pre> * @article{Lowe04, * author = {David G. Lowe}, * title = {Distinctive Image Features from Scale-Invariant Keypoints}, * journal = {International Journal of Computer Vision}, * year = {2004}, * volume = {60}, * number = {2}, * pages = {91--110}, * } * </pre> * * * License: GPL * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License 2 * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * NOTE: * The SIFT-method is protected by U.S. Patent 6,711,293: "Method and * apparatus for identifying scale invariant features in an image and use of * same for locating an object in an image" by the University of British * Columbia. That is, for commercial applications the permission of the author * is required. * * @author Stephan Saalfeld <saalfeld@mpi-cbg.de> * @version 0.1b */ import mpi.cbg.fly.*; import ij.plugin.*; import ij.gui.*; import ij.*; import ij.process.*; import java.util.Collections; import java.util.Vector; import java.awt.Color; import java.awt.Polygon; import java.awt.TextField; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class SIFT_Test implements PlugIn, KeyListener { // steps private static int steps = 3; // initial sigma private static float initial_sigma = 1.6f; // feature descriptor size private static int fdsize = 4; // feature descriptor orientation bins private static int fdbins = 8; // size restrictions for scale octaves, use octaves < max_size and > min_size only private static int min_size = 64; private static int max_size = 1024; /** * Set true to double the size of the image by linear interpolation to * ( with * 2 + 1 ) * ( height * 2 + 1 ). Thus we can start identifying * DoG extrema with $\sigma = INITIAL_SIGMA / 2$ like proposed by * \citet{Lowe04}. * * This is useful for images scmaller than 1000px per side only. */ private static boolean upscale = false; private static float scale = 1.0f; /** * draws a rotated square with center point center, having size and orientation */ static void drawSquare( ImageProcessor ip, double[] o, double scale, double orient ) { scale /= 2; double sin = Math.sin( orient ); double cos = Math.cos( orient ); int[] x = new int[ 6 ]; int[] y = new int[ 6 ]; x[ 0 ] = ( int )( o[ 0 ] + ( sin - cos ) * scale ); y[ 0 ] = ( int )( o[ 1 ] - ( sin + cos ) * scale ); x[ 1 ] = ( int )o[ 0 ]; y[ 1 ] = ( int )o[ 1 ]; x[ 2 ] = ( int )( o[ 0 ] + ( sin + cos ) * scale ); y[ 2 ] = ( int )( o[ 1 ] + ( sin - cos ) * scale ); x[ 3 ] = ( int )( o[ 0 ] - ( sin - cos ) * scale ); y[ 3 ] = ( int )( o[ 1 ] + ( sin + cos ) * scale ); x[ 4 ] = ( int )( o[ 0 ] - ( sin + cos ) * scale ); y[ 4 ] = ( int )( o[ 1 ] - ( sin - cos ) * scale ); x[ 5 ] = x[ 0 ]; y[ 5 ] = y[ 0 ]; ip.drawPolygon( new Polygon( x, y, x.length ) ); } public void run( String args ) { if ( IJ.versionLessThan( "1.37i" ) ) return; final ImagePlus imp = WindowManager.getCurrentImage(); if ( imp == null ) { System.err.println( "There are no images open" ); return; } final GenericDialog gd = new GenericDialog( "Test SIFT" ); gd.addNumericField( "steps_per_scale_octave :", steps, 0 ); gd.addNumericField( "initial_gaussian_blur :", initial_sigma, 2 ); gd.addNumericField( "feature_descriptor_size :", fdsize, 0 ); gd.addNumericField( "feature_descriptor_orientation_bins :", fdbins, 0 ); gd.addNumericField( "minimum_image_size :", min_size, 0 ); gd.addNumericField( "maximum_image_size :", max_size, 0 ); gd.addCheckbox( "upscale_image_first", upscale ); gd.showDialog(); if ( gd.wasCanceled() ) return; steps = ( int )gd.getNextNumber(); initial_sigma = ( float )gd.getNextNumber(); fdsize = ( int )gd.getNextNumber(); fdbins = ( int )gd.getNextNumber(); min_size = ( int )gd.getNextNumber(); max_size = ( int )gd.getNextNumber(); upscale = gd.getNextBoolean(); if ( upscale ) scale = 2.0f; ImageProcessor ip1 = imp.getProcessor().convertToFloat(); ImageProcessor ip2 = imp.getProcessor().duplicate().convertToRGB(); Vector< Feature > fs1; FloatArray2DSIFT sift = new FloatArray2DSIFT( fdsize, fdbins ); FloatArray2D fa = ImageArrayConverter.ImageToFloatArray2D( ip1 ); Filter.enhance( fa, 1.0f ); if ( upscale ) { FloatArray2D fat = new FloatArray2D( fa.width * 2 - 1, fa.height * 2 - 1 ); FloatArray2DScaleOctave.upsample( fa, fat ); fa = fat; fa = Filter.computeGaussianFastMirror( fa, ( float )Math.sqrt( initial_sigma * initial_sigma - 1.0 ) ); } else fa = Filter.computeGaussianFastMirror( fa, ( float )Math.sqrt( initial_sigma * initial_sigma - 0.25 ) ); long start_time = System.currentTimeMillis(); System.out.print( "processing SIFT ..." ); sift.init( fa, steps, initial_sigma, min_size, max_size ); fs1 = sift.run( max_size ); Collections.sort( fs1 ); System.out.println( " took " + ( System.currentTimeMillis() - start_time ) + "ms" ); System.out.println( fs1.size() + " features identified and processed" ); ip2.setLineWidth( 1 ); ip2.setColor( Color.red ); for ( Feature f : fs1 ) { //System.out.println( f.location[ 0 ] + " " + f.location[ 1 ] + " " + f.scale + " " + f.orientation ); drawSquare( ip2, new double[]{ f.location[ 0 ] / scale, f.location[ 1 ] / scale }, fdsize * 4.0 * ( double )f.scale / scale, ( double )f.orientation ); } ImagePlus imp1 = new ImagePlus( imp.getTitle() + " Features ", ip2 ); imp1.show(); } public void keyPressed(KeyEvent e) { if ( ( e.getKeyCode() == KeyEvent.VK_F1 ) && ( e.getSource() instanceof TextField) ) { } } public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { } } |
|
hailong4688199
2012-02-22
以上的代码中使用了imageJ,如何使用的也请教
|