kongen kongen
首页
导航站
  • 学习教程

    • Opencv教程
    • C++基础教程
    • C++_Primer教程
    • CUDA编程
  • Opencv
  • CNN
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 面试题库

    • HTML
    • CSS
    • jQuery
    • Vue
    • 零碎
  • 面试心得

    • 杂言碎语
  • 十架道路

    • 十架七言系列
    • 基督徒生活观
    • 上帝的蓝图
  • 摘抄收录

    • ☆ 励志鸡汤
    • ❀ 人间烟火
  • 读书笔记

    • 《小狗钱钱》
    • 《穷爸爸富爸爸》
    • 《聪明人使用方格笔记本》
  • 学习
  • 面试
  • 心情杂货
  • 友情链接
关于
  • 网站
  • 资源
  • Vue资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Kongen

你好呀(✪ω✪)
首页
导航站
  • 学习教程

    • Opencv教程
    • C++基础教程
    • C++_Primer教程
    • CUDA编程
  • Opencv
  • CNN
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 面试题库

    • HTML
    • CSS
    • jQuery
    • Vue
    • 零碎
  • 面试心得

    • 杂言碎语
  • 十架道路

    • 十架七言系列
    • 基督徒生活观
    • 上帝的蓝图
  • 摘抄收录

    • ☆ 励志鸡汤
    • ❀ 人间烟火
  • 读书笔记

    • 《小狗钱钱》
    • 《穷爸爸富爸爸》
    • 《聪明人使用方格笔记本》
  • 学习
  • 面试
  • 心情杂货
  • 友情链接
关于
  • 网站
  • 资源
  • Vue资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • OpenCV简介

  • OpenCV中的 Gui特性

  • 核心操作

  • OpenCV中的图像处理

    • 改变颜色空间
    • 图像的几何变换
      • 目标
      • 转换
      • 缩放
      • 平移
      • 旋转
      • 仿射变换
      • 透视变换
    • 图像阈值
    • 图像滤波
    • 形态变换
    • 图形梯度
    • Canny边缘检测
    • 图像金字塔
    • 轮廓:入门
    • 轮廓特征
    • 轮廓属性
    • 轮廓:更多函数
    • 轮廓:层次结构
    • 直方图1:查找,绘画,分析
    • 直方图2:均衡直方图
    • 直方图3:2D直方图
    • 反投影直方图
    • 傅里叶变换
    • 模板匹配
    • 霍夫线变换
    • 霍夫圆变换
    • 基于GrabCut算法的交互式前景提取
    • 基于分水岭算法的图像分割
  • 特征检测和描述

  • 视频分析

  • 相机校准和3D重建

  • 机器学习

  • 计算摄影

  • 目标检测

  • Opencv基础原理
  • OpenCV中的图像处理
kongen
2019-06-11
目录

图像的几何变换

# 目标

  • 将不同的几何变换应用于图像,如平移,旋转,仿射变换
  • 学习函数:cv.getPerspectiveTransform

# 转换

OpenCV提供了两个转换函数cv.warpAffine和cv.warpPerspective,你可以使用它们进行各种转换。cv.warpAffine采用2x3变换矩阵作为参数输入,而cv.warpPerspective采用3x3变换矩阵作为参数输入。

# 缩放

缩放只是调整图像大小,OpenCV有一个函数cv.resize(),可以手动指定图像的大小以及缩放系数,可以使用不同的插值方法,常用的插值方法是用于缩小的cv.INTER_AREA和用于缩放的cv.INTER_CUBIC(慢)和cv.INTER_LINEAR。默认情况下,使用的插值方法是cv.INTER_LINEAR,它用于所有调整大小的操作。你可以使用以下方法之一调整输入图像的大小:

import numpy as np
import cv2 as cv

img = cv.imread('messi5.jpg')

res = cv.resize(img,None,fx=2, fy=2, interpolation = cv.INTER_CUBIC)

#OR

