仿射变换,透视变换:二维坐标到二维坐标之间的线性变换,可用于landmark人脸矫正。

仿射变换:

仿射变换是一种二维坐标到二维坐标之间的线性变换,并保持二维图形的“平直性”。转换前平行的线,在转换后依然平行。如下图:

import cv2
import numpy as np
from matplotlib import pyplot as plt
 
img = cv2.imread('lena.jpg', 1)
rows,cols,channel = 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()

透视变换:

透视变换需要3×3的变换矩阵,直线在变换后还是保持直线。为了构造变换矩阵,你需要输入图像的4个点和对应的要输出图像的4个点;要求这4个点其中3个点不共线。使用cv2.getPerspectiveTransform函数构造透视变换矩阵。代码:

import cv2
import numpy as np
from matplotlib import pyplot as plt
 
img = cv2.imread('sudu.jpg', 1)
rows,cols,ch = img.shape
 
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
 
M = cv2.getPerspectiveTransform(pts1,pts2)
 
dst = cv2.warpPerspective(img,M,(300,300))
 
plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()

还可以参考:仿射变换和透视变换

还可以用下面代码鼠标获取四个点进行仿射变换:

# -*- coding: utf-8 -*-

import numpy as np
import cv2

def gen_point(event,x,y,flags,param):
    if event == cv2.EVENT_LBUTTONDBLCLK:
        print (x,y)

# img = np.zeros((512,512,3),np.uint8)
img = cv2.imread("lp.jpg")
cv2.namedWindow('image', 2)
cv2.setMouseCallback('image',gen_point)

while(1):
    cv2.imshow('image',img)
    if cv2.waitKey(20) & 0xFF == 27:
        break
cv2.destroyAllWindows()

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏智能算法

决策树算法之----C4.5

1. C4.5算法简介 C4.5是一系列用在机器学习和数据挖掘的分类问题中的算法。它的目标是监督学习:给定一个数据集,其中的每一个元组都能用一组属性...

46712
来自专栏Deep Learning 笔记

图像识别(二) cifar10_input.py详解

tf.variable_scope和tf.name_scope的用法:https://blog.csdn.net/uestc_c2_403/article/de...

5726
来自专栏深度学习自然语言处理

为什么要使用向量化?

简单的矩阵乘法理论 其实大概每个人都知道向量化后进行计算的速度比循环求解计算快,可是快多少,我们还是不太清楚。那么我就想简单的说下理论再上代码(pyth...

3076
来自专栏程序生活

斯坦福tensorflow教程-tensorflow 实现逻辑回归03_logreg_placeholder.py实验结果utils.py

3083
来自专栏mathor

条件概率和乘法公式

2654
来自专栏iOS122-移动混合开发研究院

Masonry -- 使用纯代码进行iOS应用的autolayout自适应布局

简介 简化iOS应用使用纯代码机型自适应布局的工作,使用一种简洁高效的语法替代NSLayoutConstraints. 最新示例: 点击下载 项目简议: 如果再...

2715
来自专栏数值分析与有限元编程

用面积坐标推导六节点三角形单元刚度矩阵

建立高阶单元时,利用面积坐标可以简化计算,特别是利用面积坐标的积分公式计算等效节点力。 (一)节点形函数 ? (二)单元位移场及应变场 ? ? ? (三)单元刚...

4837
来自专栏用户2442861的专栏

相似图片检测:感知哈希算法之dHash的Python实现

某些情况下,我们需要检测图片之间的相似性,进行我们需要的处理:删除同一张图片、标记盗版等。 如何判断是同一张图片呢?最简单的方法是使用加密哈希(例如MD5, ...

4091
来自专栏黑豆梨的曲线机器学习路线

割线法(Secant Method)求解f(x)=0

x_3=x_2-f(x_2) \frac{x_2-x_1}{f(x_2)-f(x_1)}

2513
来自专栏贾志刚-OpenCV学堂

图像特征之局部二值模式

一:局部二值模式(LBP)介绍 局部二值模式(Local Binary Pattern)主要用来实现2D图像纹理分析。其基本思想是用每个像素跟它周围的像素相比...

3976

扫码关注云+社区

领取腾讯云代金券