图像的几何变换主要包括图像的翻转、平移、旋转、透视以及一些镜像变换。主要是对图像的大小、位置、坐标进行操作,来实现图片的几何变换。

思维导图如下:

下面将针对这五个方面进行一一讲解。

图像的翻转

主要通过cv.flip()实现图像的翻转,主要包括X轴翻转,Y轴翻转以及XY轴翻转。

cv.flip(src,flipCode,dst=None)

src:原始图像

dst:代表与原始图像具有同样大小,同样通道数的目标图像

flipCode:旋转类型具体有三个:

0:绕X轴翻转          正数:绕Y轴翻转          负数:绕Y轴翻转

具体实现代码如下:

import cv2 as cvimg = cv.imread('zzf3.jpg')
img = cv.resize(img, (800, 500))
cv.imshow('zzf3', img)# 绕X轴翻转
img1 = cv.flip(img, 0)
cv.imshow('flip_X', img1)# 绕Y轴翻转
img2 = cv.flip(img, 1)
cv.imshow('flip-Y', img2)# 绕XY轴翻转
img3 = cv.flip(img, -1)
cv.imshow('flip_XY', img3)
cv.waitKey(0)
cv.destroyAllWindows()

运行结果如下图:

可以看出flip()实现了对原图的X轴、Y轴、XY轴的翻转。张子枫小妹妹真可爱!

图像的平移

通过cv.warpAffine()实现图像的平移,具体用法见:(16条消息) OpenCV-Python计算机视觉函数_一只会飞的猪️的博客-CSDN博客

平移图像的位置通过对原图像与平移矩阵相乘决定,由矩阵可以看出,新图像的x,y坐标分别为:

X = a1x+a2y+a3          Y = a4x+a5y+a6

例如我们想向右平移50个像素,向下平移80个像素平移矩阵就为:

废话不多说,上代码:

import cv2 as cv
import numpy as npimg = cv.imread('zzf5.jpg')
img = cv.resize(img, (800, 500))
cv.imshow('zzf3', img)M = np.float32([[1, 0, 50], [0, 1, 80]])img2 = cv.warpAffine(img, M, (800, 500))
cv.imshow('warpAffine.zzf3', img2)
cv.waitKey(0)
cv.destroyAllWindows()

运行结果如下:

可以看出,对图像进行了平移操作。要注意的是,cv,,waapAffine()里面必须传递输出图片的大小dsize,不然会报错。

图像的旋转

图像的旋转在我看来就是构建一个映射矩阵然后使用平移,将原图的点映射到对应的位置。主要使用cv.getRotationMatrix2D()构建映射矩阵,然后通过cv.warpAffine()实现位置变换,达到图像旋转的要求。具体代码如下:

import cv2 as cvimg = cv.imread('ZZF6.jpg')
img = cv.resize(img, None, fx=0.5, fy=0.5)
print(img.shape)# 构建映射矩阵
M = cv.getRotationMatrix2D((270, 480), 45, 1)# 实现位置变换
rotation_img = cv.warpAffine(img, M, (960, 540))
cv.imshow('rotation_img', rotation_img)
cv.imshow('zzf6', img)
cv.waitKey(0)
cv.destroyAllWindows()

运行结果如下:

大家要注意这个print(img.shape)输出的图片尺寸与dsize里面的相反,因为shape显示的是RGB的值,而OpenCV,默认的是BGR,所以相反。

图像的透视

图像的透视变换思路与旋转有点像,主要是修复倾斜的图像和实现图片的倾斜。主要使用cv.getPerspectiveTransform()构建透视矩阵,然后用cv.warpPerspective()进行透视位置的变换。代码如下:

import cv2 as cv
import numpy as np'读取原始图像'
img = cv.imread('zzf7.jpg')
img = cv.resize(img, None, fx=0.5, fy=0.5)
print(img.shape)pts1 = np.float32([[0, 0], [600, 0], [0, 960], [600, 960]])
pts2 = np.float32([[0, 100], [510, 0], [100, 760], [500, 740]])'生成透视矩阵'
M = cv.getPerspectiveTransform(pts1,pts2)'平移透视'
dst = cv.warpPerspective(img, M, (960, 600))
cv.imshow('w0', img)
cv.waitKey(0)
cv.imshow('w1', dst)
cv.waitKey(0)

运行结果如下图:

可以看出来透视变换和旋转变换还是有区别的 ,两个函数的具体用法大家可以看我的第一篇博客,也可以去网上查函数的参数。

图像的镜像

图像的镜像我主要是通过交换图像中的像素点来实现的,可以分为水平镜像,垂直镜像与对角镜像。具体代码如下:

'''通过cv.deepcopy()实现图形的复制
'''
import cv2 as cv
import copy
img = cv.imread('zzf.jpg')
img = cv.resize(img, None, fx=0.3, fy=0.3)
print(img.shape)
size = img.shape
cv.imshow('lovely', img)'实现水平镜像 高度上的像素点不变,将宽度上的像素点交换'
img1 = copy.deepcopy(img)
h = size[0]  # 图片的宽
w = size[1]  # 图片的长
for i in range(h):for j in range(w):img1[i, w-1-j] = img[i, j]
cv.imshow('shuiping', img1)'实现垂直镜像 高度上的像素点交换,不改变宽度上的像素点'
img2 = copy.deepcopy(img)
h = size[0]
w = size[1]
for i in range(h):for j in range(w):img2[h-1-i, j] = img[i, j]
cv.imshow('chuizhi', img2)'实现对角镜像 ,高度和宽度上的像素点都交换'
img3 = copy.deepcopy(img)
h = size[0]
w = size[1]
for i in range(h):for j in range(w):img3[h-1-i, w-1-j]=img[i, j]
cv.imshow('duijiao3', img3)
cv.waitKey(0)
cv.destroyAllWindows()

