Opencv几何变换之仿射变换

好久不见大家,今天小讲opencv几何变换之仿射变换吧!

首先,什么是仿射变换呢?

仿射变换厉害了!几乎能实现平移,旋转,和缩放这些操作。

我们看个例子就明白了,

看看这两个图像,左侧是原始图像,右侧是仿射变换后的图像。

Input经过仿射变换得到Output。

懂了吗?来一句话总结一下什么是仿射变换,

仿射变换就是:

把图像的经过平移+旋转+缩放后位置改变了。

(ps:原图像中的互相平行的线,不管咋变始终保持平行)

了解了什么是仿射变换之后我们来想一想具体怎么实现的呢?

我们要确定图像上三个具体的点,

(别问我为什么!三点确定一个平面,地球人都知道,O(∩_∩)O哈哈~)

那要怎么表示点呢?

坐标呗,

那怎么表示三个点呢?

矩阵呗!

我们在原图像上找到三个点以后,

在希望变换后的图像上再次定义出三个点的矩阵,

自然会实现仿射变换。

那么我们需要创建矩阵的函数,

  • cv2.getAffineTransform

这个函数可以创建出一个2*3的矩阵。

(-啥是2*3的矩阵啊?

-2*3=6,6个数的矩阵知道是啥了吧

-6个数的矩阵?

-来,赏你6巴掌,自己数去!)

有了矩阵,我们要把矩阵传给一个我们一直在用的函数

你猜是啥?

  • cv2.warpAffine

对,就是这个函数。

我们了解了大概以后,代码会写了吗?参照我们以前写过的平移,旋转,缩放。

-我写不出来!

-我也写不出来!

-cv2.warpAffine的参数是啥?

-赏你们一人一巴掌!回头翻教程去,我最讨厌那些不复习还问问题的人!

 

 

 

 

放出源码,别偷看啊~

# -*- coding:utf-8 -*-
"""
Created on Mon Feb 20 20:35:58 2017

@author: Y

"""

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('C:\Users\Administrator\Desktop\opencvimg\drawing.png')
rows,cols,ch = img.shape

pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])

M = cv2.getAffineTransform(pts1,pts2)

dst = cv2.warpAffine(img,M,(cols,rows))

plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()

 

留个作业,代码中

plt.subplot(121)和plt.subplot(122)是什么意思?

回去查资料,可以再这篇文章下方留言给我,下节课会公布正确答案。

贴张用的原图

这是用的原图,及Input,拿去用

我是Y,博客到今天,大家还满意吗?如果有什么好的建议,希望大家不吝赐教,追求卓越使我们共同的理想不是吗?各位晚安~