Как я могу реализовать центрированный сдвиг изображения с помощью opencv

Когда я использую warpAffine для обрезки изображения:

M2 = np.float32([[1, 0, 0], [0.2, 1, 0]])
aff2 = cv2.warpAffine(im, M2, (W, H))

Я получаю изображение, которое не сдвигается вокруг центра изображения. Я вижу черные треугольные области на одной стороне изображения, а на другой стороне нет черных областей.

Как я могу позволить изображению быть срезанным симметрично?


person coin cheung    schedule 11.09.2019    source источник
comment
Вам нужно расширить выходное изображение больше, чем входное изображение, при выполнении сдвига. Поэтому увеличьте W или H на величину сдвига в пикселях.   -  person fmw42    schedule 11.09.2019
comment
Не могли бы вы быть более конкретным? Как я мог узнать величину сдвига и его связь с количеством пикселей?   -  person coin cheung    schedule 11.09.2019
comment
Прочтите stackoverflow.com/help/how-to-ask. Выполняли ли какие-либо поиски в Google или Stackoverflow? Я только что выполнил поиск в Google и нашел изображение сдвига Python opencv и нашел это. Я подозреваю, что это ответит на ваш вопрос. stackoverflow.com/questions/44425701/   -  person fmw42    schedule 11.09.2019
comment
ПРОДОЛЖЕНИЕ: см. также en.wikipedia.org/wiki/Transformation_matrix. Обратите внимание на матрицу сдвига. Получите kwidth или kheight для дополнительного места. Как вы вычислили свою аффинную матрицу M2?   -  person fmw42    schedule 11.09.2019
comment
См. также примеры на imagemagick.org/Usage/distorts/affine/#affine_shear и уравнения на imagemagick.org/Usage/distorts/#affine_projection для матрицы. Также у меня есть сценарий оболочки bash для ImageMagick, который сдвигает в пикселях или градусах, называемых skew, в fmwconcepts .com/imagemagick/skew/index.php. ImageMagick автоматически расширяет изображение, так что вам не нужно возиться с этим самостоятельно.   -  person fmw42    schedule 11.09.2019


Ответы (1)


Вы должны настроить параметры перевода (3-й столбец), чтобы центрировать изображение. то есть вы должны перевести половину ширины и высоты, умноженных на коэффициент.

Например

M2 = np.float32([[1, 0, 0], [0.2, 1, 0]])
M2[0,2] = -M2[0,1] * W/2
M2[1,2] = -M2[1,0] * H/2
aff2 = cv2.warpAffine(im, M2, (W, H))

До

введите описание изображения здесь

После

введите описание изображения здесь

Полный код

import cv2
import numpy as np
import matplotlib.pyplot as plt

im = np.ones((100,100))
H, W = im.shape

M2 = np.float32([[1, 0, 0], [0.2, 1, 0]])
M2[0,2] = -M2[0,1] * W/2
M2[1,2] = -M2[1,0] * H/2
aff2 = cv2.warpAffine(im, M2, (W, H))

plt.imshow(aff2, cmap="gray")
person fabda01    schedule 11.09.2019
comment
Хороший! Спасибо за подробности в OpenCV и пример. Это всегда помогает получить визуальные эффекты. - person fmw42; 11.09.2019
comment
К сожалению, OP ничего не узнал из его предыдущего вопроса. Ответ на этот вопрос тот же. - person HansHirse; 11.09.2019
comment
Я обнаружил, что в этом скрипте должно быть M2[0,2] = -M2[0,1] * H/2 и M2[1,2] = -M2[1,0] * W/2 Я имею в виду, что W и H перепутаны. - person Kanat; 04.03.2021