def test_matching_order(covariance_transformation: MagicMock,
                        whitening: MagicMock, center_image: MagicMock,
                        get_feature_matrix: MagicMock,
                        feature_dist_matching: FeatureDistMatching) -> None:
    mock = Mock()
    mock_get_feature_matrix = 'mock_get_feature_matrix'
    mock_center_image = 'mock_center_image'
    mock_whitening = 'mock_whitening'
    mock_covariance_transformation = 'mock_covariance_transformation'

    mock.attach_mock(get_feature_matrix, mock_get_feature_matrix)
    mock.attach_mock(center_image, mock_center_image)
    mock.attach_mock(whitening, mock_whitening)
    mock.attach_mock(covariance_transformation, mock_covariance_transformation)

    source = TEST_IMAGE_423
    reference = TEST_IMAGE_243
    feature_dist_matching._matching(source, reference)

    # check the call order
    expected_calls = [
        mock_get_feature_matrix, mock_get_feature_matrix, mock_center_image,
        mock_center_image, mock_whitening, mock_covariance_transformation,
        mock_covariance_transformation + '().__iadd__',
        mock_covariance_transformation + '().__iadd__().reshape'
    ]

    calls = [call[0] for call in mock.mock_calls]
    assert calls == expected_calls
def test_whitening_2d() -> None:
    test_image = TEST_IMAGE_421
    test_image_mat = FeatureDistMatching._get_feature_matrix(test_image)
    FeatureDistMatching._center_image(test_image_mat)

    result = FeatureDistMatching._whitening(test_image_mat)
    np.testing.assert_almost_equal(np.var(result), 1.)
def test_apply_channel_range(
        feature_dist_matching: FeatureDistMatching) -> None:
    source = TEST_IMAGE_423
    reference = TEST_IMAGE_243

    source[:, :, 1] *= 255.
    source[:, :, 2] *= 254.
    source[:, :, 2] -= 127.
    reference[:, :, 1] *= 255.
    reference[:, :, 2] *= 254.
    reference[:, :, 2] -= 127.
    feature_dist_matching.channel_ranges = tuple([
        ChannelRange(0., 1.),
        ChannelRange(0., 255.),
        ChannelRange(-127.0, 127.0)
    ])

    result = feature_dist_matching._apply(source, reference)

    np.testing.assert_array_equal(source, TEST_IMAGE_423)
    np.testing.assert_array_equal(reference, TEST_IMAGE_243)
    assert result.shape == source.shape
    assert result.dtype == np.float32

    assert np.max(result[:, :, 0]) <= 1.
    assert 0.1 < np.mean(result[:, :, 0]) < 0.9
    assert np.max(result[:, :, 0]) >= 0.

    assert np.max(result[:, :, 1]) <= 255.
    assert 5. < np.mean(result[:, :, 1]) < 250.
    assert np.min(result[:, :, 1]) >= 0.

    assert np.max(result[:, :, 2]) <= 127.
    assert -120. < np.mean(result[:, :, 2]) < 120.
    assert np.min(result[:, :, 2]) >= -127.
def test_whitening() -> None:
    test_image = TEST_IMAGE_423
    test_image_mat = FeatureDistMatching._get_feature_matrix(test_image)
    FeatureDistMatching._center_image(test_image_mat)

    result = FeatureDistMatching._whitening(test_image_mat)
    np.testing.assert_almost_equal(np.cov(result, rowvar=False),
                                   np.identity(3))
def test_center_image() -> None:
    test_image = TEST_IMAGE_423
    test_image_mat = FeatureDistMatching._get_feature_matrix(test_image)
    test_image_mean = np.mean(test_image_mat, axis=0)
    result_image_mat, result_mean = FeatureDistMatching._center_image(
        test_image_mat)
    np.testing.assert_array_equal(result_mean, test_image_mean)
    np.testing.assert_almost_equal(np.mean(result_image_mat, axis=0),
                                   np.zeros(3))
def test_apply_channels(channels: ChannelsType,
                        feature_dist_matching: FeatureDistMatching) -> None:
    source = TEST_IMAGE_423.astype(np.float32)
    reference = TEST_IMAGE_243.astype(np.float32)
    feature_dist_matching.channels = channels
    result = feature_dist_matching._apply(source, reference)

    for untouched_channel in {0, 1, 2} - set(channels):
        np.testing.assert_array_equal(source[:, :, untouched_channel],
                                      result[:, :, untouched_channel])
