In [1]:
get_ipython().ast_node_interactivity = 'all'
import os
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
import math
from PIL import Image
import scipy.fftpack
import scipy.optimize
import random
from sklearn.linear_model import Lasso
matplotlib.rcParams['figure.dpi'] = 150

def show(img):
    _ = plt.imshow(img, cmap='gray')
    #_ = plt.colorbar()

def img_open(path):
    img = Image.open(path)
    img = img.convert('L')
    while img.width * img.height > 100 * 100:
        img = img.resize((int(img.width / 1.1), int(img.height / 1.1)))
    return np.array(img, dtype=np.uint8)
In [2]:
target = img_open("/home/leo/Downloads/cat.jpg")

W = target.shape[1]
H = target.shape[0]
In [3]:
show(target)
Out:
<Figure size 432x288 with 1 Axes>
In [4]:
received = int((W * H) * 0.25)
not_received = (W * H) - received

k = [True] * received + [False] * not_received
random.shuffle(k)
random.shuffle(k)
random.shuffle(k)
k = np.array(k)
In [5]:
show(target * k.reshape(target.shape))
Out:
<Figure size 432x288 with 1 Axes>
In [11]:
b = target.T.flat[k]
b = np.expand_dims(b, axis=1)
b.shape

A = np.kron(
    scipy.fftpack.idct(np.identity(W), norm='ortho', axis=0),
    scipy.fftpack.idct(np.identity(H), norm='ortho', axis=0)
    )
A = A[k,:] # same as phi times kron
A.shape


lasso = Lasso(alpha=0.001)
lasso.fit(A, b)
Out [11]:
(2180, 1)
Out [11]:
(2180, 8720)
Out [11]:
Lasso(alpha=0.001)
In [7]:
def idct2(x):
    return scipy.fftpack.idct(scipy.fftpack.idct(x.T, norm='ortho', axis=0).T, norm='ortho', axis=0)


Xat = np.array(lasso.coef_).reshape(W, H).T # stack columns
# Get the reconstructed image
Xa = idct2(Xat)

# normalize
_min = np.min(Xa)
_max = np.max(Xa)
Xa = np.interp(Xa, (_min, _max), (0, 1))

show(Xa)
Out:
<Figure size 432x288 with 1 Axes>