using Images, ImageView, TestImages using Plots lena = testimage("lena_color_256") plot(lena, fmt=:png) lena = YCbCr.(lena) lena_arr = channelview(lena) p_y = heatmap(reverse(lena_arr[1,:,:], dims=1), title="Y(Luma)", color=:grays) p_cb = heatmap(reverse(lena_arr[2,:,:], dims=1), title="Cb", color=:grays) p_cr = heatmap(reverse(lena_arr[3,:,:], dims=1), title="Cr", color=:grays) plot(p_y, p_cb, p_cr, layout=(1, 3), size=(1200, 300), fmt=:png) bs = 32 # block size s = 1 e = s + bs - 1 plot(lena[s:e,s:e], fmt=:png) x_min = minimum(lena_arr[1,s:e,s:e]) x_max = maximum(lena_arr[1,s:e,s:e]) # Cb x = vec(lena_arr[1,s:e,s:e]) y = vec(lena_arr[2,s:e,s:e]) scatter(x, y, label="Cb", xlabel="Luma", ylabel="Chroma") cb_a = (bs*bs*sum(x.*y) - sum(x)*sum(y)) / (sum(bs*bs*(x.^2)) - sum(x)^2) cb_b = (sum(y) - cb_a * sum(x)) / (bs*bs) x = range(x_min, x_max, length=1000) y = cb_a .* x .+ cb_b plot!(x, y, label="Cb prediction") x = vec(lena_arr[1,s:e,s:e]) y = vec(lena_arr[3,s:e,s:e]) scatter!(x, y, label="Cr") cr_a = (bs*bs*sum(x.*y) - sum(x)*sum(y)) / (sum(bs*bs*(x.^2)) - sum(x)^2) cr_b = (sum(y) - cr_a * sum(x)) / (bs*bs) x = range(x_min, x_max, length=1000) y = cr_a .* x .+ cr_b plot!(x, y, label="Cr prediction", fmt=:png) function cfl(img_arr, bs=8) nc, h, w = size(img_arr) img_arr_est = zeros((nc, h, w)) for i in 1:Int(h/bs) si = (i-1)*bs + 1 ei = i*bs for j in 1:Int(w/bs) sj = (j-1)*bs + 1 ej = j*bs img_arr_tmp = img_arr[:, si:ei, sj:ej] # Cb x = vec(img_arr_tmp[1, :, :]) y = vec(img_arr_tmp[2, :, :]) cb_a = (bs*bs*sum(x.*y) - sum(x)*sum(y)) / (sum(bs*bs*(x.^2)) - sum(x)^2) cb_b = (sum(y) - cb_a * sum(x)) / (bs*bs) # Cr x = vec(img_arr_tmp[1, :, :]) y = vec(img_arr_tmp[3, :, :]) cr_a = (bs*bs*sum(x.*y) - sum(x)*sum(y)) / (sum(bs*bs*(x.^2)) - sum(x)^2) cr_b = (sum(y) - cr_a * sum(x)) / (bs*bs) x = img_arr_tmp[1, :, :] cb_est = cb_a .* x .+ cb_b cr_est = cr_a .* x .+ cr_b img_arr_est_tmp = zeros((3, bs, bs)) img_arr_est_tmp[1,:,:] .= x img_arr_est_tmp[2,:,:] .= cb_est img_arr_est_tmp[3,:,:] .= cr_est img_arr_est[:, si:ei, sj:ej] .= img_arr_est_tmp end end img_arr_est end p_org = plot(colorview(YCbCr, lena_arr), title="origin") p8 = plot(colorview(YCbCr, cfl(lena_arr, 8)), title="CfL(block size 8)") p16 = plot(colorview(YCbCr, cfl(lena_arr, 16)), title="CfL(block size 16)") p32 = plot(colorview(YCbCr, cfl(lena_arr, 32)), title="CfL(block size 32)") plot(p_org, p8, p16, p32, layout = (1, 4), size = (1200, 300), fmt=:png)