Почему я не могу перевернуть изображение с помощью аффинного преобразования opencv?

Я прочитал об аффинном преобразовании в Википедии на этой странице: https://en.wikipedia.org/wiki/Affine_transformation

Я говорю, что если я хочу отразить изображение, я могу установить аффинную матрицу равной [[-1, 0, 0], [0, 1, 0], [0, 0, 1]], но когда я попробовал этот код:

im = cv2.imread(imgpth)
im = cv2.resize(im, (1024, 512))
H, W, _ = im.shape

cv2.imshow('org', im)
M = np.float32([[-1, 0, 0], [0, 1, 0]])
aff = cv2.warpAffine(im, M, (W, H))
cv2.imshow('affine', aff)
cv2.waitKey(0)

Я не сделал перевернутую версию изображения, вместо этого изображение превратилось в полностью черное изображение. Что не так с моим кодом?


person coin cheung    schedule 10.09.2019    source источник


Ответы (1)


Ваше итоговое изображение не должно быть полностью черным; первый столбец вашего результирующего изображения имеет некоторые значимые значения, не так ли? Ваш подход правильный, изображение перевернуто по горизонтали, но сделано относительно "системы координат изображения", т.е. изображение перевернуто по оси y, и вы видите только самый правый столбец перевернутого изображения. Итак, вам просто нужно добавить перевод в x направлении.

Давайте посмотрим на следующий код:

# Load image, get shape
img = cv2.imread('rEC3E.png')
H, W = img.shape[:2]

# Flip horizontally
M = np.float32([[-1, 0, W-1], [0, 1, 0]])   # Added translation of size W-1 in x direction
affH = cv2.warpAffine(img, M, (W, H))

# Flip vertically
M = np.float32([[1, 0, 0], [0, -1, H-1]])   # Added translation of size H-1 in y direction
affV = cv2.warpAffine(img, M, (W, H))

# Outputs
cv2.imshow('org', img)
cv2.imshow('flip horizontally', affH)
cv2.imshow('flip vertically', affV)
cv2.waitKey(0)

Это входное изображение:

Ввод

Это горизонтально перевернутое изображение:

Перевернуто по горизонтали

Это вертикально перевернутое изображение:

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

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

Надеюсь, это поможет!

person HansHirse    schedule 10.09.2019