Calculating a cross-correlation in any number of dimensions:
for I in CartesianIndices(img)
for J in CartesianIndices(kernel) # kernel with centered indices
if I+J in CartesianIndices(img)
filtered[I] += img[I+J] * kernel[J]
end
end
end
(Inspired by Multidimensional algorithms and iteration and Knowing where you are: custom array indices in Julia)
The code in action:
using OffsetArrays
using Makie
# A 3D "image" of random values (either 0 or 1)
img = rand([0.0, 1.0], 20, 60, 40)
# Plot
s1 = volume(img, algorithm=:iso, resolution=(800, 500))
# Function to generate an N-dimensional kernel of uniform values that sum to 1
# The center of the hypercube will have indices (0, 0, ..., 0)
uniform_kernel(n, dim) = OffsetArray(fill(1/n^dim, fill(n, dim)...), fill(-nĂ·2-1, dim)...)
# 5x5x5 array of uniform values that sum to 1
kernel = uniform_kernel(5, 3) # 3 dimensions
filtered = zero(img)
for I in CartesianIndices(img)
for J in CartesianIndices(kernel)
if I+J in CartesianIndices(img)
filtered[I] += img[I+J] * kernel[J]
end
end
end
s2 = volume(filtered, algorithm=:iso, resolution=(800, 500))
Original image:
Filtered image: