package edu.stanford.rsl.tutorial.dmip;
import edu.stanford.rsl.conrad.data.numeric.Grid2D;
import edu.stanford.rsl.conrad.numerics.DecompositionSVD;
import edu.stanford.rsl.conrad.numerics.SimpleMatrix;
import edu.stanford.rsl.conrad.numerics.SimpleMatrix.MatrixNormType;
import edu.stanford.rsl.conrad.numerics.SimpleVector.VectorNormType;
import edu.stanford.rsl.conrad.utils.ImageUtil;
import edu.stanford.rsl.conrad.utils.VisualizationUtil;
import edu.stanford.rsl.conrad.numerics.SimpleOperators;
import edu.stanford.rsl.conrad.numerics.SimpleVector;
import ij.IJ;
import ij.ImageJ;
import ij.plugin.filter.Convolver;
import ij.process.FloatProcessor;
/**
* Introduction to the CONRAD Framework
* Exercise 1 of Diagnostic Medical Image Processing (DMIP)
* @author Marco Boegel
*
*/
public class Intro {
public static void gridIntro(){
//Define the image size
int imageSizeX = 256;
int imageSizeY = 256;
//Define an image
//Hint: Import the package edu.stanford.rsl.conrad.data.numeric.Grid2D
//TODO
//Draw a circle
int radius = 50;
//Set all pixels within the circle to 100
int insideVal = 100;
//TODO
//TODO
//TODO
//Show ImageJ GUI
ImageJ ij = new ImageJ();
//Display image
//TODO
//Copy an image
//TODO
//copy.show("Copy of circle");
//Load an image from file
String filename = "D:/02_lectures/DMIP/exercises/2014/matlab_intro/mr12.dcm";
//TODO. Hint: Use IJ and ImageUtil
//mrImage.show();
//convolution
//TODO
//TODO
//define the kernel. Try simple averaging 3x3 filter
int kw = 3;
int kh = 3;
float[] kernel = new float[kw*kh];
for(int i = 0; i < kernel.length; i++)
{
kernel[i] = 1.f / (kw*kh);
}
//TODO
//write an image to disk, check the supported output formats
String outFilename ="D:/02_lectures/DMIP/exercises/2014/matlab_intro/mr12out.tif";
//TODO
}
public static void signalIntro()
{
//How can I plot a sine function sin(2*PI*x)?
double stepSize = 0.01;
int plotLength = 500;
double[] y = new double[plotLength];
for(int i = 0; i < y.length; i++)
{
//TODO
}
VisualizationUtil.createPlot(y).show();
double[] x = new double [plotLength];
for(int i = 0; i < x.length; i++)
{
x[i] = (double) i * stepSize;
}
VisualizationUtil.createPlot(x, y, "sin(x)", "x", "y").show();
}
public static void basicIntro()
{
//Display text
System.out.println("Creating a vector: v1 = [1.0; 2.0; 3.0]");
//create column vector
//TODO
//System.out.println("v1 = " + v1.toString());
//create a randomly initialized vector
SimpleVector vRand = new SimpleVector(3);
//TODO
//System.out.println("vRand = " + vRand.toString());
//create matrix M 3x3 1 2 3; 4 5 6; 7 8 9
SimpleMatrix M = new SimpleMatrix();
//TODO
//System.out.println("M = " + M.toString());
//determinant of M
//System.out.println("Determinant of matrix m: " + TODO );
//transpose M
//TODO
//copy matrix
//TODO
//transpose M inplace
//TODO
//get size
int numRows = 0;
int numCols = 0;
//TODO
//access elements of M
System.out.println("M: ");
for(int i = 0 ; i < numRows; i++)
{
for(int j = 0; j < numCols; j++)
{
//TODO
//System.out.print(element + " ");
}
System.out.println();
}
//Create 3x3 Matrix of 1's
SimpleMatrix Mones = new SimpleMatrix(3,3);
//TODO
//Create a 3x3 Matrix of 0's
SimpleMatrix Mzeros = new SimpleMatrix(3,3);
//TODO
//Create a 3x3 Identity matrix
SimpleMatrix Midentity = new SimpleMatrix(3,3);
//TODO
//Matrix multiplication
//TODO
//System.out.println("M^T * M = " + ResMat.toString());
//Matrix vector multiplication
//TODO
//System.out.println("M * v1 = " + resVec.toString());
//Extract the last column vector from matrix M
//SimpleVector colVector = M.getCol(2);
//Extract the 1x2 subvector from the last column of matrix M
//TODO
//System.out.println("[m(0)(2); m(1)(2)] = " + subVector);
//Matrix elementwise multiplication
//TODO
//System.out.println("M squared Elements: " + MsquaredElem.toString());
//round vectors
SimpleVector vRandCopy = new SimpleVector(vRand);
System.out.println("vRand = " + vRandCopy.toString());
vRandCopy.floor();
System.out.println("vRand.floor() = " + vRandCopy.toString());
vRand.ceil();
System.out.println("vRand.ceil() = " + vRand.toString());
//min, max, mean
//double minV1 = v1.min();
//double maxV1 = v1.max();
//System.out.println("Min(v1) = " + minV1 + " Max(v1) = " + maxV1);
//for matrices: iterate over row or column vectors
SimpleVector maxVec = new SimpleVector(M.getCols());
for(int i = 0; i < M.getCols(); i++)
{
maxVec.setElementValue(i, M.getCol(i).max());
}
double maxM = maxVec.max();
System.out.println("Max(M) = " + maxM);
//Norms
//TODO matrix L1
//TODO vector L2
//System.out.println("||M||_F = " + matrixNormL1);
//System.out.println("||colVec||_2 = " + vecNormL2);
//get normalized vector
//TODO
//normalize vector in-place
//TODO
//System.out.println("Normalized colVector: " + colVector.toString());
//SVD
SimpleMatrix A = new SimpleMatrix(3,3);
A.setRowValue(0, new SimpleVector(11, 10, 14));
A.setRowValue(1, new SimpleVector(12, 11, -13));
A.setRowValue(2, new SimpleVector(14, 13, -66));
System.out.println("A = " + A.toString());
//TODO SVD
//print singular matrix
//System.out.println(svd.getS().toString());
//get condition number
//System.out.println("Condition number of A: " + TODO );
//Re-compute A = U * S * V^T
//SimpleMatrix temp = SimpleOperators.multiplyMatrixProd(svd.getU(), svd.getS());
//SimpleMatrix A2 = SimpleOperators.multiplyMatrixProd(temp, svd.getV().transposed());
//System.out.println("U * S * V^T: " + A2.toString());
}
public static void main(String arg[])
{
basicIntro();
gridIntro();
signalIntro();
}
}