Source code for metamorphic_relations.ImageMR

import numpy as np
from scipy import ndimage

from metamorphic_relations import MR
from metamorphic_relations.Transform import Transform


[docs]class ImageMR(MR):
[docs] @staticmethod def get_image_GMRs() -> list[Transform]: """ Gives a list of generic metamorphic relations (GMRs) for images :return: list of Transforms """ GMRs = [] GMRs += MR.for_all_labels(lambda x: ImageMR.rotate_transform(x, 5), name="Rotate by 5 degrees") GMRs += MR.for_all_labels(lambda x: ImageMR.rotate_transform(x, -5), name="Rotate by -5 degrees") GMRs += MR.for_all_labels(lambda x: MR.scale_values_transform(x, lambda y: y + 10), name="Scale values by +10") GMRs += MR.for_all_labels(lambda x: ImageMR.blur_transform(x, 1), name="Blur") return GMRs
[docs] @staticmethod def rotate_transform(x: np.array, angle: int) -> np.array: """ Rotates the input by an angle :param x: input data in the form of a numpy array :param angle: an angle in degrees :return: the transformed data """ if angle == 180: flat_x = x.flatten() rotate_x = np.flip(flat_x) x = rotate_x.reshape(x.shape) else: x = ndimage.rotate(x, angle, reshape=False) return x
[docs] @staticmethod def flip_vertical_transform(x: np.array) -> np.array: """ Flips the input vertically :param x: input data in the form of a numpy array :return: the transformed data """ return np.flipud(x)
[docs] @staticmethod def flip_horizontal_transform(x: np.array) -> np.array: """ Flips the input horizontally :param x: input data in the form of a numpy array :return: the transformed data """ return np.fliplr(x)
[docs] @staticmethod def blur_transform(x: np.array, sigma: float) -> np.array: """ Blurs the input :param x: input data in the form of a numpy array :param sigma: a blurring factor (the larger sigma the more blurred the result) :return: the transformed data """ return ndimage.gaussian_filter(x, sigma, mode='constant')