运行结果如下:

水平镜像只需要把图像左右对称点位置的像素值交换,垂直镜像需要把图片上下对称的像素值交换 ,对角镜像要把图像关于图片中心对称的像素值交换。

总结:该文章主要讲述了如何进行图像变换,以及图像变换的常用操作,翻转、平移、旋转、透视、镜像变换。各个变换由各个变换的用途,需要大家自己去了解,将其运用在实际问题当中。

OpenCV计算机视觉(三) —— 图像的几何变换相关推荐

  1. OpenCV系列之图像的几何变换 | 十四

    目标 学习将不同的几何变换应用到图像上,如平移.旋转.仿射变换等. 你会看到这些函数: cv.getPerspectiveTransform 变换 OpenCV提供了两个转换函数cv.warpAffi ...

  2. Opencv计算机视觉入门——图像的处理(一)

    接上次的笔记,开始图像操作的第二段学习旅程~~~ 图像的处理(一) 图像阈值 拿到一张图像,图像是由众多像素点组成的,我们要对每一个像素点的值进行判断,用像素点的值与阈值进行比较,对于大于或小于阈值分 ...

  3. 【计算机视觉】OpenCV篇(3) - 图像几何变换(仿射变换/透视变换)

    图像的几何变换从原理上看主要包括两种:基于2×3矩阵的仿射变换(平移.缩放.旋转和翻转等).基于3×3矩阵的透视变换.  仿射变换 基本的图像变换就是二维坐标的变换:从一种二维坐标(x,y)到另一种二 ...

  4. OpenCV计算机视觉编程篇三《处理图像的颜色》

    前言 前期回顾: OpenCV计算机视觉编程篇二<操作像素> 上面这篇里面写了操作像素相关. 本章包括以下内容: 用策略设计模式比较颜色: 用 GrabCut 算法分割图像: 转换颜色表示 ...

  5. [python opencv 计算机视觉零基础到实战] 六、图像运算

    一.学习目标 了解opencv中图像运算的方法 了解opencv中图像运算的运用 如有错误欢迎指出~ 二.了解OpenCV中图像运算的运用 目录 [python opencv 计算机视觉零基础到实战] ...

  6. [python opencv 计算机视觉零基础到实战] 三、numpy与图像编辑

    一.学习目标 了解图片的通道与数组结构 了解使用numpy创建一个图片 了解使用numpy对图片的一般操作方法 目录 [python opencv 计算机视觉零基础到实战] 一.opencv的hell ...

  7. 【OpenCV图像处理】五、图像的几何变换(下)

    5.1 图像的缩放变换 图像的缩放指的是将图像的尺寸变小或变大的过程,也就是减少或增加原图像数据的像素个数.简单来说,就是通过增加或删除像素点来改变图像的尺寸.当图像缩小时,图像会变得更加清晰,当图像 ...

  8. OpenCV计算机视觉实战 | 第5章 图像梯度算子

    本文为课程<OpenCV计算机视觉实战>的课程笔记. 本章节讲述了图像梯度的计算方法.图像的梯度表征每个像素点和周围像素点差异程度. 上:梯度值公式:下:梯度方向公式 1 Sobel算子 ...

  9. youcans 的 OpenCV 学习课—5.图像的几何变换

    youcans 的 OpenCV 学习课-5.图像的几何变换 本系列面向 Python 小白,从零开始实战解说 OpenCV 项目实战. 几何变换是指对图像的位置.大小.形状.投影进行变换,是将图像从 ...

最新文章

  1. 查看linux内核的glibc库,查看当前系统的glibc版本
  2. IOS开发笔记7-C语言基础复习
  3. 黑马java教程是什么_Java教程:揭秘什么是面向接口编程
  4. relative和absolute的区别
  5. c语言的变量,常量及作用域等
  6. JetBrains 加入 .NET 基金会
  7. 架构设计之「 微服务入门 」
  8. 比起月薪过万的程序员大多数人居然选择了月薪3K的公务员?
  9. NB-IoT四大关键特性及实现告诉你,为啥NB
  10. “3D字体”素材|让你的设计脱颖而出,看起来与众不同
  11. C++引用和指针区别
  12. 初探 performance – 监控网页与程序性能
  13. 我的idea突然没有SVN了是怎么回事
  14. 拓端tecdat|如何用r语言制作交互可视化报告图表
  15. IntelliJ IDEA主题选择
  16. 平面图最小割 BZOJ 2006
  17. matlab播放 视频帧,MATLAB读取视频并按帧保存
  18. 百度搜索和百度信息流有什么区别?
  19. NDK at ...Android\Sdk\ndk\21.1.6528147 did not have a source.properties file
  20. 华为海思Hikey 970+ Ubuntu16.04 Xenial +ROS kinetic

热门文章

  1. pat乙级1026题解
  2. Python生成前缀+随机数
  3. 微信小程序用户昵称包含表情图片的解决方案
  4. CSS3新特性详细介绍
  5. 23种设计模式分析(4):结构型模式
  6. 几何光学学习笔记(10)- 3.4 理想光学系统的放大率
  7. Android开发中长度单位简介
  8. 999.项目管理的一些计算技巧
  9. 百度搜索结果显示“我喜欢”按钮
  10. 【c++】c++中顶层const与底层const