WNixalo 2018/3/8
Testing out some R-SVD on a burst of photos. From Unit 3 Lecture 4 of Fastai's Computational Linear Algebra course.
Photos were taken by me at breakfast. The steadier your hand and the more photos you have, the better. May need more work to get color photos working.
In [1]:
## Imports
%matplotlib inline
import cv2
import numpy as np
from sklearn import decomposition
import matplotlib.pyplot as plt
import os
In [2]:
## Loading Images from Disk
images_raw = [cv2.imread("data/burst_photos/"+impath)
for impath in os.listdir("data/burst_photos/")
if impath != '.DS_Store']
images_raw[0].shape
Out[2]:
In [3]:
## Converting Color and Resizing
# images = [cv2.cvtColor(img, cv2.COLOR_BGR2RGB) for img in images_raw] # color
images = [cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) for img in images_raw] # gray
images = [cv2.resize(img, (400,400)) for img in images]
In [4]:
## Sample Image in Grayscale
# plt.figure(figsize=(12,12))
plt.imshow(images[0], cmap='gray');
In [5]:
## Stack Images into 1 Matrix
M = np.vstack((img.flatten() for img in images)).T
In [6]:
M.shape
Out[6]:
In [7]:
## Displaying a reassembled image from the Matrix
# plt.figure(figsize=(10,10))
# plt.imshow(np.reshape(M[:,0], (400,400,3))); # color
plt.imshow(np.reshape(M[:,0], (400,400)), cmap='gray'); # gray
In [42]:
U, Σ, Vt = decomposition.randomized_svd(M, 1)
In [43]:
SVD_Matrix = U @ np.diag(Σ) @ Vt
In [40]:
SVD_Matrix.shape
Out[40]:
In [113]:
idx = 0
# SVD_image = np.reshape(SVD_Matrix[:,idx], (400,400,3)) # color
SVD_image = np.reshape(SVD_Matrix[:,idx], (400,400)) # gray
# plt.figure(figsize=(12,12))
plt.imshow(SVD_image, cmap='gray');
In [11]:
def show_random_image_pair(Matrix, SVD_Matrix):
n = Matrix.shape[-1]
idx = np.random.randint(0,n)
dims = (400,400) # (400,400,3) for color
plt.figure(figsize=(15,15))
plt.subplot(1,2,1)
plt.imshow(np.reshape(Matrix[:,idx], dims), cmap='gray')
plt.subplot(1,2,2)
plt.imshow(np.reshape(SVD_Matrix[:,idx], dims), cmap='gray')
In [105]:
show_random_image_pair(M, SVD_Matrix)
In [106]:
show_random_image_pair(M, SVD_Matrix)
In [107]:
show_random_image_pair(M, SVD_Matrix)
In [108]:
show_random_image_pair(M, SVD_Matrix)
In [28]:
def show_random_coffee_pair(Matrix, SVD_Matrix, idx=None):
n = Matrix.shape[-1]
if idx == None: idx = np.random.randint(0,n)
dims = (400,400) # (400,400,3) for color
plt.figure(figsize=(15,15))
plt.subplot(1,2,1)
plt.imshow(np.reshape(Matrix[:,idx], dims), cmap='gray')
plt.subplot(1,2,2)
plt.imshow(np.reshape(Matrix[:,idx] - SVD_Matrix[:,idx], dims), cmap='gray')
In [19]:
show_random_coffee_pair(M, SVD_Matrix)
In [21]:
show_random_coffee_pair(M, SVD_Matrix)
In [44]:
## rank 3
show_random_coffee_pair(M, SVD_Matrix, idx = 12)
Condtls in List Comprehensions:
Plotting:
Exporting Burst Photos iOS:
In [ ]: