Note
Go to the end to download the full example code.
Background subtraction#
If your diffraction data is noisy, you might want to subtract the background from the dataset. Pyxem offers some built-in functionality for this, with the subtract_diffraction_background class method. Custom filtering is also possible, an example is shown in the ‘Filtering Data’-example.
import pyxem as pxm
import hyperspy.api as hs
s = pxm.data.tilt_boundary_data()
s_filtered = s.subtract_diffraction_background(
"difference of gaussians",
inplace=False,
min_sigma=3,
max_sigma=20,
)
s_filtered_h = s.subtract_diffraction_background("h-dome", inplace=False, h=0.7)
hs.plot.plot_images(
[s.inav[2, 2], s_filtered.inav[2, 2], s_filtered_h.inav[2, 2]],
label=["Original", "Difference of Gaussians", "H-Dome"],
tight_layout=True,
norm="symlog",
cmap="viridis",
colorbar=None,
)

[ ] | 0% Completed | 178.12 us
[ ] | 0% Completed | 109.71 ms
[ ] | 0% Completed | 210.07 ms
[ ] | 0% Completed | 310.43 ms
[ ] | 0% Completed | 410.77 ms
[ ] | 0% Completed | 511.07 ms
[ ] | 0% Completed | 611.37 ms
[ ] | 0% Completed | 711.66 ms
[ ] | 0% Completed | 811.95 ms
[ ] | 0% Completed | 912.24 ms
[ ] | 0% Completed | 1.01 s
[ ] | 0% Completed | 1.11 s
[ ] | 0% Completed | 1.21 s
[ ] | 0% Completed | 1.31 s
[ ] | 0% Completed | 1.41 s
[ ] | 0% Completed | 1.51 s
[ ] | 0% Completed | 1.61 s
[ ] | 0% Completed | 1.71 s
[ ] | 0% Completed | 1.81 s
[########################################] | 100% Completed | 1.92 s
/home/docs/checkouts/readthedocs.org/user_builds/pyxem/envs/v0.19.0/lib/python3.10/site-packages/hyperspy/misc/utils.py:1437: UserWarning: Possible precision loss converting image of type float32 to uint8 as required by rank filters. Convert manually using skimage.util.img_as_ubyte to silence this warning.
output = function(test_data, **kwargs)
[ ] | 0% Completed | 163.56 us/home/docs/checkouts/readthedocs.org/user_builds/pyxem/envs/v0.19.0/lib/python3.10/site-packages/hyperspy/misc/utils.py:1360: UserWarning: Possible precision loss converting image of type float32 to uint8 as required by rank filters. Convert manually using skimage.util.img_as_ubyte to silence this warning.
output_array[islice] = function(data[islice], **kwargs)
[ ] | 0% Completed | 113.47 ms
[ ] | 0% Completed | 213.76 ms
[ ] | 0% Completed | 314.05 ms
[ ] | 0% Completed | 414.33 ms
[ ] | 0% Completed | 514.62 ms
[ ] | 0% Completed | 614.91 ms
[ ] | 0% Completed | 715.19 ms
[ ] | 0% Completed | 815.48 ms
[ ] | 0% Completed | 915.78 ms
[ ] | 0% Completed | 1.02 s
[ ] | 0% Completed | 1.12 s
[ ] | 0% Completed | 1.22 s
[ ] | 0% Completed | 1.32 s
[ ] | 0% Completed | 1.42 s
[ ] | 0% Completed | 1.52 s
[ ] | 0% Completed | 1.62 s
[ ] | 0% Completed | 1.72 s
[ ] | 0% Completed | 1.82 s
[ ] | 0% Completed | 1.92 s
[ ] | 0% Completed | 2.02 s
[ ] | 0% Completed | 2.12 s
[ ] | 0% Completed | 2.22 s
[ ] | 0% Completed | 2.32 s
[ ] | 0% Completed | 2.42 s
[ ] | 0% Completed | 2.52 s
[ ] | 0% Completed | 2.62 s
[ ] | 0% Completed | 2.72 s
[ ] | 0% Completed | 2.82 s
[ ] | 0% Completed | 2.92 s
[ ] | 0% Completed | 3.02 s
[ ] | 0% Completed | 3.12 s
[ ] | 0% Completed | 3.22 s
[ ] | 0% Completed | 3.32 s
[ ] | 0% Completed | 3.42 s
[ ] | 0% Completed | 3.52 s
[ ] | 0% Completed | 3.62 s
[########################################] | 100% Completed | 3.72 s
[<Axes: title={'center': 'Original'}, xlabel='kx axis (px)', ylabel='ky axis (px)'>, <Axes: title={'center': 'Difference of Gaussians'}, xlabel='kx axis (px)', ylabel='ky axis (px)'>, <Axes: title={'center': 'H-Dome'}, xlabel='kx axis (px)', ylabel='ky axis (px)'>]
Filtering Polar Images#
The available methods differ for Diffraction2D datasets and PolarDiffraction2D datasets.
Set the center of the diffraction pattern to its default, i.e. the middle of the image
s.calibration.center = None
Transform to polar coordinates
s_polar = s.get_azimuthal_integral2d(npt=100, mean=True)
s_polar_filtered = s_polar.subtract_diffraction_background(
"radial median",
inplace=False,
)
s_polar_filtered2 = s_polar.subtract_diffraction_background(
"radial percentile",
percentile=70,
inplace=False,
)
hs.plot.plot_images(
[s_polar.inav[2, 2], s_polar_filtered.inav[2, 2], s_polar_filtered2.inav[2, 2]],
label=["Original (polar)", "Radial Median", "Radial Percentile"],
tight_layout=True,
norm="symlog",
cmap="viridis",
colorbar=None,
)

[ ] | 0% Completed | 191.46 us
[ ] | 0% Completed | 107.02 ms
[ ] | 0% Completed | 207.36 ms
[ ] | 0% Completed | 307.67 ms
[ ] | 0% Completed | 407.97 ms
[ ] | 0% Completed | 508.28 ms
[ ] | 0% Completed | 608.57 ms
[ ] | 0% Completed | 708.87 ms
[ ] | 0% Completed | 814.10 ms
[ ] | 0% Completed | 919.33 ms
[ ] | 0% Completed | 1.02 s
[########################################] | 100% Completed | 1.12 s
[ ] | 0% Completed | 158.75 us
[ ] | 0% Completed | 106.93 ms
[ ] | 0% Completed | 207.31 ms
[########################################] | 100% Completed | 307.71 ms
[ ] | 0% Completed | 157.39 us
[ ] | 0% Completed | 113.89 ms
[ ] | 0% Completed | 214.20 ms
[ ] | 0% Completed | 314.68 ms
[ ] | 0% Completed | 415.01 ms
[ ] | 0% Completed | 515.38 ms
[ ] | 0% Completed | 615.74 ms
[ ] | 0% Completed | 716.13 ms
[ ] | 0% Completed | 816.50 ms
[ ] | 0% Completed | 916.82 ms
[ ] | 0% Completed | 1.02 s
[ ] | 0% Completed | 1.12 s
[ ] | 0% Completed | 1.22 s
[ ] | 0% Completed | 1.32 s
[ ] | 0% Completed | 1.42 s
[ ] | 0% Completed | 1.52 s
[ ] | 0% Completed | 1.62 s
[ ] | 0% Completed | 1.72 s
[ ] | 0% Completed | 1.82 s
[ ] | 0% Completed | 1.92 s
[########################################] | 100% Completed | 2.02 s
[<Axes: title={'center': 'Original (polar)'}, xlabel='Radians axis (Rad)', ylabel='Radius axis (px)'>, <Axes: title={'center': 'Radial Median'}, xlabel='Radians axis (Rad)', ylabel='Radius axis (px)'>, <Axes: title={'center': 'Radial Percentile'}, xlabel='Radians axis (Rad)', ylabel='Radius axis (px)'>]
Total running time of the script: (0 minutes 30.379 seconds)