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

标签 opencv cgaffinetransform flip

我已经在维基百科的以下页面上了解了仿射变换: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)

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

最佳答案

您的结果图片不应完全是黑色的;结果图像的第一列有一些有意义的值,不是吗?您的方法是正确的,图像是水平翻转的,但是是相对于“图像的坐标系”完成的,即,图像沿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)

这是输入图像:

Input

那是水平翻转的图像:

Horizontally flipped

那是垂直翻转的图像:

enter image description here

对于这种非常基本的操作,手动设置转换矩阵可能并不困难,但是对于除此以外的所有内容,您都应该看看 getAffineTransform ,以及有关的一两个教程。设置旋转等可能会变得困难。

希望有帮助!

关于opencv - 为什么我不能使用opencv仿射变换来翻转图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57863376/

相关文章:

c++ - 将 vlfeat 库的 dsift 与 cv::Mat 结合使用

c++ - Uchar 到 cv::Mat 的 vector

android - 找不到OpenCV库-2.4.3.apk! Android OpenCV

iPhone卡片像翻转动画

java - 如何翻转 EncodedImage Blackberry

python - 使用 GSOC 进行 openCV 背景扣除

ios - 如何转换 Tableview 单元格中的删除选项

ios - 确定 crop rect 是否完全包含在旋转的 UIView 中

swift - View 旋转后移动 View , View 中触摸位置错误

html - 悬停时图像翻转只是反射(reflect)图像,而不是实际翻转