#!/usr/bin/env python # coding: utf-8 # ##
NYU CSCI-UA 9473 Introduction to ML
# ###
Unsupervised Learning (Part III)
# # # #### Exercise 1. Dictionnary learning and image inpainting. # # We consider the popular Lena image below which was corrupted by the overlaying of some text # In[1]: from PIL import Image img = Image.open('lena.png').convert('LA') img.save('greyscale.png') # In[2]: import cv2 import numpy as np import matplotlib.pyplot as plt image = cv2.imread('greyscale.png') texted_image =cv2.putText(img=np.copy(image), text="hello", org=(200,200),fontFace=3, fontScale=3, color=(0,0,255), thickness=5) plt.imshow(texted_image) plt.show() # In[5]: im = Image.fromarray(texted_image) img = im.convert('LA') plt.imshow(img) plt.show() # Using the grayscale image above (or if you want to your implementation to be faster, on a downsampled version of this image), decompose the image into a series of overlapping patches (e.g. of size 8x8), store those patches as a list of vectors. Center the list and scale it (divide by the std). Once we have a first dictionnary, we can try to compute the recovered image by first expressing each of the patches from the original image as # # \begin{align*} # \underset{\mathbf{s}}{\operatorname{argmin}} \left\|\mathbf{y} - \mathbf{D}\mathbf{s}\right\| + \lambda \|\mathbf{s}\|_1 # \end{align*} # # This minimization can be solved for example through [Matching Pursuit](https://en.wikipedia.org/wiki/Matching_pursuit) # In[ ]: # implement the minimization step here # Once the decomposition of the image in the dictionnary has been found, we can the update this dictionnary as # \begin{align*} # \underset{\mathbf{D}}{\operatorname{argmin}} \left\|\mathbf{Y} - \mathbf{D}\mathbf{S}\right\| # \end{align*} # which can be solved in closed form through the steps # \begin{align*} # \mathbf{D} = \mathbf{Y}\mathbf{S}^T\left(\mathbf{S}\mathbf{S}^T\right)^{-1} # \end{align*} # followed by the normalization of the atoms (colums of the dictionnary). # In[ ]: # add the dictionnary learning step below