height, width = img.shape[:2]
res = cv.resize(img,(2*width, 2*height), interpolation = cv.INTER_CUBIC)
1
2
3
4
5
6
7
8
9
10
11

# 平移

平移是对象位置的移动。如果你知道像素点(x,y)要位移的距离,让它为变为($$ t_x $$,$$ t_y $$),你可以创建变换矩阵M,如下所示:

$$ M= \begin{bmatrix} 1&0&t_x\ 0&1&t_y \end{bmatrix} $$

可以将其设置为np.float32类型的Numpy数组,并将其传递给cv.warpAffine()函数。下面的示例演示图像像素点整体进行(100,50)位移:

import numpy as np
import cv2 as cv

img = cv.imread('messi5.jpg',0)
rows,cols = img.shape

M = np.float32([[1,0,100],[0,1,50]])
dst = cv.warpAffine(img,M,(cols,rows))

cv.imshow('img',dst)
cv.waitKey(0)
cv.destroyAllWindows()
1
2
3
4
5
6
7
8
9
10
11
12

注意:cv.warpAffine()函数的第三个参数是输出图像的大小,它应该是(宽,高)的形式, width=列数,height=行数。

窗口将如下图显示: image2

# 旋转

通过改变图像矩阵实现图像旋转角度θ

$$ M=\begin{bmatrix} cos\Theta &-sin\Theta\ sin\Theta & cos\Theta \end{bmatrix} $$

OpenCV提供了可调旋转中心的缩放旋转,这样你可以在你喜欢的任何位置进行旋转。修正的变换矩阵由下式给出:

$$ \begin{bmatrix} \alpha & \beta & \left ( 1-\alpha \right )\cdot center.x-\beta \cdot center.y \ -\beta & \alpha & \beta \cdot center.x\left ( 1-\alpha \right )\cdot center.y \end{bmatrix} $$

其中:

$$ \alpha = scale\cdot cos\Theta $$

$$ \beta = scale\cdot sin\Theta $$

为了找到这个转换矩阵,OpenCV提供了一个函数cv.getRotationMatrix2D。以下示例将图像相对于中心旋转90度而不进行任何缩放。

img = cv.imread('messi5.jpg',0)
rows,cols = img.shape

M = cv.getRotationMatrix2D((cols/2,rows/2),90,1)
dst = cv.warpAffine(img,M,(cols,rows))
1
2
3
4
5

窗口将如下图显示:

image3

# 仿射变换

在仿射变换中,原始图像中的所有平行线在输出图像中依旧平行。为了找到变换矩阵,我们需要从输入图像中得到三个点,以及它们在输出图像中的对应位置。然后cv.getAffineTransform将创建一个2x3矩阵,最后该矩阵将传递给cv.warpAffine。

参考以下示例,并查看选择的点(以绿色标记):

img = cv.imread('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 = cv.getAffineTransform(pts1,pts2)

dst = cv.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()
1
2
3
4
5
6
7
8
9
10
11
12
13

窗口将如下图显示:

image4

# 透视变换

对于透视变换,需要一个3x3变换矩阵。即使在转换之后,直线仍是直线。要找到此变换矩阵,需要在输入图像上找4个点,以及它们在输出图像中的对应位置。在这4个点中,其中任意3个不共线。然后可以通过函数cv.getPerspectiveTransform找到变换矩阵,将cv.warpPerspective应用于此3x3变换矩阵。

代码:

img = cv.imread('sudoku.png')
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 = cv.getPerspectiveTransform(pts1,pts2)

dst = cv.warpPerspective(img,M,(300,300))

plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
1
2
3
4
5
6
7
8
9
10
11
12

窗口显示:

image5

编辑 (opens new window)
改变颜色空间
图像阈值

← 改变颜色空间 图像阈值→

最近更新
01
附录L_CUDA底层驱动API
02-08
02
附录K_CUDA计算能力
02-08
03
附录J纹理获取
02-08
更多文章>
Theme by Vdoing | Copyright © 2024-2025 Kongen | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×