pub fn render_hist_grid(star_side: u32, grid: &View3d<'_, f32>, signed: bool) -> Image<Luma<u8>> {
    let width = grid.lengths[1] as u32 * star_side;
    let height = grid.lengths[2] as u32 * star_side;
    let mut out = Image::new(width, height);

    for y in 0..grid.lengths[2] {
        let y_window = y as u32 * star_side;
        for x in 0..grid.lengths[1] {
            let x_window = x as u32 * star_side;
            let mut window = out.sub_image(x_window, y_window, star_side, star_side);
            let hist = grid.inner_slice(x, y);
            draw_star_mut(window.inner_mut(), hist, signed);
        }
    }

    out
}
Visualises an array of orientation histograms.
The dimensions of the provided Array3d are orientation bucket,
horizontal location of the cell, then vertical location of the cell.
Note that we ignore block-level aggregation or normalisation here.
Each rendered star has side length `star_side`, so the image will have
width `grid.lengths[1] * star_side` and height `grid.lengths[2] * star_side`.
src/hog.rs