Source code for torchio.datasets.zone_plate

import numpy as np

from ..data import ScalarImage
from ..data.subject import Subject


[docs] class ZonePlate(Subject): """Synthetic data generated from a zone plate. The zone plate is a circular diffraction grating that produces concentric rings of light and dark bands. This dataset is useful for testing image processing algorithms, particularly those related to frequency analysis and interpolation. See equation 10.63 in `Practical Handbook on Image Processing for Scientific Applications <https://www.routledge.com/Practical-Handbook-on-Image-Processing-for-Scientific-and-Technical-Applications/Jahne/p/book/9780849319006?srsltid=AfmBOoptrtzILIlMx9FYqvx6UrGbevfD66x2k242iprFdn_CfyOWXjjH>`_ by Bernd Jähne. Args: size: The size of the generated image along all dimensions. """ def __init__(self, size: int = 501): if size < 3: raise ValueError('Size must be at least 3.') self.size = size image = self._generate_image(size) super().__init__(image=image) @staticmethod def _generate_image(size: int) -> ScalarImage: if size % 2 == 1: fin = (size - 1) // 2 ini = -fin else: fin = size // 2 ini = -fin + 1 x = np.arange(ini, fin) y = np.arange(ini, fin) z = np.arange(ini, fin) X, Y, Z = np.meshgrid(x, y, z) r = np.sqrt(X**2 + Y**2 + Z**2) km = 0.8 * np.pi rm = ini w = rm / 10 term1 = np.sin((km * r**2) / (2 * rm)) term2 = 0.5 * np.tanh((rm - r) / w) + 0.5 g = term1 * term2 affine = np.eye(4) origin = np.array([ini, ini, ini]) affine[:3, 3] = origin return ScalarImage(tensor=g[np.newaxis], affine=affine)