Python 在OpenCV里实现仿射变换—坐标变换效果

yipeiwu_com5年前Python基础

在现实的图像操作软件中,经常碰到的不是给出放大多少倍,而是由用户在软件的界面上选择多大的区域,或者选择几个点,那么这样情况下,怎么样来计算出变换矩阵呢?从前面知道变换矩阵是2X3的矩阵,说明有六个未知数,又有中学的代数知识知道要解决六个未知数,那么方程组至少要联立三条方程,要准备三条方程的先决条件,就是要有三组坐标。因此,只要在用户选择的区域里找到三个不同点的坐标,就可以计算出变换矩阵。如果给出三组坐标[0, 0], [200, 0], [0, 200],通过变换之后新坐标是[0, 0], [128, 0], [0, 50],那用什么函数来计算这个矩阵呢?这是要使用OpenCV里的getAffineTransform函数。

下面通过例子来演示这个功能:

#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import cv2
import numpy as np
#图片的路径
imgname = "img1.jpg"
#读取图片
image = cv2.imread(imgname, cv2.IMREAD_COLOR)
#图片的高度和宽度
h,w = image.shape[:2]
#从目标坐标计算出2X3的矩阵,然后调用warpAffine执行
src = np.array([[0, 0], [200, 0], [0, 200]], np.float32)
dst = np.array([[0, 0], [128, 0], [0, 50]], np.float32)
A1 = cv2.getAffineTransform(src, dst)
d1 = cv2.warpAffine(image, A1, (w, h), borderValue = 125)
#显示操作之后的图片
cv2.imshow("d1",d1)
#显示图像
cv2.imshow("image", image)
#等待用户输入,然后删除所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下:

使用坐标变换的方法,可以不用知道中间是否先旋转,还是先平移的操作。

总结

以上所述是小编给大家介绍的Python 在OpenCV里实现仿射变换—坐标变换效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对【听图阁-专注于Python设计】网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

相关文章

python实现将文件夹内的每张图片批量分割成多张

python实现将文件夹内的每张图片批量分割成多张

一、说在前面        需求:有一张长为960,宽为96的图片,需要将其分割成10张96*96的图片并存放在另外一个文件夹下,通过手工分割耗时...

Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】

本文实例讲述了Python数据结构与算法之链表定义与用法。分享给大家供大家参考,具体如下: 本文将为大家讲解: (1)从链表节点的定义开始,以类的方式,面向对象的思想进行链表的设计 (2...

python使用tensorflow深度学习识别验证码

本文介绍了python使用tensorflow深度学习识别验证码 ,分享给大家,具体如下: 除了传统的PIL包处理图片,然后用pytessert+OCR识别意外,还可以使用tessorf...

Python 时间操作例子和时间格式化参数小结

1.取过去具体时间的方法:复制代码 代码如下:#!/usr/bin/python   import time  #取一天前的当前具体时间 &nb...

Python调用服务接口的实例

如下所示: #! /usr/bin/env python # coding=utf-8 ###############################################...