====== Homework 01 - Image Coordinate System, Affine Transformation ====== ==== Input Data ==== The input data can be downloaded from submission system BRUTE: the image ''daliborka_01.jpg'' and the set of seven 2D points ''u2''. ==== Task overview ==== - Load ''daliborka_01.jpg'' bitmap image into a 3D matrix/array (rows x cols x 3). - Display the array as image. - Manually acquire coordinates of the set of seven points in the image corresponding to the tops of the five chimneys and the two towers. The points must be ordered **from left to right**. Store the point coordinates in a 2x7 matrix, i.e. the point coordinates are **column** vectors. - In the bitmap image, colorize the pixels that are nearest to the acquired points (use rounding, not flooring/ceiling). Use the following colors in the following order: **red = [255, 0, 0], green = [0, 255, 0], blue = [0, 0, 255], magenta = [255, 0, 255], cyan = [0, 255, 255], yellow = [255, 255, 0], white = [255, 255, 255]** to colorize the respective seven points. The colors are defined by their R, G, B values: **color = [R, G, B]**. The order of colors must correspond to the order of points ''u''. Store the modified bitmap image as a file ''01_daliborka_points.png''. - Create function ''A = estimate_A( u2, u )'' for estimation of the affine transformation ''A'' (2×3 matrix) **from** n given points ''u2'' **to** image points ''u''. The inputs ''u2'', and ''u'' are 2xn matrices, i.e., point coordinates are columns. - Perform all possible selections of 3 point correspondences from all n correspondences. - For each triple compute the affine transformation ''Ai'' (exactly). - Compute transfer errors of the particular transformation for every correspondence, i.e., the euclidean distances between points ''u'' and ''ux''; the points ''ux'' are the points ''u2'' transformed by ''A''. Find the maximum error over the correspondences. - From the all computed transformations ''Ai'' select the one ''A'' that has the maximum transfer error minimal. - Assume general number of points, though we have only 7 points and 35 different triplets. - Display the image, the set of points ''u'' using the same colors as above, and 100× magnified transfer errors for the best ''A'' as red lines. - Export the graph as a pdf file ''01_daliborka_errs.pdf''. - Store the points ''u'' and the matrix ''A'' in the file ''01_points.mat'' (Matlab format). ^ Example of a points and transfer errors ^ | {{:courses:gvg:labs:01_daliborka_errs.png?400|}} | ==== Python implementation details ==== Please note when there is a matrix required as an output data, we mean matrix implemented as ''np.array'', not as ''np.matrix'' or any other types. If you are using different type than ''np.array'', convert your result. Implement the solution in a single file ''hw01.py''. The file must contain the ''estimate_A'' function, such that it can be imported (by automatic evaluation) as import hw01 A = hw01.estimate_A( u2, u ) In addition, when run as main python script, it should do the task described above. Use the ''if %%__name__ == "__main__"%%'' test for separating code that should not run during import. === Upload summary === Upload an archive containing the following files: - ''01_points.mat'' - ''01_daliborka_points.png'' - ''01_daliborka_errs.pdf'' - ''hw01.py'' - your implementation Note: All files must be in the same directory. Do not use any subdirectories. === Implementation hints === The following packages should be used: import numpy as np # for matrix computation and linear algebra import matplotlib.pyplot as plt # for drawing and image I/O import scipy.io as sio # for matlab file format output import itertools # for generating all combinations Image reading/writing as numpy array: img = plt.imread( 'daliborka_01.jpg' ) # note that img is read-only, so a copy must be made to allow pixel modifications img = img.copy() img[0,0] = [ 255, 255, 255 ] # put white to upper left corner plt.imsave( 'out.png', img ) Showing the image: plt.imshow( img ) plt.show() Manual input of 7 points: u = plt.ginput( 7 ) Draw errors, export graph as pdf: # ux ... points u2 transformed by A e = 100 * ( ux - u ) # error displacements magnified by 100 fig = plt.figure() # figure handle to be used later fig.clf() plt.imshow( img ) # draw all points (in proper color) and errors ... plt.plot( u[3,0], u[3,1], 'o', color=[1,0,1], fillstyle='none' ) # the 4-th point in magenta color plt.plot( (u[3,0 ],u[3,0]+e[3,0]), (u[3,1],u[3,1]+e[3,1]), 'r-') # the 4-th displacement ... plt.show() fig.savefig( '01_daliborka_errs.pdf' ) Generator of all triplets: n = u.shape[1] iter = itertools.combinations( range( 0, n ), 3 ) # three of n # iterate all combinations for inx in iter: u_i = u[ :, inx] u_2i = u_2[ :, inx ] # do the processing for a single triplet ... Save results in MATLAB format: sio.savemat('01_points.mat', {'u': u, 'A': A}) ==== Matlab implementation details ==== Implement your solution in a main script ''hw01.m'', in the file ''estimate_A.m'' containing the function, and optionally in additional files for needed functions. === Upload summary === Upload an archive containing the following files: - ''01_points.mat'' - ''01_daliborka_points.png'' - ''01_daliborka_errs.pdf'' - ''estimate_A.m'' - ''hw01.m'' - your Matlab implementation. It makes all required figures, output files and prints. - any other files required by hw01.m, such that the task is fully runnable Note: All files must be in the same directory. Do not use any subdirectories. === Implementation hints === Image read, display, write: img = imread( 'daliborka_01.jpg' ); % load the image figure; % create a new figure image( img ); % display the image, keep axes visible axis image % display it with square pixels img(1,1,:) = [255, 255, 255]; % put white to the upper left corner imwrite( img, 'out.png' ); % write the image to a file Manual input of 7 points: [x,y] = ginput(7); Draw errors, export graph as pdf: % ux .. points u2 transformed by A e = 100 * ( ux - u ); % magnified error displacements ... hold on % to plot over the image ... plot( u(1,4), u(2,4), 'o', 'linewidth', 2, 'color', 'magenta' ) % the 4-th point plot( [ u(1,4) u(1,4)+e(1,4) ], [ u(2,4) u(2,4)+e(2,4) ], 'r-', 'linewidth', 2 ); % the 4-th error ... hold off fig2pdf( gcf, '01_daliborka_errs.pdf' ) % function provided in 'tools' Save results in MAT file: save( '01_points.mat', 'u', 'A' )