content: package edu.stanford.rsl.tutorial.modelObserver;
  
  import edu.stanford.rsl.conrad.data.numeric.Grid2D;
  import edu.stanford.rsl.conrad.numerics.SimpleMatrix;
  import edu.stanford.rsl.conrad.numerics.SimpleOperators;
  import edu.stanford.rsl.conrad.numerics.SimpleVector;
  
  /**
   * @author Iris Kellermann
   */
  
  public class ImageHelper {
  	/**
  	 * Calculates the mean image of the given image array.  
  	 * @param images The input images.
  	 * @return  The result image.
  	 */
  	public static SimpleMatrix GetMeanImage(SimpleMatrix[] images)
  	{
  		int rows = images[0].getRows();
  		int columns = images[0].getCols();
  		
  		SimpleMatrix resultMatrix = new SimpleMatrix(rows, columns);
  				
  		resultMatrix.add(images);
  		resultMatrix.divideBy(images.length);
  		
  		return resultMatrix;
  	}
  
  	/**
  	 * Converts a Grid2D to a SimpleMatrix.  
  	 * @param grid The Gri2D to convert.
  	 * @return  The result matrix.
  	 */
  	public static SimpleMatrix ConvertGrid2DToSimpleMatrix(Grid2D grid)
  	{
  		double[][] gridDouble = new double[grid.getHeight()][grid.getWidth()];
  		
  		for(int i = 0; i < grid.getWidth(); ++i)
  		{
  			for(int j = 0; j < grid.getHeight(); ++j)
  			{
  				gridDouble[j][i] = grid.getPixelValue(i, j);
  			}
  		}
  		
  		SimpleMatrix gridMatrix = new SimpleMatrix(gridDouble);
  		
  		return gridMatrix;
  	}
  
  	/**
  	 * Converts a SimpleMatrix to a SimpleVector by concatenating the columns vertically.  
  	 * @param matrix The matrix to convert.
  	 * @return  The result vector.
  	 */
  	public static SimpleVector ConvertSimpleMatrixToVector(SimpleMatrix matrix)
  	{
  		SimpleVector[] columns = new SimpleVector[matrix.getCols()];
  		
  		for(int i = 0; i < matrix.getCols(); ++i)
  		{
  			columns[i] = matrix.getCol(i);
  		}
  		
  		return SimpleOperators.concatenateVertically(columns);
  	}
  
  	/**
  	 * Creates a new matrix which is composed of all input column vectors, stacked next to each other.  
  	 * @param columns  The vectors to stack.
  	 * @return  The horizontally concatenated matrix.
  	 */
  	public static SimpleMatrix concatenateHorizontally(SimpleVector... columns) {
  		final int cols = columns.length;
  		assert cols >= 1 : new IllegalArgumentException("Supply at least one vector to concatenate!");
  		final int rows = columns[0].getLen();
  		assert rows >= 1 : new IllegalArgumentException("Vectors have to contain at least one element each!");
  		SimpleMatrix result = new SimpleMatrix(rows, cols);
  		for (int c = 0; c < cols; ++c)
  			result.setColValue(c, columns[c]);
  		return result;
  	}
  }
  
  /*
   * Copyright (C) 2010-2014 - Iris Kellermann 
   * CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
  */