====== Image Editing ====== The two following labs deal with Poisson image editing, which can be used for image stitching, fusion, cloning, smoothing, context highlighting, color to gray conversion, and other applications. {{:courses:b4m33dzo:labs:05_poisson_image_cloning.jpg?400|}} The theory behind the labs can be found in the lectures: * [[https://dcgi.fel.cvut.cz/home/sykorad/dzo/slides/dzo-l06.pdf|L6 - Image Editing]] Start by downloading the [[https://cw.fel.cvut.cz/wiki/_media/courses/b4m33dzo/labs/dzo2023_05_poisson_student.zip|template]] of the assignment. Use ''test_FS.m'' and ''test_HDR.m'' to check your solution. ===== Computing image gradients, their merge, and divergence ===== **1a:** Implement a function that for a given image computes its gradients (**''calc_grad.m''**) - **0.5 points** * Use convolution with simple 1D finite differences kernels [1 -1] in X and Y direction. * Make sure the gradients at image boundaries are set to zero. **1b:** Implement a function that computes a mask preferring gradients with greater magnitude (**''get_mask.m''**): - **0.5 points** * In each pixel compare magnitudes of gradients in the first and in the second image. When the first image has greater magnitude store 0 in the mask otherwise store 255. **1c:** Implement a function that merges two images according to a given mask (**''merge_image.m''**): - **0.5 points** * In each pixel if the mask has value 0 the output color is taken from the pixel of the first image otherwise the pixel color in the second image is used. **1d:** Implement a function that merges two input gradient fields according to a given mask (**''merge_grad.m''**): - **0.5 points** * In each pixel if the mask has value 0 the output gradient vector is taken from the first image otherwise the gradient computed in the second image is used. **1e:** Implement a function that computes divergence of a given gradient field (**''calc_div.m''**): - **0.5 points** * During the computation try to avoid a situation where the output divergence is shifted by one pixel. ===== Solving Poisson equation iteratively using Gauss-Seidel method ===== **2:** Implement a function that solves Poisson equation by discretizing it into a system of linear equations which is solved iteratively using Gauss-Seidel method (**''solve_GS.m''**) - **3 points** * Perform all computations implicitly without the need to build the linear system explicitly. * Provide good initialization, set sufficient number iterations, and resolve boundary conditions. * Use nested for cycles (x and y coordinate and color channel) and 3D addressing I(x,y,c) to enable parallel processing. ===== Solving Poisson equation directly using Fourier transform ===== **3:** Implement a function that solves Poisson equation by deconvolution in the frequency domain (**''solve_FT.m''**) - **3 points** * Compute frequency domain version of the discreet Laplace operator [0 1 0; 1 -4 1; 0 1 0]. * Use Wiener filtration to avoid division by zero during deconvolution. ===== Color matching and normalization ===== **4a:** Implement a function that matches a brightness level of an input image to match a brightness level of a reference image (**''match_colors.m''**): - **1 point** * For each color channel (within a masked region) compute a global shift vector by averaging pixel differences between the input image and the reference image. * For each color channel in the entire input image shift all pixel values so that (within a masked region) the brightness level is comparable to the brightness level of the reference image. **4b:** Implement a function that normalizes color channels of an input image (**''normalize_colors.m''**) - **0.5 points** * Compute minimum and maximum value of each color channel. * Shift and scale pixel values in the entire input image so that each color channel fits into an interval of <0,1>. ===== Testing the resulting implementation ===== **5a:** Run ''test_FS.m'' to check your solution on Face Swap application: * Load images ''mona_lisa.png'', ''ginevra_benci.png'', and a mask ''mona_mask.png''. * Compute their gradients using ''calc_grad.m''. * Merge the gradients using ''merge_grad.m'' and compute the divergence using ''calc_div.m''. * Merge the images directly in the intensity domain using ''merge_image.m'' to see the discrepancy. * Solve Poisson equation using Gauss-Seidel ''solve_GS.m'' and Fourier transform ''solve_FT.m''. * Match colors of the Fourier transform solution using ''match_colors.m''. Compare your results to the reference: * [[https://cw.fel.cvut.cz/wiki/_media/courses/b4m33dzo/labs/05_poisson_fs_mona_Gx.jpg|Image gradients in X direction]] * [[https://cw.fel.cvut.cz/wiki/_media/courses/b4m33dzo/labs/05_poisson_fs_mona_Gy.jpg|Image gradients in Y direction]] * [[https://cw.fel.cvut.cz/wiki/_media/courses/b4m33dzo/labs/05_poisson_fs_merged_Gx.jpg|Merged gradients in X direction]] * [[https://cw.fel.cvut.cz/wiki/_media/courses/b4m33dzo/labs/05_poisson_fs_merged_Gy.jpg|Merged gradients in Y direction]] * [[https://cw.fel.cvut.cz/wiki/_media/courses/b4m33dzo/labs/05_poisson_fs_merged_divG.jpg|Divergence of merged gradients]] * [[https://cw.fel.cvut.cz/wiki/_media/courses/b4m33dzo/labs/05_poisson_fs_intensity.jpg|Merged image using intensity domain]] * [[https://cw.fel.cvut.cz/wiki/_media/courses/b4m33dzo/labs/05_poisson_fs_gradient_gs.jpg|Merged image using gradient domain (Gauss-Seidel)]] * [[https://cw.fel.cvut.cz/wiki/_media/courses/b4m33dzo/labs/05_poisson_fs_gradient_ft.jpg|Merged image using gradient domain (Fourier transform)]] **5b:** Run ''test_HDR.m'' to check your solution on HDR Image Fusion application: * Load images ''car_low.png'' and ''car_high.png''. * Compute their gradients using ''calc_grad.m''. * Compute gradient merging mask using ''get_mask.m''. * Merge the gradients using ''merge_grad.m'' and compute the divergence using ''calc_div.m''. * Solve Poisson equation using Fourier transform ''solve_FT.m''. * Normalize colors of the Fourier transform solution using ''normalize_colors.m''. Compare your results to the reference: * [[https://cw.fel.cvut.cz/wiki/_media/courses/b4m33dzo/labs/05_poisson_hdr_mask.jpg|Gradient selection mask]] * [[https://cw.fel.cvut.cz/wiki/_media/courses/b4m33dzo/labs/05_poisson_hdr_gradient_ft.jpg|Merged image using gradient domain (Fourier transform)]] When you are done, upload the complete zip archive containing your implemented files to BRUTE: * ''calc_div.m'' * ''calc_grad.m'' * ''get_mask.m'' * ''match_colors.m'' * ''merge_grad.m'' * ''merge_image.m'' * ''normalize_colors.m'' * ''solve_FT.m'' * ''solve_GS.m'' Keep the files in the root of the zip archive (zip directly the files, NOT a folder containing the files). The evaluation system searches for the files just in the root of zip archive. The points will be assigned manually by TA after the deadline.