为什么我不能用 opencv 仿射变换翻转图像?

Why I cannot flip an image with opencv affine transform?

我在维基百科这个页面上读到了仿射变换: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)

我没有翻转版本的图像,而是图像变成了全黑图像。 我的代码有什么问题?

你的结果图片不应该是全黑的;结果图像的第一列有一些有意义的值,不是吗?你的做法是正确的,图片是水平翻转的,但是是相对于"image's coordinate system",即图片是沿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,以及相关的一两个教程。设置旋转等可能会变得困难。

希望对您有所帮助!