# 5. Block view functions¶

This example illustrates the use of ** view_as_blocks** function from the

**class. Block views can be incredibly useful when one wants to perform local operations on non-overlapping image patches.**

`skimage.util()`

We use the astronaut image from ** skimage.data** and virtually ‘slice’ it into square blocks. Then, on each block, we either pool the mean, the max or the median value of that block using the corresponding NumPy functions. The results are displayed together, along with a spline interpolation of order 3 rescaling of the original astronaut image (using SciPy

**method.**

`ndimage.zoom()`

```
import numpy as np
from scipy import ndimage as ndi
from matplotlib import pyplot as plt
import matplotlib.cm as cm
from skimage import data
from skimage import color
from skimage.util import view_as_blocks
```

## 5.1. Get the astronaut image from the `skimage.data`

in grayscale (use `color.rgb2gray()`

)¶

```
l = color.rgb2gray(data.astronaut())
```

```
plt.imshow(l,cmap=cm.Greys_r)
plt.show()
```

```
l.shape
```

```
(512, 512)
```

```
l.size
```

```
262144
```

## 5.2. Size of the blocks¶

```
block_shape = (4, 4)
```

## 5.3. Transform the image as a matrix of blocks (of shape `block_shape`

) and flatten. Examine shapes and sizes¶

```
view = view_as_blocks(l, block_shape)
```

```
view.size
```

```
262144
```

```
view.shape
```

```
(128, 128, 4, 4)
```

```
# collapse the last two dimensions in one
flatten_view = view.reshape(view.shape[0], view.shape[1], -1)
```

```
flatten_view.shape
```

```
(128, 128, 16)
```

```
flatten_view.size
```

```
262144
```

## 5.4. Resampling the image by taking either the `mean`

, the `max`

or the `median`

value of each blocks¶

```
mean_view = np.mean(flatten_view, axis=2)
max_view = np.max(flatten_view, axis=2)
median_view = np.median(flatten_view, axis=2)
```

## 5.5. Display resampled (and a zoomed version with spline interpolation) side by side¶

```
fig, axes = plt.subplots(2, 2, figsize=(8, 8), sharex=True, sharey=True)
ax = axes.ravel()
# Resized by spline interpolation (SciPy ndimage method)
l_resized = ndi.zoom(l, 2, order=3)
ax[0].set_title("Original rescaled with\n spline interpolation (order=3)")
ax[0].imshow(l_resized, extent=(0, 128, 128, 0), interpolation='nearest',
cmap=cm.Greys_r)
ax[1].set_title("Block view with\n local mean pooling")
ax[1].imshow(mean_view, interpolation='nearest', cmap=cm.Greys_r)
ax[2].set_title("Block view with\n local max pooling")
ax[2].imshow(max_view, interpolation='nearest', cmap=cm.Greys_r)
ax[3].set_title("Block view with\n local median pooling")
ax[3].imshow(median_view, interpolation='nearest', cmap=cm.Greys_r)
for a in ax:
a.set_axis_off()
fig.tight_layout()
plt.show()
```

## 5.6. Print the size of the sampled images vs. the re-sized (interpolated) image¶

```
print("Size of the resized image:", l_resized.size)
print("Size of the mean image:", mean_view.size)
print("Size of the max image:", max_view.size)
print("Size of the median image:", median_view.size)
```

```
Size of the resized image: 1048576
Size of the mean image: 16384
Size of the max image: 16384
Size of the median image: 16384
```