using PyPlot using NtToolBox # using Autoreload # arequire("NtToolBox") n = 256*2; f0 = load_image("NtToolBox/src/data/hibiscus.png", n); figure(figsize=(5,5)) imageplot(f0) cconv = (f, h) -> real(plan_ifft((plan_fft(f)*f).*(plan_fft(h)*h))*((plan_fft(f)*f).*(plan_fft(h)*h))); # include("NtToolBox/src/ndgrid.jl") t = [collect(0 : Base.div(n, 2)); collect(-Base.div(n, 2) + 1 : -1)] (X2, X1) = meshgrid(t, t) normalize = h -> h./sum(h) h = sigma -> normalize(exp(-(X1.^2 + X2.^2)./(2*sigma^2))); blur = (f, sigma) -> cconv(f, h(sigma)); include("NtSolutions/segmentation_1_edge_detection/exo1.jl"); ## Insert your code here. s = [[n]; collect(1:n-1)] nabla = f -> cat(3, f - f[s, :], f - f[:, s]); v = nabla(f0); figure(figsize = (10, 10)) imageplot(v[:,:,1], L"\frac{d}{dx}", [1,2,1]) imageplot(v[:,:,2], L"\frac{d}{dy}", [1,2,2]); sigma = 1 d = sqrt(sum(nabla(blur(f0, sigma)).^2, 3)); figure(figsize=(5,5)) imageplot(d[:, :]); include("NtSolutions/segmentation_1_edge_detection/exo2.jl") ## Insert your code here. include("NtSolutions/segmentation_1_edge_detection/exo3.jl") ## Insert your code here. function diiv(v) v0 = v[:, :, 1] v1 = v[:, :, 2] t = [collect(2:n); [1]] return v0[t, :] - v0 + v1[:,t] - v1 end; delta = f -> diiv(nabla(f)); figure(figsize=(5,5)) imageplot(delta(f0)) dotp = (a, b) -> sum(a.*b) @sprintf("Should be 0: %.10f ", (dotp(nabla(f0), nabla(f0)) + dotp(delta(f0), f0))) sigma = 4 figure(figsize = (5, 5)) NtToolBox.plot_levelset(delta(blur(f0, sigma)), 0, f0) include("NtSolutions/segmentation_1_edge_detection/exo4.jl") ## Insert your code here. dx = f -> (f[s, :] - f[t, :])./2 dy = f -> transpose(dx(transpose(f))); s = [collect(2:n); [1]] t = [[n]; collect(1:n-1)] d2x = f -> f[s, :] + f[t, :] - 2.*f d2y = f -> transpose(d2x(transpose(f))) dxy = f -> dy(dx(f)); hessian = f -> cat(3, d2x(f), dxy(f), d2y(f)); sigma = 6 g = grad(blur(f0, sigma)); H = hessian(blur(f0, sigma)); a = H[:, :, 1:2].*cat(3, g[:, :, 1], g[:, :, 1]) + H[:, :, 2:3].*cat(3, g[:, :, 2], g[:, :, 2]); figure(figsize=(5,5)) NtToolBox.plot_levelset(sum(a.*g, 3)[:, :], 0, f0); include("NtSolutions/segmentation_1_edge_detection/exo5.jl") ## Insert your code here.