# 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
Updating registry at `~/.julia/registries/General` Updating git-repo `https://github.com/JuliaRegistries/General.git` [1mFetching: [========================================>] 99.9 %0.0 %Fetching: [======> ] 13.2 %> ] 25.6 %Fetching: [================> ] 38.1 % ] 56.8 % [============================> ] 69.3 % ] 87.5 % Resolving package versions... Installed CatIndices ──────────────── v0.2.1 Installed CoordinateTransformations ─ v0.5.0 Installed MKL_jll ─────────────────── v2019.0.117+2 Installed RangeArrays ─────────────── v0.3.2 Installed FFTViews ────────────────── v0.3.1 Installed Images ──────────────────── v0.22.0 Installed ImageQualityIndexes ─────── v0.1.3 Installed StatsBase ───────────────── v0.32.1 Installed CustomUnitRanges ────────── v1.0.0 Installed AxisAlgorithms ──────────── v1.0.0 Installed MappedArrays ────────────── v0.2.2 Installed SimpleTraits ────────────── v0.9.1 Installed ComputationalResources ──── v0.3.1 Installed ImageMorphology ─────────── v0.2.5 Installed ImageAxes ───────────────── v0.6.4 Installed PaddedViews ─────────────── v0.5.1 Installed ImageTransformations ────── v0.8.3 Installed Graphics ────────────────── v1.0.1 Installed IntervalSets ────────────── v0.4.0 Installed ColorVectorSpace ────────── v0.8.3 Installed FFTW_jll ────────────────── v3.3.9+4 Installed ZeroMQ_jll ──────────────── v4.3.2+0 Installed WoodburyMatrices ────────── v0.5.0 Installed OpenSpecFun_jll ─────────── v0.5.3+1 Installed TiledIteration ──────────── v0.2.4 Installed ImageFiltering ──────────── v0.6.11 Installed AbstractFFTs ────────────── v0.5.0 Installed Interpolations ──────────── v0.12.5 Installed ImageShow ───────────────── v0.2.3 Installed ImageMetadata ───────────── v0.9.0 Installed EllipsisNotation ────────── v0.4.0 Installed FileIO ──────────────────── v1.2.2 Installed IntelOpenMP_jll ─────────── v2018.0.3+0 Installed ImageCore ───────────────── v0.8.11 Installed SpecialFunctions ────────── v0.10.0 Installed AxisArrays ──────────────── v0.4.2 Installed IdentityRanges ──────────── v0.3.1 Installed OffsetArrays ────────────── v1.0.2 Installed Ratios ──────────────────── v0.4.0 Installed FFTW ────────────────────── v1.2.0 Installed Rotations ───────────────── v0.13.0 Installed ImageContrastAdjustment ─── v0.3.3 Installed Conda ───────────────────── v1.4.1 Installed IndirectArrays ──────────── v0.5.1 Installed ImageDistances ──────────── v0.2.7 Updating `~/.julia/environments/v1.3/Project.toml` [916415d5] + Images v0.22.0 Updating `~/.julia/environments/v1.3/Manifest.toml` [621f4979] + AbstractFFTs v0.5.0 [13072b0f] + AxisAlgorithms v1.0.0 [39de3d68] + AxisArrays v0.4.2 [aafaddc9] + CatIndices v0.2.1 [c3611d14] + ColorVectorSpace v0.8.3 [ed09eef8] + ComputationalResources v0.3.1 [8f4d0f93] ↑ Conda v1.3.0 ⇒ v1.4.1 [150eb455] + CoordinateTransformations v0.5.0 [dc8bdbbb] + CustomUnitRanges v1.0.0 [b4f34e82] + Distances v0.8.2 [da5c29d0] + EllipsisNotation v0.4.0 [4f61f5a4] + FFTViews v0.3.1 [7a1cc6ca] + FFTW v1.2.0 [f5851436] + FFTW_jll v3.3.9+4 [5789e2e9] + FileIO v1.2.2 [a2bd30eb] + Graphics v1.0.1 [bbac6d45] + IdentityRanges v0.3.1 [2803e5a7] + ImageAxes v0.6.4 [f332f351] + ImageContrastAdjustment v0.3.3 [a09fc81d] + ImageCore v0.8.11 [51556ac3] + ImageDistances v0.2.7 [6a3955dd] + ImageFiltering v0.6.11 [bc367c6b] + ImageMetadata v0.9.0 [787d08f9] + ImageMorphology v0.2.5 [2996bd0c] + ImageQualityIndexes v0.1.3 [4e3cecfd] + ImageShow v0.2.3 [02fcd773] + ImageTransformations v0.8.3 [916415d5] + Images v0.22.0 [9b13fd28] + IndirectArrays v0.5.1 [1d5cc7b8] + IntelOpenMP_jll v2018.0.3+0 [a98d9a8b] + Interpolations v0.12.5 [8197267c] + IntervalSets v0.4.0 [c8e1da08] + IterTools v1.3.0 [856f044c] + MKL_jll v2019.0.117+2 [dbb5928d] + MappedArrays v0.2.2 [6fe1bfb0] + OffsetArrays v1.0.2 [efe28fd5] + OpenSpecFun_jll v0.5.3+1 [5432bcbf] + PaddedViews v0.5.1 [d96e819e] + Parameters v0.12.0 [b3c3ace0] + RangeArrays v0.3.2 [c84ed2f1] + Ratios v0.4.0 [6038ab10] + Rotations v0.13.0 [699a6c99] + SimpleTraits v0.9.1 [276daf66] + SpecialFunctions v0.10.0 [2913bbd2] ↑ StatsBase v0.32.0 ⇒ v0.32.1 [06e1c1a7] + TiledIteration v0.2.4 [efce3f68] + WoodburyMatrices v0.5.0 [8f1865be] ↑ ZeroMQ_jll v4.3.1+0 ⇒ v4.3.2+0 Building FFTW ─→ `~/.julia/packages/FFTW/qqcBj/deps/build.log` Building Conda → `~/.julia/packages/Conda/3rPhK/deps/build.log` Resolving package versions... Installed Zlib_jll ──────── v1.2.11+8 Installed Libtiff_jll ───── v4.0.10+0 Installed Zstd_jll ──────── v1.4.4+0 Installed JpegTurbo_jll ─── v2.0.1+0 Installed libpng_jll ────── v1.6.37+2 Installed ImageMagick_jll ─ v6.9.10-12+0 Installed ImageMagick ───── v1.1.2 Updating `~/.julia/environments/v1.3/Project.toml` [6218d12a] + ImageMagick v1.1.2 Updating `~/.julia/environments/v1.3/Manifest.toml` [6218d12a] + ImageMagick v1.1.2 [c73af94c] + ImageMagick_jll v6.9.10-12+0 [aacddb02] + JpegTurbo_jll v2.0.1+0 [89763e89] + Libtiff_jll v4.0.10+0 [83775a58] + Zlib_jll v1.2.11+8 [3161d3a3] + Zstd_jll v1.4.4+0 [b53b4c65] + libpng_jll v1.6.37+2
┌ Info: Precompiling Images [916415d5-f1e6-5110-898d-aaa5f9f070e0] └ @ Base loading.jl:1273
Unable to load WebIO. Please make sure WebIO works for your Jupyter client. For troubleshooting, please see the WebIO/IJulia documentation.
We take a matrix $A$ and factorize it so that
$$A = USV^T$$where matrices $U$ and $V$ are orthogonal and hold our singular vectors. Matrix $S$ is diagonal and stores our singular values in decreasing order from top/left to bottom/right.
strang = download("https://ocw.mit.edu/faculty/gilbert-strang/strang-blue.jpg","strang.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")
"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
rank_approx (generic function with 1 method)
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