This page was generated from: notebooks/nanopores/how_to_select_a_region_of_interest_using_ffts.ipynb
[1]:
%load_ext autoreload
%autoreload 2
%config InlineBackend.rc = {'figure.figsize': (10,6)}
%matplotlib inline
Select a region of interest using FFTsο
This example shows how to crop an image using Nanomesh using the characteristics of an FFT to select a bbox matching the lattice of the crystal.
This example shows how to crop an image using sample data from nanomesh.data
.
If you want to use your own data, any numpy array can be passed to into an Image
object. This will create a `Volume
<https://nanomesh.readthedocs.io/en/latest/nanomesh.volume.html#nanomesh.volume.Volume>`__ or `Plane
<https://nanomesh.readthedocs.io/en/latest/nanomesh.plane.html#nanomesh.plane.Plane>`__ object depending on the data dimensions. Data stored as .npy
can be loaded using Image.load()
.
[2]:
from nanomesh import Image
from nanomesh.data import nanopores3d
data = nanopores3d()
vol = Image(data)
plane = vol.select_plane(x=161)
This operation takes the fft of the image, and creates a regular array of the recurring components. The distance between the peaks in the image correspond to the distance between the pores in the source image.
[3]:
import numpy as np
import matplotlib.pyplot as plt
def abs2(x):
return x.real**2 + x.imag**2
fft = np.fft.fft2(plane.image)
ifft = np.fft.ifft2(abs2(fft))
filtered = abs(ifft)
plt.figure()
plt.imshow(filtered)
plt.show()
Peak-findingο
Use a Difference of Gaussian to find the peaks in the image.
[4]:
from skimage import feature
peaks = feature.blob_dog(filtered,
min_sigma=10,
max_sigma=20,
overlap=1,
threshold=5)
peaks = peaks[:, 0:2]
x, y = peaks.T
plt.figure()
plt.imshow(filtered)
plt.scatter(y, x, color='red')
plt.show()
ROI pickingο
A Delauney triangulation is used to create a mesh out of the peaks. The mesh is subdivided once to create additional granularity for the point picking in the roi selection.
[5]:
from scipy.spatial import Delaunay
from nanomesh import TriangleMesh
tris = Delaunay(peaks)
triangles = TriangleMesh.from_scipy(tris)
The subdivision uses trimesh.
[6]:
trimesh = triangles.to_trimesh()
trimesh_subdivided = trimesh.subdivide()
triangles = TriangleMesh.from_trimesh(trimesh_subdivided)
The vertices are passed to the .select_roi
method to pick from.
By passing
from_points
, vertices snap to the nearest point (use βctrlβ to drag it away)Press the βescβ key to start a new polygon
Hold the βshiftβ key to move all of the vertices
Hold the βctrlβ key to move a single vertex
[7]:
roi = plane.select_roi(from_points=triangles.points)
The .bbox
attribute is updated when the selection above changes.
[8]:
roi.bbox
[8]:
array([[0, 0],
[0, 1],
[1, 1],
[1, 0]])
Use the .crop_to_roi
method to extract the region of interest.
[9]:
plane_roi = plane.crop_to_roi(bbox=roi.bbox)
plane_roi.show()
[9]:
<AxesSubplot:xlabel='x', ylabel='y'>