目录

0 程序环境与所学函数

1 裁剪、放大、缩小

2 平移变换

3 错切变换

4 镜像变换

5 旋转变换

6 透视变换

7 最近邻插值、双线性插值


0 程序环境与所学函数

本章程序运行需要导入下面三个库,并定义了一个显示图像的函数

import cv2 as cv
import numpy as np
import matplotlib.pyplot as pltdef show(img):if img.ndim == 2:plt.imshow(img, cmap='gray')else:plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))plt.show()

所学函数

##放大、缩小

cv.resize(img,dsize,[interpolation])

##平移变换

M = np.array([[...]], dtype=np.float32)
cv.warpAffine(img, M, dsize)

##镜像变换

cv.flip(img, 1) # 垂直镜像
cv.flip(img, 0) # 水平镜像
cv.flit(img, -1) # 水平垂直同时进行

##旋转变换

M = cv.getRotationMatrix2D(center, angle, scale)
img_rotate = cv.rotate(img, cv.ROTATE_90_CLOCKWISE)

##透视变换

M = cv.getPerspectiveTransform(src, dst)
img = cv.warpPerspective(img, M, dsize)

1 裁剪、放大、缩小

读入图像

img =  cv.imread('pic/rabbit500x333.jpg')
show(img)

显示

 裁剪:数组选择方法(冒号)

#裁剪
rabbit = img[150:450:] #限定行数,列数和三通道
show(rabbit)

显示

放大和缩小:resize()函数

插值方法

程序实现

#放大缩小
#cv.resize(img,dsize,[interpolation])  dsize表示大小,[interpolation]是插值方法,可选,有默认值
img2 = cv.resize(img,(500,400))  #放大为宽500高400
#使用定义插值方法
#一般来说放大地话选择LINEAR方法,缩小选择AREA方法
img3 = cv.resize(img,(500,400),interpolation=cv.INTER_NEAREST)
show(np.hstack([img2,img3]))

显示

2 平移变换

原理、平移矩阵推导

 读入图像

img = cv.imread('pic/rabbit500x333.jpg')
show(img)

显示

程序实现

# M = np.array([[...]],dtype=np.float32)
# cv.warAffine(img,M,dsize) cv里面图像仿射变换函数,M是上面矩阵,dsize是输出图像大小
M=np.array([[1,0,100],[0,1,50]
],dtype=np.float32)  #水平向右平移100个像素点,竖直向下平移50个像素点,原理见理论部分img2 = cv.warpAffine(img,M,(333,500))
show(img2)

显示

3 错切变换

原理、错切矩阵推导

 读入图像

img = cv.imread('pic/rabbit500x333.jpg')
show(img)

显示

 水平错切

M = np.array([[1,0.2,0],[0,1,0]
],dtype=np.float32)img3 = cv.warpAffine(img,M,(533,500))
show(img3)

显示

 垂直错切

M = np.array([[1,0,0],[0.3,1,0]
],dtype=np.float32)img3 = cv.warpAffine(img,M,(333,700))
show(img3)

显示

4 镜像变换

原理、镜像矩阵推导

 读入图像

img = cv.imread('pic/rabbit500x333.jpg')
show(img)

显示

 水平镜像

Mx = np.array([[-1,0,333],[0,1,0]
],dtype = np.float32)
img2 = cv.warpAffine(img,Mx,(333,500))  #仿射变换函数
show(img2)

显示

 垂直镜像

My = np.array([[1,0,0],[0,-1,500]
],dtype=np.float32)img3 = cv.warpAffine(img,My,(333,500))
show(img3)

显示

opencv内置函数实现镜像变换

#垂直镜像 cv.flip(img,1)
#水平镜像 cv.flip(img,0)
#水平垂直同时进行 cv.flip(img,-1)

程序实现

img4 = cv.flip(img,1)  #垂直镜像
img5 = cv.flip(img,0)  #水平镜像
img6 = cv.flip(img,-1) #水平垂直镜像同时进行show(np.hstack([img4,img5,img6]))

显示

5 旋转变换

原理、旋转矩阵推导

 读入图像

img = cv.imread('pic/rabbit500x333.jpg')
show(img)

显示

 图像旋转

beta = np.pi/4
#旋转矩阵
M  = np.array([[np.cos(beta),np.sin(beta),0],[-np.sin(beta),np.cos(beta),0]
],dtype=np.float32)img2 = cv.warpAffine(img,M,(633,300))
show(img2)

显示

 opencv内置获取旋转矩阵函数:

M = cv.getRotationMatrix2D(center,angle,scale)

center是旋转中心,angle是旋转角度,scale表示放大还是缩小

用上面函数获取旋转矩阵并实现图像旋转

