При обработке изображений это называется переводом изображения.
Исходное изображение:
import cv2
import numpy as np
# Read image
img = cv2.imread("roi.jpg")
# The number of pixels
num_rows, num_cols = img.shape[:2]
# Creating a translation matrix
translation_matrix = np.float32([ [1,0,70], [0,1,110] ])
# Image translation
img_translation = cv2.warpAffine(img, translation_matrix, (num_cols,num_rows))
#cv2.namedWindow('Translation', cv2.WINDOW_NORMAL)
cv2.imshow('Translation', img_translation)
cv2.waitKey(0)
cv2.destroyAllWindows()
Это даст вам:
Но мы хотим что-то вроде этого:
Перевод в основном означает, что мы сдвиг изображения путем добавления / вычитания координат X и Y. Для этого нам нужно создать матрицу преобразования, как показано ниже:
Здесь значения tx и ty являются значениями перевода X и Y, то есть изображение будет перемещено на X единиц вправо и на Y единиц вниз.
Так что, как только мы создадим такую матрицу, мы можем использовать функцию warpAffine, чтобы применить ее к нашему изображению.
Третий аргумент в warpAffine относится к числу строк и столбцов в результирующем изображении. Поскольку количество строк и столбцов совпадает с исходным изображением, результирующее изображение будет обрезано. Причина этого в том, что у нас не было достаточно места на выходе, когда мы применили матрицу перевода. Чтобы избежать обрезки, мы можем сделать что-то подобное:
img_translation = cv2.warpAffine(img, translation_matrix, (num_cols + 70, num_rows + 110))
cv2.namedWindow('Translation', cv2.WINDOW_NORMAL)
cv2.imshow('Translation', img_translation)
cv2.waitKey(0)
cv2.destroyAllWindows()
И это приведет к:
Помните, что размер изображения при загрузке здесь изменяется, не беспокойтесь, это ваш желаемый результат.
Кроме того, если мы хотим переместить изображение в середине большего кадра изображения; мы можем сделать что-то подобное, выполнив следующее:
num_rows, num_cols = img.shape[:2]
translation_matrix = np.float32([ [1,0,70], [0,1,110] ])
img_translation = cv2.warpAffine(img, translation_matrix, (num_cols + 70, num_rows + 110))
translation_matrix = np.float32([ [1,0,-30], [0,1,-50] ])
img_translation = cv2.warpAffine(img_translation, translation_matrix, (num_cols + 70 + 30, num_rows + 110 + 50))
cv2.namedWindow('Translation', cv2.WINDOW_NORMAL)
cv2.imshow('Translation', img_translation)
cv2.waitKey(0)
cv2.destroyAllWindows()
, который дает вам вывод:
Существует исследование JVM Andreas Gal по имени HotPath, и некоторые люди от его команды в настоящее время работают над добавлением вложенного дерева трассировки базирующийся JITting Maxine (новое исследование Sun JVM, записанная в Java) и HotSpot. Так, по крайней мере, это собирается в другом VMs для других языков также.
Кроме того, новый JIT-компилятор PyPy (в настоящее время смоделированный в Прологе) использует некоторый метод трассировки, хотя я не знаю, как тесно связанный, который является к стилю Gal/Franz, вложил деревья трассировки.
Парни Rubinius определенно знают об этой работе, и очень открытые для экспериментирования. Я не был бы удивлен, если некоторые усовершенствованные методы компиляции запускают показ там, скоро.
BTW: существует VM Ruby, записанный в JavaScript, названном HotRuby. При выполнении этого на TraceMonkey Вы получаете трассировку основанный на дереве Ruby бесплатно :-)