# Helpful packages for working with images and factorizations using Pkg; Pkg.add("Images") using Pkg; Pkg.add("ImageMagick") # And this allows us to load JPEG-encoded images using Images, LinearAlgebra, Interact strang = download("https://ocw.mit.edu/faculty/gilbert-strang/strang-blue.jpg","strang.jpg") cb = download("https://i.barkpost.com/wp-content/uploads/2015/01/corgi2.jpg?q=70&fit=crop&crop=entropy&w=808&h=500","cb.jpg") s = load(strang) img = load(cb) channels = Float64.(channelview(s)); [ colorview(RGB, channels.*[1; 0; 0]) colorview(RGB, channels.*[0; 1; 0]) colorview(RGB, channels.*[0; 0; 1])] function rank_approx(M, k) U, s, V = svd(M) M = U[:, 1:k] * Diagonal(s[1:k]) * V[:, 1:k]' M = min.(max.(M, 0.0), 1.) # Clip to between 0 and 1 end n = 100 @manipulate for k ∈ slider(1:n,value=1) colorview( RGB, rank_approx(channels[1,:,:], k), rank_approx(channels[2,:,:], k), rank_approx(channels[3,:,:], k) ) end n = 100 @manipulate for r ∈ slider(1:n,value=1,label="r"), g ∈ slider(1:n,value=1,label="g"), b ∈ slider(1:n,value=1,label="b") colorview( RGB, rank_approx(channels[1,:,:], r), rank_approx(channels[2,:,:], g), rank_approx(channels[3,:,:], b) ) end