Creating Multiscale Images

Sometimes it is useful or necessary to study processes across multiple scales. It is possible to generate artificial images with 2 scales of porosity fairly easily.

import porespy as ps
import matplotlib.pyplot as plt
[01:01:26] ERROR    PARDISO solver not installed, run `pip install pypardiso`. Otherwise,          _workspace.py:56
                    simulations will be slow. Apple M chips not supported.                                         

Using blobs of different blobiness

Start by creating one image at a large scale. Let’s use blobs to define the large scale ‘super-structure’:

im1 = ps.generators.blobs([500, 500], blobiness=0.5, porosity=0.6)
fig, ax = plt.subplots(1, 1, figsize=[6, 6])
ax.imshow(im1, interpolation='none')
ax.axis(False);
../../../_images/328e58a34f9b84a0dfa129e74c186d30fd2859355d27969c3b896096135ef674.png

Now we’ll can create a second image of blobs, but with a different scale. These will represent the ‘sub-structure’:

im2 = ps.generators.blobs([500, 500], blobiness=2.5, porosity=0.5)
fig, ax = plt.subplots(1, 1, figsize=[6, 6])
ax.imshow(im2, interpolation='none')
ax.axis(False);
../../../_images/3af875bb99e4d8dd3fdb507f40914d2c862109fb0be2955fdbdc012d2ae9abd9.png

Finally, we can multiply these two image (i.e. arrays) together, which will have the effect of perforating the foreground phase of im1 with holes defined by the background phase of im2. Note the inverting of the image to ensure the foreground and background are maintained:

im3 = ~(~im1*im2)
fig, ax = plt.subplots(1, 1, figsize=[6, 6])
ax.imshow(im3, interpolation='none')
ax.axis(False);
../../../_images/cf3a3302e143677df3c5f4bf298fcc277e70c60d622ffec9c9cb65b52a2ad6aa.png

The pore sizes can be analyzed using local_thickess, to confirm a bi-modal pore size distribution:

lt = ps.filters.local_thickness(im3)
psd = ps.metrics.pore_size_distribution(lt)
ps.visualization.bar(psd);
../../../_images/118a419ed3368baaf6639dce215f8eecc2a01c008738d84e7acf94747953384c.png

Using random_spheres to insert non-overlapping spheres into blobs

Another way is to use random_spheres to insert spheres into the foreground of another image. Let’s use blobs to define the superstructure, the perforate it with holes. Note that we invert the image (~) before passing it to random_spheres so that the holes are added to the solid phase, then the result is inverted back.

im1 = ps.generators.blobs([300, 300], blobiness=0.5, porosity=0.6)
im2 = ~ps.generators.random_spheres(im=~im1, r=10, clearance=-2)
fig, ax = plt.subplots(1, 1, figsize=[6, 6])
ax.imshow(im2, interpolation='none')
ax.axis(False);
../../../_images/b06c3c0f56ab06345c806581c5006b89316f4e6bc49657392c51aac633124225.png

Summary

The concept of generate multiple images and different scales then superimposing them is a very easy to make some simple multiscale images for prototyping and testing workflows that require multiscale images.