Source code for molyso.generic.registration

# -*- coding: utf-8 -*-
"""
registration.py contains a simple 2D image registration function,
which registers images by checking the individual horizontal and vertical shifts
"""
from __future__ import division, unicode_literals, print_function

from .signal import find_phase, vertical_mean, horizontal_mean

import numpy as np


[docs]def translation_2x1d(image_a=None, image_b=None, ffts_a=(), ffts_b=(), return_a=False, return_b=False): """ :param image_a: :param image_b: :param ffts_a: :param ffts_b: :param return_a: :param return_b: :return: """ if ffts_a != (): fft_av, fft_ah = ffts_a signal_av, signal_ah = None, None else: fft_av, fft_ah = None, None signal_av, signal_ah = vertical_mean(image_a), horizontal_mean(image_a) if ffts_b != (): fft_bv, fft_bh = ffts_b signal_bv, signal_bh = None, None else: fft_bv, fft_bh = None, None signal_bv, signal_bh = vertical_mean(image_b), horizontal_mean(image_b) v, fft_av, fft_bv = find_phase(signal_1=signal_av, signal_2=signal_bv, fft_1=fft_av, fft_2=fft_bv, return_1=True, return_2=True) h, fft_ah, fft_bh = find_phase(signal_1=signal_ah, signal_2=signal_bh, fft_1=fft_ah, fft_2=fft_bh, return_1=True, return_2=True) result = ([float(-v), float(-h)],) if return_a: result += ((fft_av, fft_ah),) if return_b: result += ((fft_bv, fft_bh),) return result
[docs]def shift_image(image, shift, background='input'): """ :param image: :param shift: :param background: :return: :raise ValueError: """ vertical, horizontal = shift vertical, horizontal = round(vertical), round(horizontal) height, width = image.shape if vertical < 0: source_vertical_lower = -vertical source_vertical_upper = height destination_vertical_lower = 0 destination_vertical_upper = vertical else: source_vertical_lower = 0 source_vertical_upper = height - vertical destination_vertical_lower = vertical destination_vertical_upper = height if horizontal < 0: source_horizontal_lower = -horizontal source_horizontal_upper = width destination_horizontal_lower = 0 destination_horizontal_upper = horizontal else: source_horizontal_lower = 0 source_horizontal_upper = width - horizontal destination_horizontal_lower = horizontal destination_horizontal_upper = width if background == 'input': new_image = image.copy() elif background == 'blank': new_image = np.zeros_like(image) else: raise ValueError("Unsupported background method passed. Use background or blank.") new_image[ destination_vertical_lower:destination_vertical_upper, destination_horizontal_lower:destination_horizontal_upper ] = image[ source_vertical_lower:source_vertical_upper, source_horizontal_lower:source_horizontal_upper ] return new_image