opencv - 为什么我不能用 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)
我没有图像的翻转版本,而是将图像变成了全黑图像。我的代码有什么问题?
解决方案
您的结果图像不应该是全黑的;结果图像的第一列有一些有意义的值,不是吗?您的方法是正确的,图像是水平翻转的,但它是相对于“图像的坐标系”完成的,即图像沿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
,以及一两个关于它的教程。设置旋转等可能会变得困难。
希望有帮助!
推荐阅读
- mysql - Hibernate:向mysql数据库添加日期属性,它作为前一天插入数据库
- php - MySQL从存储的复选框内爆匹配单个数字
- vb6 - 如何在vb6中打印图像
- swift - Swift 4:放大用户位置以外的位置
- python - 通过 Python 将颜色分配给 matplotlib 中的特定值?
- vba - 无法通过 VBA 中的字符串值访问 excel 数据透视表字段
- javascript - ng-if 没有根据变量更新
- chef-infra - 刀:找不到命令
- python - 从列表中创建多个复选框并获取所有值
- powershell - PowerShell 脚本不会按顺序运行