based on Elboher ‘s slides , HUJI It allows one to perform numerical calculations, and visualize the results without the need for complicated and time consuming programming. Every variable in Matlab is a multidimensional matrix. Highly modular. No memory allocation is necessary. Matlab enables its own garbage collection. Simple interface for complex mathematical concepts. Enables OO Programming. >> help help (explain how to get help) >> helpbrowser / doc (open the online Matlab documentation) >> help images (list of all commands in the Image Processing Toolbox) >> demo (supply various guide videos) >> lookfor read (display list of functions with ‘read’ in the name or help text) >> type imread (display contents of file) >> help imread (function name + % block) >> doc imread (function documentation in help browser) Using [tab] is useful to auto-complete function names and variables Digital image representation : 2D function f(x,y) -> finite discrete quantities Coordinate Conventions: img(r,c) r–rows (height) c–cols (width) >> size(img) The first pixel: img(1,1) • Intensity images scaled to represent intensities (uint8 – [0,255], double [0,1]) • Binary images logical array of 0s and 1s • Indexed images Look up table [x, map] • RGB images truecolor, array of (m*n*3) Checking the image type : isind, isbw, isgray, isrgb Converting image types: rgb2ind, rgb2gray, gray2ind, ind2gray,…. >> f = imread(‘filename’); filename is a string including the file type (jpg, tiff,…) ; is used for suppressing output >> [height, width] = size(f); >> whos f display additional information about an array Name Size Bytes Class f 512x512x3 786432 uint8 array Grand total is 786432 elements using 786432 byte >> imshow(f) display the image f according to its type >> imshow(f, [low high]) >> imshow(f, []) >> impixelinfo >> figure(2), imshow(g) display as black all values less than ‘low’ and as white all values greater or equal to ‘high’ (in grayscale images) set low and high as the minimal and maximal values of array f (in grayscale images) display intensity value of individual pixel interactively Open a new figure before displaying the image (the default – using the same figure) >> imwrite(f, ‘filename’) >> k = imfinfo(‘test1.jpg’) f is an image array ‘filename’ must include the file format (tif, jpg, bmp,..) Filename: 'test1.jpg' FileModDate: '22-Oct-2005 13:07:36' FileSize: 3464 Format: 'jpg' FormatVersion: '' Width: 256 Height: 256 BitDepth: 24 ColorType: 'truecolor' FormatSignature: '' Comment: {} The answer is a structure variable with different fields: k.Width Converting between types : B = data_class_name(A) for example: B = double(A) When converting between data classes and types it is important to keep the value range for each data class >> img = double(img)/255; >> img = im2double(img); Matlab variables do not need to be declared in advance. ‘ans’ is a defined variable containing the last result Memory is allocated and freed automatically. >> A = [1 2 3; 2 3 4; 3 4 5]; >> A = 0.0005 row vector (1xN) >> v = [1 3 5 7]; (elements separated by space or comma (,)) >> v(2) = 3; column vector (MX1) To Access blocks of elements we use colon notation Vector can be used as an index into another vector >> w = [1;3;5;7]; (elements separated semi-comma (;)) >> w = v’ (transpose operation) w= 1 3 5 7 >> v(2:4) ans = 357 >> v(1:end) end is the last element in the vector >> v(:) produce a column vector >> v(1:2:end) enables steps (jumps) >> v(end:-2:1) steps can be negative as well >> v([1 3 4]) ans = 1 5 7 Image – 2D array, matrix Matrix can be represented as a sequence of row vectors To access an element, 2 indexes are used – row index and column index >>A = [1 2 3; 4 5 6; 7 8 9] A= 1 2 3 4 5 6 7 8 9 >> A(2,3) 6 >> A(:,3) 3 6 9 >> A(2,:) 456 >> a(1:2,1:3) 123 456 >> B = A; >> B(:,3) = 0 B= 1 2 4 5 7 8 0 0 0 Using vectors to index into a matrix provide a powerful tool for element selection A([1 3], [2 3]) 2 3 8 9 Image – 2D array, matrix A matrix is also represented as a long vector >> A = [1 2 3; A= 1 2 4 5 7 8 3 6 9 To access sequential elements in a matrix a single index can also be used: >> A(1:9) A= 1 4 4 5 6; 7 8 9] 7 2 5 8 3 6 9 Sometimes changing the shape of the matrix is of use: >> reshapse(A(1:2,1:3), 3, 2) A= 1 5 4 3 2 6 The size of the output matrix is the size of the index matrix! 14 A very useful approach is to use logical matrix as an index to the matrix >> D = logical([1 0 0; 0 0 1; 0 0 0]) D= 1 0 0 0 0 1 0 0 0 >> A(D) ans = 1 6 The use of column operation on a matrix produce a single column vector from the matrix (on a column by column basis). It is very useful for image operations like sum or max >> s = sum(f(:)) (equivalent to: sum(sum(f))) 15 Arithmetical operators have their algebraic meaning: >> A = [1 2 3; 4 5 6; 7 8 9]; >> A + A ans = 2 4 6 8 10 12 14 16 18 >> A * [1 1 1] ??? Error using ==> times Matrix dimensions must agree >> A * [1 1 1]’ ans = 6 15 24 16 Vector multiplication depends on the order of the two vectors >> [1 2 3] * [2 3 4] ??? Error using ==> times Matrix dimensions must agree >> [1 2 3] * [2 3 4]’ ans = 20 >>[1 2 3]’ * ans = 2 3 4 6 6 9 [2 3 4] 4 8 12 17 Element by element operators - .* .^ ./ >> [1 2 3] .* [2 3 4] ans = 2 6 12 >> [1 2 3] .^ 2 ans = 1 4 9 >> [1 2 3] ./ (2:2:6) ans = 0.5000 0.5000 0.5000 18 Matlab arrays can be of any dimensions It is useful to operate on specific dimension of the array, for example: >> height = size(i,1); Usually we deal with 2D arrays but there are cases we need to address higher dimensions (such as color images) >> i(200:300, 200:400, 3) To get the number of dimensions of an array >> d = ndims(f) 19 Generating simple array enables trying out simple ideas and test the syntax of a function during development >> zeros(m,n) >> ones(m,n) >> true(m,n) >> false(m,n) >> magic(m) >> rand(n) >> randn(n) >> pascal(n) 20 Arithmetic operators (numeric computations) ◦ matrix arithmetic (linear algebra A*B) ◦ array arithmetic (element by element A.*B) +, -, ./, .^,:.. Relational operators (compare) Logical operators can operate both on logical and numeric data (and: &, or: |, not: ~) ◦ Compare corresponding elements of arrays of equal dimensions (<, >,<=, >=, ==, ~=) or an array to scalar true: logical 1 or non-zero numeric quantity false: logical or numerical 0 logical functions : any, all 21 >> i = imread('sowrds0040.bmp'); >> i = rgb2gray(double(i)/255); >> imshow(i) 22 >> i = imread('sowrds0040.bmp'); >> i = rgb2gray(double(i)/255); >> imshow(i) 23 >> >> >> >> >> i = imread('sowrds0040.bmp'); i = rgb2gray(double(i)/255); imshow(i) s = i(end:-1:1, :); imshow(s); 24 >> >> >> >> >> i = imread('sowrds0040.bmp'); i = rgb2gray(double(i)/255); imshow(i) s = i(end:-1:1,:); imshow(s); 25 >> >> >> >> >> >> >> i = imread('sowrds0040.bmp'); i = rgb2gray(double(i)/255); imshow(i) s = i(end:-1:1,:); imshow(s); a = i(200:300,200:400); imshow(a); 26 >> >> >> >> >> >> >> i = imread('sowrds0040.bmp'); i = rgb2gray(double(i)/255); imshow(i) s = i(end:-1:1,:); imshow(s); a = i(200:300,200:400); imshow(a); 27 >> >> >> >> >> >> >> >> >> i = imread('sowrds0040.bmp'); i = rgb2gray(double(i)/255); imshow(i) s = i(end:-1:1,:); imshow(s); a = i(200:300,200:400); imshow(a); t = i(1:2:end, 1:2:end); imshow(t); 28 >> >> >> >> >> >> >> >> >> i = imread('sowrds0040.bmp'); i = rgb2gray(double(i)/255); imshow(i) s = i(end:-1:1,:); imshow(s); a = i(200:300,200:400); imshow(a); t = i(1:2:end, 1:2:end); imshow(t); 29 >> >> >> >> >> >> >> >> >> >> >> i = imread('sowrds0040.bmp'); i = rgb2gray(double(i)/255); imshow(i) s = i(end:-1:1,:); imshow(s); a = i(200:300,200:400); imshow(a); t = i(1:2:end, 1:2:end); imshow(t); i(200:300, 200:400) = 0; imshow(i); 30 >> >> >> >> >> >> >> >> >> >> >> i = imread('sowrds0040.bmp'); i = rgb2gray(double(i)/255); imshow(i) s = i(end:-1:1,:); imshow(s); a = i(200:300,200:400); imshow(a); t = i(1:2:end, 1:2:end); imshow(t); i(200:300, 200:400) = 0; imshow(i); 31 >> >> >> >> >> >> >> >> >> >> >> >> i = imread('sowrds0040.bmp'); i = rgb2gray(double(i)/255); imshow(i) s = i(end:-1:1,:); imshow(s); a = i(200:300,200:400); imshow(a); t = i(1:2:end, 1:2:end); imshow(t); i(200:300, 200:400) = 0; imshow(i); imshow(i/2); 32 >> >> >> >> >> >> >> >> >> >> >> >> i = imread('sowrds0040.bmp'); i = rgb2gray(double(i)/255); imshow(i) s = i(end:-1:1,:); imshow(s); a = i(200:300,200:400); imshow(a); t = i(1:2:end, 1:2:end); imshow(t); i(200:300, 200:400) = 0; imshow(i); imshow(i/2); 33 >> >> >> >> >> >> >> >> >> >> >> >> >> i = imread('sowrds0040.bmp'); i = rgb2gray(double(i)/255); imshow(i) s = i(end:-1:1,:); imshow(s); a = i(200:300,200:400); imshow(a); t = i(1:2:end, 1:2:end); imshow(t); i(200:300, 200:400) = 0; imshow(i); imshow(i/2); imshow((i>0.8).*i); 34 >> >> >> >> >> >> >> >> >> >> >> >> >> i = imread('sowrds0040.bmp'); i = rgb2gray(double(i)/255); imshow(i) s = i(end:-1:1,:); imshow(s); a = i(200:300,200:400); imshow(a); t = i(1:2:end, 1:2:end); imshow(t); i(200:300, 200:400) = 0; imshow(i); imshow(i/2); imshow((i>0.8).*i); 35 M-Files can be one of two: Scripts – A series of commands that are performed on the global scope. No input and output variables. Functions – A set of commands performed over a given input, with a required output. Functions have a scope of their own. (accessing the global scope can be done by defining the variables to be ‘globals’). In both types – the m-file must be in the current directory, or in a previously added path (added with the function addpath) 36 Components of m files: Function definition line function [out1 out2] = name(in1, in2, in3) H1 line - a single comment line that follows the function definition line. % SQUARESUM compute the sum of the square of the matrix elements This line appears when user writes >> help function_name >> lookfor keyword - display all functions where the keyword appeared in H1 line 37 Components of m files (cont.): Help Text - text block following the H1 line without any blank line in between the two Function body – the Matlab code Comments – lines starting with % Note: – add short and clear comments to your code! 38 if, else, elseif, end switch, case, otherwise, end return try...catch…end for i=start:increment:end, end while, end break (used with for or while) continue (used with for or while) Try not to use 39 1D indexing Convert for / while loops to equivalent vector or matrix operations >> for x = 1:k ff(x) = 5*sin((x-1)/(2*pi)); end >> x = 0:k-1 >> ff = 5*sin(x/(2*pi)); 40 2D indexing meshgrid – convert rows vectors to arrays C and R that can be used for evaluating function with two variables >> for r = 1:10 >> for c = 1:10 >> b(r,c) = r.^2+ c.^2 >> end >> end >> [C, R] = meshgrid(1:c, 1:r) >> h = R.^2 + C.^2; Vectorzing code accelerates the computation significantly For Example: using meshgrid runs on the order of 30 times faster the same computation based on loops on Image of 512x512 pixels 41 Simple way to improve code execution is to pre-allocate the size of the arrays in the program. >> f = zeros(1024); 42 Cell array is multidimensional array whose elements are copies of other arrays >> c = {‘gauss’,[1 0;0 1], 3} >> c{1} ans = gauss Structures are similar to cell arrays (allow grouping of a collection of dissimilar data) but they addressed by fields rather than by numbers >> params.nimgs = 100; >> params.jump = 2; >> params.baseStr = ‘testImg’ 43 Matlab arguments are always passed by value Checking whether an argument exist >> exist(a,’var’) Checking number of arguments to the functions >> nargin, nargout, nargchk Getting variable number of arguments >>varargin, varargout 44 >> guide (Graphic User Interface Development Environment) Start the GUI Layout Editor. Guide create ◦ fig file: complete description of the gui elements and their arrangements ◦ gui m-file: the code that controls the gui operations, initializations functions, callback functions 45 Any Questions?