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

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/aa57c55e26912d1fc9a636947b2f1650840b5539cd0684fed853b018cbe1d325.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/e20a3df6f74bd1222555b592e071dde07787d35190d12e539286c04fe1a80842.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/4c97697c8a158e2cc4fceebb31100cbdf1c4a3a3b26ba8690355b9ebc0b2a115.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/f0d181d23aa66f820777896a7fcdbc205ab84029fd3aad642f30bea947f4adbc.png

Using rsa to insert non-overlapping spheres into blobs#

Another way is to use rsa to insert spheres into the background of another image. Let’s use blobs to define the superstructure, the perforate it with holes:

im4 = ps.generators.rsa(im1, r=10, clearance=-2)
fig, ax = plt.subplots(1, 1, figsize=[6, 6])
ax.imshow(im4, interpolation='none')
ax.axis(False);
../../../_images/d3dd9e345c12597df73daf79c879fd224a1f1d4f5fc6286b0fa4219d8c196674.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.