| | import math |
| | import numpy as np |
| | import random |
| | from scipy.ndimage.interpolation import shift |
| | from scipy.stats import multivariate_normal |
| |
|
| |
|
| | def sigma_matrix2(sig_x, sig_y, theta): |
| | """Calculate the rotated sigma matrix (two dimensional matrix). |
| | Args: |
| | sig_x (float): |
| | sig_y (float): |
| | theta (float): Radian measurement. |
| | Returns: |
| | ndarray: Rotated sigma matrix. |
| | """ |
| | D = np.array([[sig_x**2, 0], [0, sig_y**2]]) |
| | U = np.array([[np.cos(theta), -np.sin(theta)], |
| | [np.sin(theta), np.cos(theta)]]) |
| | return np.dot(U, np.dot(D, U.T)) |
| |
|
| |
|
| | def mesh_grid(kernel_size): |
| | """Generate the mesh grid, centering at zero. |
| | Args: |
| | kernel_size (int): |
| | Returns: |
| | xy (ndarray): with the shape (kernel_size, kernel_size, 2) |
| | xx (ndarray): with the shape (kernel_size, kernel_size) |
| | yy (ndarray): with the shape (kernel_size, kernel_size) |
| | """ |
| | ax = np.arange(-kernel_size // 2 + 1., kernel_size // 2 + 1.) |
| | xx, yy = np.meshgrid(ax, ax) |
| | xy = np.hstack((xx.reshape((kernel_size * kernel_size, 1)), |
| | yy.reshape(kernel_size * kernel_size, |
| | 1))).reshape(kernel_size, kernel_size, 2) |
| | return xy, xx, yy |
| |
|
| |
|
| | def pdf2(sigma_matrix, grid): |
| | """Calculate PDF of the bivariate Gaussian distribution. |
| | Args: |
| | sigma_matrix (ndarray): with the shape (2, 2) |
| | grid (ndarray): generated by :func:`mesh_grid`, |
| | with the shape (K, K, 2), K is the kernel size. |
| | Returns: |
| | kernel (ndarrray): un-normalized kernel. |
| | """ |
| | inverse_sigma = np.linalg.inv(sigma_matrix) |
| | kernel = np.exp(-0.5 * np.sum(np.dot(grid, inverse_sigma) * grid, 2)) |
| | return kernel |
| |
|
| |
|
| | def cdf2(D, grid): |
| | """Calculate the CDF of the standard bivariate Gaussian distribution. |
| | Used in skewed Gaussian distribution. |
| | Args: |
| | D (ndarrasy): skew matrix. |
| | grid (ndarray): generated by :func:`mesh_grid`, |
| | with the shape (K, K, 2), K is the kernel size. |
| | Returns: |
| | cdf (ndarray): skewed cdf. |
| | """ |
| | rv = multivariate_normal([0, 0], [[1, 0], [0, 1]]) |
| | grid = np.dot(grid, D) |
| | cdf = rv.cdf(grid) |
| | return cdf |
| |
|
| |
|
| | def bivariate_skew_Gaussian(kernel_size, sig_x, sig_y, theta, D, grid=None): |
| | """Generate a bivariate skew Gaussian kernel. |
| | Described in `A multivariate skew normal distribution`_ by Shi et. al (2004). |
| | Args: |
| | kernel_size (int): |
| | sig_x (float): |
| | sig_y (float): |
| | theta (float): Radian measurement. |
| | D (ndarrasy): skew matrix. |
| | grid (ndarray, optional): generated by :func:`mesh_grid`, |
| | with the shape (K, K, 2), K is the kernel size. Default: None |
| | Returns: |
| | kernel (ndarray): normalized kernel. |
| | .. _A multivariate skew normal distribution: |
| | https://www.sciencedirect.com/science/article/pii/S0047259X03001313 |
| | """ |
| | if grid is None: |
| | grid, _, _ = mesh_grid(kernel_size) |
| | sigma_matrix = sigma_matrix2(sig_x, sig_y, theta) |
| | pdf = pdf2(sigma_matrix, grid) |
| | cdf = cdf2(D, grid) |
| | kernel = pdf * cdf |
| | kernel = kernel / np.sum(kernel) |
| | return kernel |
| |
|
| |
|
| | def mass_center_shift(kernel_size, kernel): |
| | """Calculate the shift of the mass center of a kenrel. |
| | Args: |
| | kernel_size (int): |
| | kernel (ndarray): normalized kernel. |
| | Returns: |
| | delta_h (float): |
| | delta_w (float): |
| | """ |
| | ax = np.arange(-kernel_size // 2 + 1., kernel_size // 2 + 1.) |
| | col_sum, row_sum = np.sum(kernel, axis=0), np.sum(kernel, axis=1) |
| | delta_h = np.dot(row_sum, ax) |
| | delta_w = np.dot(col_sum, ax) |
| | return delta_h, delta_w |
| |
|
| |
|
| | def bivariate_skew_Gaussian_center(kernel_size, |
| | sig_x, |
| | sig_y, |
| | theta, |
| | D, |
| | grid=None): |
| | """Generate a bivariate skew Gaussian kernel at center. Shift with nearest padding. |
| | Args: |
| | kernel_size (int): |
| | sig_x (float): |
| | sig_y (float): |
| | theta (float): Radian measurement. |
| | D (ndarrasy): skew matrix. |
| | grid (ndarray, optional): generated by :func:`mesh_grid`, |
| | with the shape (K, K, 2), K is the kernel size. Default: None |
| | Returns: |
| | kernel (ndarray): centered and normalized kernel. |
| | """ |
| | if grid is None: |
| | grid, _, _ = mesh_grid(kernel_size) |
| | kernel = bivariate_skew_Gaussian(kernel_size, sig_x, sig_y, theta, D, grid) |
| | delta_h, delta_w = mass_center_shift(kernel_size, kernel) |
| | kernel = shift(kernel, [-delta_h, -delta_w], mode='nearest') |
| | kernel = kernel / np.sum(kernel) |
| | return kernel |
| |
|
| |
|
| | def bivariate_anisotropic_Gaussian(kernel_size, |
| | sig_x, |
| | sig_y, |
| | theta, |
| | grid=None): |
| | """Generate a bivariate anisotropic Gaussian kernel. |
| | Args: |
| | kernel_size (int): |
| | sig_x (float): |
| | sig_y (float): |
| | theta (float): Radian measurement. |
| | grid (ndarray, optional): generated by :func:`mesh_grid`, |
| | with the shape (K, K, 2), K is the kernel size. Default: None |
| | Returns: |
| | kernel (ndarray): normalized kernel. |
| | """ |
| | if grid is None: |
| | grid, _, _ = mesh_grid(kernel_size) |
| | sigma_matrix = sigma_matrix2(sig_x, sig_y, theta) |
| | kernel = pdf2(sigma_matrix, grid) |
| | kernel = kernel / np.sum(kernel) |
| | return kernel |
| |
|
| |
|
| | def bivariate_isotropic_Gaussian(kernel_size, sig, grid=None): |
| | """Generate a bivariate isotropic Gaussian kernel. |
| | Args: |
| | kernel_size (int): |
| | sig (float): |
| | grid (ndarray, optional): generated by :func:`mesh_grid`, |
| | with the shape (K, K, 2), K is the kernel size. Default: None |
| | Returns: |
| | kernel (ndarray): normalized kernel. |
| | """ |
| | if grid is None: |
| | grid, _, _ = mesh_grid(kernel_size) |
| | sigma_matrix = np.array([[sig**2, 0], [0, sig**2]]) |
| | kernel = pdf2(sigma_matrix, grid) |
| | kernel = kernel / np.sum(kernel) |
| | return kernel |
| |
|
| |
|
| | def bivariate_generalized_Gaussian(kernel_size, |
| | sig_x, |
| | sig_y, |
| | theta, |
| | beta, |
| | grid=None): |
| | """Generate a bivariate generalized Gaussian kernel. |
| | Described in `Parameter Estimation For Multivariate Generalized Gaussian Distributions`_ |
| | by Pascal et. al (2013). |
| | Args: |
| | kernel_size (int): |
| | sig_x (float): |
| | sig_y (float): |
| | theta (float): Radian measurement. |
| | beta (float): shape parameter, beta = 1 is the normal distribution. |
| | grid (ndarray, optional): generated by :func:`mesh_grid`, |
| | with the shape (K, K, 2), K is the kernel size. Default: None |
| | Returns: |
| | kernel (ndarray): normalized kernel. |
| | .. _Parameter Estimation For Multivariate Generalized Gaussian Distributions: |
| | https://arxiv.org/abs/1302.6498 |
| | """ |
| | if grid is None: |
| | grid, _, _ = mesh_grid(kernel_size) |
| | sigma_matrix = sigma_matrix2(sig_x, sig_y, theta) |
| | inverse_sigma = np.linalg.inv(sigma_matrix) |
| | kernel = np.exp( |
| | -0.5 * np.power(np.sum(np.dot(grid, inverse_sigma) * grid, 2), beta)) |
| | kernel = kernel / np.sum(kernel) |
| | return kernel |
| |
|
| |
|
| | def bivariate_plateau_type1(kernel_size, sig_x, sig_y, theta, beta, grid=None): |
| | """Generate a plateau-like anisotropic kernel. |
| | 1 / (1+x^(beta)) |
| | Args: |
| | kernel_size (int): |
| | sig_x (float): |
| | sig_y (float): |
| | theta (float): Radian measurement. |
| | beta (float): shape parameter, beta = 1 is the normal distribution. |
| | grid (ndarray, optional): generated by :func:`mesh_grid`, |
| | with the shape (K, K, 2), K is the kernel size. Default: None |
| | Returns: |
| | kernel (ndarray): normalized kernel. |
| | """ |
| | if grid is None: |
| | grid, _, _ = mesh_grid(kernel_size) |
| | sigma_matrix = sigma_matrix2(sig_x, sig_y, theta) |
| | inverse_sigma = np.linalg.inv(sigma_matrix) |
| | kernel = np.reciprocal( |
| | np.power(np.sum(np.dot(grid, inverse_sigma) * grid, 2), beta) + 1) |
| | kernel = kernel / np.sum(kernel) |
| | return kernel |
| |
|
| |
|
| | def bivariate_plateau_type1_iso(kernel_size, sig, beta, grid=None): |
| | """Generate a plateau-like isotropic kernel. |
| | 1 / (1+x^(beta)) |
| | Args: |
| | kernel_size (int): |
| | sig (float): |
| | beta (float): shape parameter, beta = 1 is the normal distribution. |
| | grid (ndarray, optional): generated by :func:`mesh_grid`, |
| | with the shape (K, K, 2), K is the kernel size. Default: None |
| | Returns: |
| | kernel (ndarray): normalized kernel. |
| | """ |
| | if grid is None: |
| | grid, _, _ = mesh_grid(kernel_size) |
| | sigma_matrix = np.array([[sig**2, 0], [0, sig**2]]) |
| | inverse_sigma = np.linalg.inv(sigma_matrix) |
| | kernel = np.reciprocal( |
| | np.power(np.sum(np.dot(grid, inverse_sigma) * grid, 2), beta) + 1) |
| | kernel = kernel / np.sum(kernel) |
| | return kernel |
| |
|
| |
|
| | def random_bivariate_skew_Gaussian_center(kernel_size, |
| | sigma_x_range, |
| | sigma_y_range, |
| | rotation_range, |
| | noise_range=None, |
| | strict=False): |
| | """Randomly generate bivariate skew Gaussian kernels at center. |
| | Args: |
| | kernel_size (int): |
| | sigma_x_range (tuple): [0.6, 5] |
| | sigma_y_range (tuple): [0.6, 5] |
| | rotation range (tuple): [-math.pi, math.pi] |
| | noise_range(tuple, optional): multiplicative kernel noise, [0.75, 1.25]. Default: None |
| | Returns: |
| | kernel (ndarray): |
| | """ |
| | assert kernel_size % 2 == 1, 'Kernel size must be an odd number.' |
| | assert sigma_x_range[0] < sigma_x_range[1], 'Wrong sigma_x_range.' |
| | assert sigma_y_range[0] < sigma_y_range[1], 'Wrong sigma_y_range.' |
| | assert rotation_range[0] < rotation_range[1], 'Wrong rotation_range.' |
| | sigma_x = np.random.uniform(sigma_x_range[0], sigma_x_range[1]) |
| | sigma_y = np.random.uniform(sigma_y_range[0], sigma_y_range[1]) |
| | if strict: |
| | sigma_max = np.max([sigma_x, sigma_y]) |
| | sigma_min = np.min([sigma_x, sigma_y]) |
| | sigma_x, sigma_y = sigma_max, sigma_min |
| | rotation = np.random.uniform(rotation_range[0], rotation_range[1]) |
| |
|
| | sigma_max = np.max([sigma_x, sigma_y]) |
| | thres = 3 / sigma_max |
| | D = [[np.random.uniform(-thres, thres), |
| | np.random.uniform(-thres, thres)], |
| | [np.random.uniform(-thres, thres), |
| | np.random.uniform(-thres, thres)]] |
| |
|
| | kernel = bivariate_skew_Gaussian_center(kernel_size, sigma_x, sigma_y, |
| | rotation, D) |
| |
|
| | |
| | if noise_range is not None: |
| | assert noise_range[0] < noise_range[1], 'Wrong noise range.' |
| | noise = np.random.uniform( |
| | noise_range[0], noise_range[1], size=kernel.shape) |
| | kernel = kernel * noise |
| | kernel = kernel / np.sum(kernel) |
| | if strict: |
| | return kernel, sigma_x, sigma_y, rotation, D |
| | else: |
| | return kernel |
| |
|
| |
|
| | def random_bivariate_anisotropic_Gaussian(kernel_size, |
| | sigma_x_range, |
| | sigma_y_range, |
| | rotation_range, |
| | noise_range=None, |
| | strict=False): |
| | """Randomly generate bivariate anisotropic Gaussian kernels. |
| | Args: |
| | kernel_size (int): |
| | sigma_x_range (tuple): [0.6, 5] |
| | sigma_y_range (tuple): [0.6, 5] |
| | rotation range (tuple): [-math.pi, math.pi] |
| | noise_range(tuple, optional): multiplicative kernel noise, [0.75, 1.25]. Default: None |
| | Returns: |
| | kernel (ndarray): |
| | """ |
| | assert kernel_size % 2 == 1, 'Kernel size must be an odd number.' |
| | assert sigma_x_range[0] < sigma_x_range[1], 'Wrong sigma_x_range.' |
| | assert sigma_y_range[0] < sigma_y_range[1], 'Wrong sigma_y_range.' |
| | assert rotation_range[0] < rotation_range[1], 'Wrong rotation_range.' |
| | sigma_x = np.random.uniform(sigma_x_range[0], sigma_x_range[1]) |
| | sigma_y = np.random.uniform(sigma_y_range[0], sigma_y_range[1]) |
| | if strict: |
| | sigma_max = np.max([sigma_x, sigma_y]) |
| | sigma_min = np.min([sigma_x, sigma_y]) |
| | sigma_x, sigma_y = sigma_max, sigma_min |
| | rotation = np.random.uniform(rotation_range[0], rotation_range[1]) |
| |
|
| | kernel = bivariate_anisotropic_Gaussian(kernel_size, sigma_x, sigma_y, |
| | rotation) |
| |
|
| | |
| | if noise_range is not None: |
| | assert noise_range[0] < noise_range[1], 'Wrong noise range.' |
| | noise = np.random.uniform( |
| | noise_range[0], noise_range[1], size=kernel.shape) |
| | kernel = kernel * noise |
| | kernel = kernel / np.sum(kernel) |
| | if strict: |
| | return kernel, sigma_x, sigma_y, rotation |
| | else: |
| | return kernel |
| |
|
| |
|
| | def random_bivariate_isotropic_Gaussian(kernel_size, |
| | sigma_range, |
| | noise_range=None, |
| | strict=False): |
| | """Randomly generate bivariate isotropic Gaussian kernels. |
| | Args: |
| | kernel_size (int): |
| | sigma_range (tuple): [0.6, 5] |
| | noise_range(tuple, optional): multiplicative kernel noise, [0.75, 1.25]. Default: None |
| | Returns: |
| | kernel (ndarray): |
| | """ |
| | assert kernel_size % 2 == 1, 'Kernel size must be an odd number.' |
| | assert sigma_range[0] < sigma_range[1], 'Wrong sigma_x_range.' |
| | sigma = np.random.uniform(sigma_range[0], sigma_range[1]) |
| |
|
| | kernel = bivariate_isotropic_Gaussian(kernel_size, sigma) |
| |
|
| | |
| | if noise_range is not None: |
| | assert noise_range[0] < noise_range[1], 'Wrong noise range.' |
| | noise = np.random.uniform( |
| | noise_range[0], noise_range[1], size=kernel.shape) |
| | kernel = kernel * noise |
| | kernel = kernel / np.sum(kernel) |
| | if strict: |
| | return kernel, sigma |
| | else: |
| | return kernel |
| |
|
| |
|
| | def random_bivariate_generalized_Gaussian(kernel_size, |
| | sigma_x_range, |
| | sigma_y_range, |
| | rotation_range, |
| | beta_range, |
| | noise_range=None, |
| | strict=False): |
| | """Randomly generate bivariate generalized Gaussian kernels. |
| | Args: |
| | kernel_size (int): |
| | sigma_x_range (tuple): [0.6, 5] |
| | sigma_y_range (tuple): [0.6, 5] |
| | rotation range (tuple): [-math.pi, math.pi] |
| | beta_range (tuple): [0.5, 8] |
| | noise_range(tuple, optional): multiplicative kernel noise, [0.75, 1.25]. Default: None |
| | Returns: |
| | kernel (ndarray): |
| | """ |
| | assert kernel_size % 2 == 1, 'Kernel size must be an odd number.' |
| | assert sigma_x_range[0] < sigma_x_range[1], 'Wrong sigma_x_range.' |
| | assert sigma_y_range[0] < sigma_y_range[1], 'Wrong sigma_y_range.' |
| | assert rotation_range[0] < rotation_range[1], 'Wrong rotation_range.' |
| | sigma_x = np.random.uniform(sigma_x_range[0], sigma_x_range[1]) |
| | sigma_y = np.random.uniform(sigma_y_range[0], sigma_y_range[1]) |
| | if strict: |
| | sigma_max = np.max([sigma_x, sigma_y]) |
| | sigma_min = np.min([sigma_x, sigma_y]) |
| | sigma_x, sigma_y = sigma_max, sigma_min |
| | rotation = np.random.uniform(rotation_range[0], rotation_range[1]) |
| | if np.random.uniform() < 0.5: |
| | beta = np.random.uniform(beta_range[0], 1) |
| | else: |
| | beta = np.random.uniform(1, beta_range[1]) |
| |
|
| | kernel = bivariate_generalized_Gaussian(kernel_size, sigma_x, sigma_y, |
| | rotation, beta) |
| |
|
| | |
| | if noise_range is not None: |
| | assert noise_range[0] < noise_range[1], 'Wrong noise range.' |
| | noise = np.random.uniform( |
| | noise_range[0], noise_range[1], size=kernel.shape) |
| | kernel = kernel * noise |
| | kernel = kernel / np.sum(kernel) |
| | if strict: |
| | return kernel, sigma_x, sigma_y, rotation, beta |
| | else: |
| | return kernel |
| |
|
| |
|
| | def random_bivariate_plateau_type1(kernel_size, |
| | sigma_x_range, |
| | sigma_y_range, |
| | rotation_range, |
| | beta_range, |
| | noise_range=None, |
| | strict=False): |
| | """Randomly generate bivariate plateau type1 kernels. |
| | Args: |
| | kernel_size (int): |
| | sigma_x_range (tuple): [0.6, 5] |
| | sigma_y_range (tuple): [0.6, 5] |
| | rotation range (tuple): [-math.pi/2, math.pi/2] |
| | beta_range (tuple): [1, 4] |
| | noise_range(tuple, optional): multiplicative kernel noise, [0.75, 1.25]. Default: None |
| | Returns: |
| | kernel (ndarray): |
| | """ |
| | assert kernel_size % 2 == 1, 'Kernel size must be an odd number.' |
| | assert sigma_x_range[0] < sigma_x_range[1], 'Wrong sigma_x_range.' |
| | assert sigma_y_range[0] < sigma_y_range[1], 'Wrong sigma_y_range.' |
| | assert rotation_range[0] < rotation_range[1], 'Wrong rotation_range.' |
| | sigma_x = np.random.uniform(sigma_x_range[0], sigma_x_range[1]) |
| | sigma_y = np.random.uniform(sigma_y_range[0], sigma_y_range[1]) |
| | if strict: |
| | sigma_max = np.max([sigma_x, sigma_y]) |
| | sigma_min = np.min([sigma_x, sigma_y]) |
| | sigma_x, sigma_y = sigma_max, sigma_min |
| | rotation = np.random.uniform(rotation_range[0], rotation_range[1]) |
| | if np.random.uniform() < 0.5: |
| | beta = np.random.uniform(beta_range[0], 1) |
| | else: |
| | beta = np.random.uniform(1, beta_range[1]) |
| |
|
| | kernel = bivariate_plateau_type1(kernel_size, sigma_x, sigma_y, rotation, |
| | beta) |
| |
|
| | |
| | if noise_range is not None: |
| | assert noise_range[0] < noise_range[1], 'Wrong noise range.' |
| | noise = np.random.uniform( |
| | noise_range[0], noise_range[1], size=kernel.shape) |
| | kernel = kernel * noise |
| | kernel = kernel / np.sum(kernel) |
| | if strict: |
| | return kernel, sigma_x, sigma_y, rotation, beta |
| | else: |
| | return kernel |
| |
|
| |
|
| | def random_bivariate_plateau_type1_iso(kernel_size, |
| | sigma_range, |
| | beta_range, |
| | noise_range=None, |
| | strict=False): |
| | """Randomly generate bivariate plateau type1 kernels (iso). |
| | Args: |
| | kernel_size (int): |
| | sigma_range (tuple): [0.6, 5] |
| | beta_range (tuple): [1, 4] |
| | noise_range(tuple, optional): multiplicative kernel noise, [0.75, 1.25]. Default: None |
| | Returns: |
| | kernel (ndarray): |
| | """ |
| | assert kernel_size % 2 == 1, 'Kernel size must be an odd number.' |
| | assert sigma_range[0] < sigma_range[1], 'Wrong sigma_x_range.' |
| | sigma = np.random.uniform(sigma_range[0], sigma_range[1]) |
| | beta = np.random.uniform(beta_range[0], beta_range[1]) |
| |
|
| | kernel = bivariate_plateau_type1_iso(kernel_size, sigma, beta) |
| |
|
| | |
| | if noise_range is not None: |
| | assert noise_range[0] < noise_range[1], 'Wrong noise range.' |
| | noise = np.random.uniform( |
| | noise_range[0], noise_range[1], size=kernel.shape) |
| | kernel = kernel * noise |
| | kernel = kernel / np.sum(kernel) |
| | if strict: |
| | return kernel, sigma, beta |
| | else: |
| | return kernel |
| |
|
| |
|
| | def random_mixed_kernels(kernel_list, |
| | kernel_prob, |
| | kernel_size=21, |
| | sigma_x_range=[0.6, 5], |
| | sigma_y_range=[0.6, 5], |
| | rotation_range=[-math.pi, math.pi], |
| | beta_range=[0.5, 8], |
| | noise_range=None): |
| | """Randomly generate mixed kernels. |
| | Args: |
| | kernel_list (tuple): a list name of kenrel types, |
| | support ['iso', 'aniso', 'skew', 'generalized', 'plateau_iso', 'plateau_aniso'] |
| | kernel_prob (tuple): corresponding kernel probability for each kernel type |
| | kernel_size (int): |
| | sigma_x_range (tuple): [0.6, 5] |
| | sigma_y_range (tuple): [0.6, 5] |
| | rotation range (tuple): [-math.pi, math.pi] |
| | beta_range (tuple): [0.5, 8] |
| | noise_range(tuple, optional): multiplicative kernel noise, [0.75, 1.25]. Default: None |
| | Returns: |
| | kernel (ndarray): |
| | """ |
| | kernel_type = random.choices(kernel_list, kernel_prob)[0] |
| | if kernel_type == 'iso': |
| | kernel = random_bivariate_isotropic_Gaussian( |
| | kernel_size, sigma_x_range, noise_range=noise_range) |
| | elif kernel_type == 'aniso': |
| | kernel = random_bivariate_anisotropic_Gaussian( |
| | kernel_size, |
| | sigma_x_range, |
| | sigma_y_range, |
| | rotation_range, |
| | noise_range=noise_range) |
| | elif kernel_type == 'skew': |
| | kernel = random_bivariate_skew_Gaussian_center( |
| | kernel_size, |
| | sigma_x_range, |
| | sigma_y_range, |
| | rotation_range, |
| | noise_range=noise_range) |
| | elif kernel_type == 'generalized': |
| | kernel = random_bivariate_generalized_Gaussian( |
| | kernel_size, |
| | sigma_x_range, |
| | sigma_y_range, |
| | rotation_range, |
| | beta_range, |
| | noise_range=noise_range) |
| | elif kernel_type == 'plateau_iso': |
| | kernel = random_bivariate_plateau_type1_iso( |
| | kernel_size, sigma_x_range, beta_range, noise_range=noise_range) |
| | elif kernel_type == 'plateau_aniso': |
| | kernel = random_bivariate_plateau_type1( |
| | kernel_size, |
| | sigma_x_range, |
| | sigma_y_range, |
| | rotation_range, |
| | beta_range, |
| | noise_range=noise_range) |
| | |
| | if noise_range is not None: |
| | assert noise_range[0] < noise_range[1], 'Wrong noise range.' |
| | noise = np.random.uniform( |
| | noise_range[0], noise_range[1], size=kernel.shape) |
| | kernel = kernel * noise |
| | kernel = kernel / np.sum(kernel) |
| | return kernel |
| |
|
| |
|
| | def show_one_kernel(): |
| | import matplotlib.pyplot as plt |
| | kernel_size = 21 |
| |
|
| | |
| | D = [[0, 0], [0, 0]] |
| | D = [[3 / 4, 0], [0, 0.5]] |
| | kernel = bivariate_skew_Gaussian_center(kernel_size, 2, 4, -math.pi / 4, D) |
| | |
| | kernel = bivariate_anisotropic_Gaussian(kernel_size, 2, 4, -math.pi / 4) |
| | |
| | kernel = bivariate_isotropic_Gaussian(kernel_size, 1) |
| | |
| | kernel = bivariate_generalized_Gaussian( |
| | kernel_size, 2, 4, -math.pi / 4, beta=4) |
| |
|
| | delta_h, delta_w = mass_center_shift(kernel_size, kernel) |
| | print(delta_h, delta_w) |
| |
|
| | fig, axs = plt.subplots(nrows=2, ncols=2) |
| | |
| | ax = axs[0][0] |
| | im = ax.matshow(kernel, cmap='jet', origin='upper') |
| | fig.colorbar(im, ax=ax) |
| |
|
| | |
| | ax = axs[0][1] |
| | kernel_vis = kernel - np.min(kernel) |
| | kernel_vis = kernel_vis / np.max(kernel_vis) * 255. |
| | ax.imshow(kernel_vis, interpolation='nearest') |
| |
|
| | _, xx, yy = mesh_grid(kernel_size) |
| | |
| | ax = axs[1][0] |
| | CS = ax.contour(xx, yy, kernel, origin='upper') |
| | ax.clabel(CS, inline=1, fontsize=3) |
| |
|
| | |
| | ax = axs[1][1] |
| | kernel = kernel / np.max(kernel) |
| | p = ax.contourf( |
| | xx, yy, kernel, origin='upper', levels=np.linspace(-0.05, 1.05, 10)) |
| | fig.colorbar(p) |
| |
|
| | plt.show() |
| |
|
| |
|
| | def show_plateau_kernel(): |
| | import matplotlib.pyplot as plt |
| | kernel_size = 21 |
| |
|
| | kernel = plateau_type1(kernel_size, 2, 4, -math.pi / 8, 2, grid=None) |
| | kernel_norm = bivariate_isotropic_Gaussian(kernel_size, 5) |
| | kernel_gau = bivariate_generalized_Gaussian( |
| | kernel_size, 2, 4, -math.pi / 8, 2, grid=None) |
| | delta_h, delta_w = mass_center_shift(kernel_size, kernel) |
| | print(delta_h, delta_w) |
| |
|
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | fig, axs = plt.subplots(nrows=2, ncols=2) |
| | |
| | ax = axs[0][0] |
| | im = ax.matshow(kernel, cmap='jet', origin='upper') |
| | fig.colorbar(im, ax=ax) |
| |
|
| | |
| | ax = axs[0][1] |
| | kernel_vis = kernel - np.min(kernel) |
| | kernel_vis = kernel_vis / np.max(kernel_vis) * 255. |
| | ax.imshow(kernel_vis, interpolation='nearest') |
| |
|
| | _, xx, yy = mesh_grid(kernel_size) |
| | |
| | ax = axs[1][0] |
| | CS = ax.contour(xx, yy, kernel, origin='upper') |
| | ax.clabel(CS, inline=1, fontsize=3) |
| |
|
| | |
| | ax = axs[1][1] |
| | kernel = kernel / np.max(kernel) |
| | p = ax.contourf( |
| | xx, yy, kernel, origin='upper', levels=np.linspace(-0.05, 1.05, 10)) |
| | fig.colorbar(p) |
| |
|
| | plt.show() |
| |
|