h,w,c = img.shape  #获取图像的高度和宽度,方便后面设置旋转中心M2 = cv.getRotationMatrix2D((w//2,h//2),45,1)
img3 = cv.warpAffine(img,M2,(533,500))  #仿射函数实现
show(img3

显示

 opencv内置实现图像旋转函数

img_rotate =cv.rotate(img,cv.ROTATE_90_COUNTERCLOCKWISE)

只能进行90度倍数的旋转

程序实现

# 逆时针旋转90度
img_rotate = cv.rotate(img,cv.ROTATE_90_COUNTERCLOCKWISE)
show(img_rotate)

显示

6 透视变换

M = cv.getPerspectiveTransform(str,dst)

str:原始图像矩阵端点位置,dst:目标图像矩阵位置
img2 = cv.warpPerspective(img,M,(w,h))

读入图像

img = cv.imread('pic/parthenon500x750.jpg')
show(img)

显示

程序实现

#在原图中定位四个点,这里找的是柱子前面四个点的大概位置,眼睛观察法找的
str = np.array([[210,50],[610,270],[650,470],[150,450]
],dtype=np.float32)#目标图像中矩阵
dst = np.array([[150,50],[650,50],[650,470],[150,470]
],dtype=np.float32)h,w,c = img.shape#透视变换将一个类似矩形的图形拉成一个矩形
M = cv.getPerspectiveTransform(str,dst)
img2 = cv.warpPerspective(img,M,(w,h))
show(img2)

显示

应用:车道检测、图片矫正

7 最近邻插值、双线性插值

原理:

最近邻插值图示:

双线性插值图示

 读入图像

img = cv.imread('pic/rabbit50x33.jpg')
show(img)

显示

程序实现

img1 = cv.resize(img,(330,500),interpolation=cv.INTER_NEAREST) #最近邻插值
img2 = cv.resize(img,(330,500),interpolation=cv.INTER_LINEAR_EXACT) #精确双线新插值show(np.hstack([img1,img2]))

显示

可以看出最近邻插值还是比较模糊的,过渡结果没有双线性插值平滑

【图像处理opencv】_图像几何变换相关推荐

  1. OpenCV中的图像处理 —— 改变颜色空间+图像几何变换

    OpenCV中的图像处理 -- 改变颜色空间+图像几何变换 这一部分主要介绍OpenCV图像处理中的改变颜色空间和图像的几何变换,颜色空间的改变应用非常广泛,在处理图像的实际问题中,经常需要要图像变换 ...

  2. [Python图像处理] 十二.图像几何变换之图像仿射变换、图像透视变换和图像校正

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  3. Python 计算机视觉(五)—— OpenCV 进行图像几何变换

    几何变换不改变图像的像素值,只是实现图像像素点的重新安排:恰当的进行图像的几何变换,可以减小甚至避免由于角度等一些因素造成的图像失真问题,有利于我们在识别图像时将注意力集中到图像的有效信息中而不至于被 ...

  4. 图像处理--OpenCV实现图像加噪与滤波

    前言: Hello大家好,我是Dream. 今天来学习一下如何使用OpenCV实现图像加噪与滤波,欢迎大家一起参与探讨交流~ 本文目录: 一.实验内容 二.实验环境和配置 三.实验原理及操作 1. 添 ...

  5. 【OpenCV】图像几何变换:旋转,缩放,斜切

    2019独角兽企业重金招聘Python工程师标准>>> 几何变换 几何变换可以看成图像中物体(或像素)空间位置改变,或者说是像素的移动. 几何运算需要空间变换和灰度级差值两个步骤的算 ...

  6. [Python从零到壹] 三十九.图像处理基础篇之图像几何变换(镜像仿射透视)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  7. [Python从零到壹] 三十八.图像处理基础篇之图像几何变换(平移缩放旋转)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  8. Python图像处理丨带你掌握图像几何变换

    摘要:本篇文章主要讲解图像仿射变换和图像透视变换,通过Python调用OpenCV函数实. 本文分享自华为云社区<[Python图像处理] 十二.图像几何变换之图像仿射变换.图像透视变换和图像校 ...

  9. python灰度图片格式_[Python图像处理] 十五.图像的灰度线性变换

    [Python图像处理] 十五.图像的灰度线性变换 发布时间:2019-03-28 00:08, 浏览次数:619 , 标签: Python 该系列文章是讲解Python OpenCV图像处理知识,前 ...

最新文章

  1. Postman使用Date数据类型,Postman发送Date类型数据,Postman模拟前端调用
  2. mysql如何防止插入重复数据_防止MySQL重复插入数据的三种方法
  3. 【数字信号处理】傅里叶变换性质 ( 傅里叶变换线性性质 | 傅里叶变换时移性质 )
  4. 剑指offer(Java实现) 求1+2+3+…+n
  5. pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换
  6. 64位有符号与无符号类型的整数
  7. Android自定义view之圆形进度条
  8. 【Spring第二篇】IOC:控制反转
  9. stretchblt 模糊_微软开源持续开发模糊测试工具OneFuzz
  10. 数位DP入门题 hdu 2089 hdu 3555
  11. NLP学习—19.检索式对话系统中的rank评估指标、rank技术(Point-wise/Pair-wise/List-wise)以及RankNet、LambdaRank、LambdaMART
  12. ThinkPHP5捕获致命错误流程
  13. CANoe下载地址以及CAN Demo 16的下载与激活,并附录所有CANoe软件版本
  14. SAP的Abap培训
  15. 发送导频信号用到的 matlab function
  16. python猜字游戏算法设计_Python 制作一个猜字游戏
  17. 青岛科技大学计算机学院官网,青岛科技大学
  18. 券商评级:南山铝业 中天科技 大族激光
  19. mactex+vscode+skim打造latex编译环境
  20. PCB线路板塞孔工艺的那些事儿~

热门文章

  1. linux 快照备份导出,KVM之虚拟机几种备份方法(快照/克隆/导出)
  2. oracle如何启动和停止服务,CentOS启动和停止服务详解
  3. python中dtypes_关于python:如何通过pandas DataFrame中的列设置dtypes
  4. python无法打开文档_win32com Excel。应用程序无法打开任何文档
  5. python接口自动化测试面试题_Python接口自动化面试题总结
  6. Java的call by value_call by value or reference ?
  7. java cmd 等待输入_JAVA:调用cmd指令(支持多次手工输入)
  8. Oracle数据库对象----视图
  9. java代码连接数据库
  10. python long_python long函数是什么?如何使用?