def test_matching_2d(channel_range_max: float) -> None:
    source = TEST_IMAGE_421 * channel_range_max
    reference = TEST_IMAGE_421 * channel_range_max
    result = FeatureDistMatching._matching(source, reference)

    feature_mat_result = FeatureDistMatching._get_feature_matrix(result)
    feature_mat_ref = FeatureDistMatching._get_feature_matrix(reference)

    result_mean = np.mean(feature_mat_result, axis=0)
    reference_mean = np.mean(feature_mat_ref, axis=0)

    np.testing.assert_almost_equal(result_mean, reference_mean)

    feature_mat_result -= result_mean
    feature_mat_ref -= reference_mean

    np.testing.assert_almost_equal(np.var(feature_mat_result),
                                   np.var(feature_mat_ref))
def test_matching(channel_range_max: float) -> None:
    source = TEST_IMAGE_423
    reference = TEST_IMAGE_243
    source[:, :, 1] *= channel_range_max
    reference[:, :, 1] *= channel_range_max
    result = FeatureDistMatching._matching(source, reference)

    feature_mat_result = FeatureDistMatching._get_feature_matrix(result)
    feature_mat_ref = FeatureDistMatching._get_feature_matrix(reference)

    result_mean = np.mean(feature_mat_result, axis=0)
    reference_mean = np.mean(feature_mat_ref, axis=0)
    np.testing.assert_almost_equal(result_mean, reference_mean)

    feature_mat_result -= result_mean
    feature_mat_ref -= reference_mean
    np.testing.assert_almost_equal(np.cov(feature_mat_result, rowvar=False),
                                   np.cov(feature_mat_ref, rowvar=False))
def test_apply(feature_dist_matching: FeatureDistMatching, source: np.array,
               reference: np.array) -> None:
    feature_dist_matching.channels = CHANNELS_DEFAULT[0:source.shape[-1]]
    feature_dist_matching.channel_ranges = CHANNEL_RANGES_DEFAULT[0:source.
                                                                  shape[-1]]
    source_copy = np.copy(source)
    reference_copy = np.copy(reference)
    result = feature_dist_matching._apply(source, reference)

    # Check modification of input:
    np.testing.assert_array_equal(source, source_copy)
    np.testing.assert_array_equal(reference, reference_copy)

    # Check result:
    assert result.shape == source.shape
    assert np.max(result) <= 1.
    assert 0.1 < np.mean(result) < 0.9
    assert np.min(result) >= 0.
    assert result.dtype == np.float32
def test_apply_images(source_path: str, reference_path: str,
                      feature_dist_matching: FeatureDistMatching) -> \
        None:
    source = read_image(source_path)
    reference = read_image(reference_path)
    result = feature_dist_matching._apply(source, reference)
    assert result.shape == source.shape
    assert np.max(result) <= 1.
    assert 0.1 < np.mean(result) < 0.9
    assert np.min(result) >= 0.
    assert result.dtype == np.float32
    with np.testing.assert_raises(AssertionError):
        np.testing.assert_array_equal(result, source)
    with np.testing.assert_raises(AssertionError):
        np.testing.assert_array_equal(result, reference)
def test_covariance_transformation_2d() -> None:
    test_image = TEST_IMAGE_421
    test_image_mat = FeatureDistMatching._get_feature_matrix(test_image)
    FeatureDistMatching._center_image(test_image_mat)
    test_image_white = FeatureDistMatching._whitening(test_image_mat)

    feature_mat_ref = FeatureDistMatching._get_feature_matrix(
        TEST_IMAGE_243[:, :, 0])

    result = FeatureDistMatching._covariance_transformation(
        test_image_white, feature_mat_ref)
    np.testing.assert_almost_equal(np.var(result), np.var(feature_mat_ref))
def test_covariance_transformation() -> None:
    test_image = TEST_IMAGE_423
    test_image_mat = FeatureDistMatching._get_feature_matrix(test_image)
    FeatureDistMatching._center_image(test_image_mat)
    test_image_white = FeatureDistMatching._whitening(test_image_mat)

    feature_mat_ref = FeatureDistMatching._get_feature_matrix(TEST_IMAGE_243)

    result = FeatureDistMatching._covariance_transformation(
        test_image_white, feature_mat_ref)
    np.testing.assert_almost_equal(np.cov(result, rowvar=False),
                                   np.cov(feature_mat_ref, rowvar=False))
def test_get_feature_matrix(test_image: np.array,
                            des_shape: Tuple[int, int]) -> None:
    result = FeatureDistMatching._get_feature_matrix(test_image)
    np.testing.assert_array_equal(result, test_image.reshape(des_shape))