Сдвиг изображения на x пикселей влево при сохранении исходной формы - PullRequest
0 голосов
/ 20 января 2019

Я хочу сместить изображение на x пикселей, сохраняя исходную форму.Я попробовал следующее:

import cv2

img = cv2.imread("roi.jpg")

shift = img[:,x:size[1]]

Но проблема с вышеуказанным подходом заключается в том, что первоначальная форма изображения теряется.Как я могу сохранить исходную форму при смещении изображения на x пикселей влево.

1 Ответ

0 голосов
/ 20 января 2019

При обработке изображений эта вещь называется переводом изображения.

Исходное изображение:

enter image description here

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()

Это даст вам:

enter image description here

Но мы хотим что-то вроде этого:

enter image description here

Перевод в основном означает, что мы смещаем изображение, добавляя / вычитая координаты X и Y. Для этого нам нужно создать матрицу преобразования, как показано ниже:

enter image description here

Здесь значения 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()

И это приведет к:

enter image description here

Помните, что это изображение изменяется при загрузке здесь, не волнуйтесь, это ваш желаемый результат.

Более того, если мы хотим переместить изображение в середине большей рамки изображения; мы можем сделать что-то подобное, выполнив следующее:

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()

Что дает вам вывод:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...