opencv 在python中旋转图像并使用图像填充裁剪区域

ssm49v7z  于 2023-02-05  发布在  Python
关注(0)|答案(2)|浏览(231)

看看图像,它会给予你更好地了解我想要实现什么。我想旋转图像,并填补图像的黑色部分,就像在所需的图像。

# Read the image
img = cv2.imread("input.png")

# Get the image size
h, w = img.shape[:2]

# Define the rotation matrix
M = cv2.getRotationMatrix2D((w/2, h/2), 30, 1)

# Rotate the image
rotated = cv2.warpAffine(img, M, (w, h))

mask = np.zeros(rotated.shape[:2], dtype=np.uint8)
mask[np.where((rotated == [0, 0, 0]).all(axis=2))] = 255
img_show(mask)

从代码中我可以得到黑色区域的遮罩。现在我想用1中所示的图像部分替换这些黑色区域。有什么更好的解决方案可以实现这一点。

j7dteeu8

j7dteeu81#

使用warpAffineborderMode参数。
您需要传递BORDER_WRAP值。
这是结果。这和你第一张照片描述的完全一样。

wljmcqd8

wljmcqd82#

我有一个办法,你可以先创建一个3 * 3倍的大图像,当你旋转这个图像,只切掉这个大图像的中心,你就有了你想要的结果。

import cv2
import numpy as np

# Read the image
img = cv2.imread("input.png")

# Get the image size of the origial image
h, w = img.shape[:2]

# make a large image containing 3 copies of the original image in each direction
large_img = np.tile(img, [3,3,1])

cv2.imshow("large_img", large_img)

# Define the rotation matrix. Rotate around the center of the large image
M = cv2.getRotationMatrix2D((w*3/2, h*3/2), 30, 1)

# Rotate the image
rotated = cv2.warpAffine(large_img, M, (w*3, h*3))

# crop only the center of the image
cropped_image = rotated[w:w*2,h:h*2,:]

cv2.imshow("cropped_image", cropped_image)
cv2.waitKey(0)

相关问题