OpenCV计算机视觉(三) —— 图像的几何变换
图像的几何变换主要包括图像的翻转、平移、旋转、透视以及一些镜像变换。主要是对图像的大小、位置、坐标进行操作,来实现图片的几何变换。
思维导图如下:
下面将针对这五个方面进行一一讲解。
图像的翻转
主要通过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计算机视觉(三) —— 图像的几何变换相关推荐
- OpenCV系列之图像的几何变换 | 十四
目标 学习将不同的几何变换应用到图像上,如平移.旋转.仿射变换等. 你会看到这些函数: cv.getPerspectiveTransform 变换 OpenCV提供了两个转换函数cv.warpAffi ...
- Opencv计算机视觉入门——图像的处理(一)
接上次的笔记,开始图像操作的第二段学习旅程~~~ 图像的处理(一) 图像阈值 拿到一张图像,图像是由众多像素点组成的,我们要对每一个像素点的值进行判断,用像素点的值与阈值进行比较,对于大于或小于阈值分 ...
- 【计算机视觉】OpenCV篇(3) - 图像几何变换(仿射变换/透视变换)
图像的几何变换从原理上看主要包括两种:基于2×3矩阵的仿射变换(平移.缩放.旋转和翻转等).基于3×3矩阵的透视变换. 仿射变换 基本的图像变换就是二维坐标的变换:从一种二维坐标(x,y)到另一种二 ...
- OpenCV计算机视觉编程篇三《处理图像的颜色》
前言 前期回顾: OpenCV计算机视觉编程篇二<操作像素> 上面这篇里面写了操作像素相关. 本章包括以下内容: 用策略设计模式比较颜色: 用 GrabCut 算法分割图像: 转换颜色表示 ...
- [python opencv 计算机视觉零基础到实战] 六、图像运算
一.学习目标 了解opencv中图像运算的方法 了解opencv中图像运算的运用 如有错误欢迎指出~ 二.了解OpenCV中图像运算的运用 目录 [python opencv 计算机视觉零基础到实战] ...
- [python opencv 计算机视觉零基础到实战] 三、numpy与图像编辑
一.学习目标 了解图片的通道与数组结构 了解使用numpy创建一个图片 了解使用numpy对图片的一般操作方法 目录 [python opencv 计算机视觉零基础到实战] 一.opencv的hell ...
- 【OpenCV图像处理】五、图像的几何变换(下)
5.1 图像的缩放变换 图像的缩放指的是将图像的尺寸变小或变大的过程,也就是减少或增加原图像数据的像素个数.简单来说,就是通过增加或删除像素点来改变图像的尺寸.当图像缩小时,图像会变得更加清晰,当图像 ...
- OpenCV计算机视觉实战 | 第5章 图像梯度算子
本文为课程<OpenCV计算机视觉实战>的课程笔记. 本章节讲述了图像梯度的计算方法.图像的梯度表征每个像素点和周围像素点差异程度. 上:梯度值公式:下:梯度方向公式 1 Sobel算子 ...
- youcans 的 OpenCV 学习课—5.图像的几何变换
youcans 的 OpenCV 学习课-5.图像的几何变换 本系列面向 Python 小白,从零开始实战解说 OpenCV 项目实战. 几何变换是指对图像的位置.大小.形状.投影进行变换,是将图像从 ...
最新文章
- 查看linux内核的glibc库,查看当前系统的glibc版本
- IOS开发笔记7-C语言基础复习
- 黑马java教程是什么_Java教程:揭秘什么是面向接口编程
- relative和absolute的区别
- c语言的变量,常量及作用域等
- JetBrains 加入 .NET 基金会
- 架构设计之「 微服务入门 」
- 比起月薪过万的程序员大多数人居然选择了月薪3K的公务员?
- NB-IoT四大关键特性及实现告诉你,为啥NB
- “3D字体”素材|让你的设计脱颖而出,看起来与众不同
- C++引用和指针区别
- 初探 performance – 监控网页与程序性能
- 我的idea突然没有SVN了是怎么回事
- 拓端tecdat|如何用r语言制作交互可视化报告图表
- IntelliJ IDEA主题选择
- 平面图最小割 BZOJ 2006
- matlab播放 视频帧,MATLAB读取视频并按帧保存
- 百度搜索和百度信息流有什么区别?
- NDK at ...Android\Sdk\ndk\21.1.6528147 did not have a source.properties file
- 华为海思Hikey 970+ Ubuntu16.04 Xenial +ROS kinetic