OpenCV图像处理之七种常用图像几何变换

0 程序环境与所学函数

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

所学函数

##放大、缩小
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图像处理之七种常用图像几何变换的详细内容,更多关于OpenCV 图像几何变换的资料请关注我们其它相关文章!

(0)

相关推荐

  • opencv实现图像几何变换

    本文实例为大家分享了opencv实现图像几何变换的具体代码,供大家参考,具体内容如下 图像伸缩(cv2.resize) 图像的扩大与缩小有专门的一个函数,cv2.resize(),那么关于伸缩需要确定的就是缩放比例,可以是x与y方向相同倍数,也可以单独设置x与y的缩放比例.另外一个就是在缩放以后图像必然就会变化,这就又涉及到一个插值问题.那么这个函数中,缩放有几种不同的插值(interpolation)方法,在缩小时推荐cv2.INTER_ARER,扩大是推荐cv2.INTER_CUBIC和cv

  • OpenCV图像几何变换之透视变换

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 1. 基本原理 透视变换(Perspective Transformation)的本质是将图像投影到一个新的视平面,其通用变换公式为: (u,v)为原始图像像素坐标,(x=x'/w',y=y'/w')为变换之后的图像像素坐标.透视变换矩阵图解如下: 仿射变换(Affine Transformation)可以理解为透视变换的特殊形式.透视变换的数学表达式为: 所以,给定透视变换对应的四对像素点坐标,即可求得透视变

  • Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)

    前言 总结一下最近看的关于opencv图像几何变换的一些笔记. 这是原图: 1.平移 import cv2 import numpy as np img = cv2.imread("image0.jpg", 1) imgInfo = img.shape height = imgInfo[0] width = imgInfo[1] mode = imgInfo[2] dst = np.zeros(imgInfo, np.uint8) for i in range( height ): f

  • OpenCV图像处理之七种常用图像几何变换

    0 程序环境与所学函数 本章程序运行需要导入下面三个库,并定义了一个显示图像的函数 所学函数 ##放大.缩小 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) # 水平垂直同时进行 #

  • OpenCV图像处理之常见的图像灰度变换

    1.灰度线性变换 图像的灰度线性变换是图像灰度变换的一种,图像的灰度变换通过建立灰度映射来调整源图像的灰度,从而达到图像增强的目的.灰度映射通常是用灰度变换曲线来进行表示.通常来说,它是将图像的像素值通过指定的线性函数进行变换,以此来增强或者来减弱图像的灰度,灰度线性变换的函数就是常见的线性函数. g(x, y) = k · f(x, y) + d 设源图像的灰度值为x,则进行灰度线性变换后的灰度值为y = kx + b (0<=y<=255),下面分别来讨论k的取值变化时线性变换的不同效果

  • OpenCV实现常见的四种图像几何变换

    目录 准备图片 1. 缩放 cv2.resize()方法 2. 翻转 cv2.flip()方法 3. 仿射变换 warpAffine()方法 3.1 平移 3.2 旋转 3.3 倾斜 4. 透视 准备图片 选择一张shape为(500,500,3)的梵高的<星月夜>以便示例. 1. 缩放 cv2.resize()方法 cv2.resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None) src 原图(的数组) dsize:

  • C++ opencv图像处理实现图片几何变换示例

    目录 简介 一.图像平移 1.图像平移代码 (不改变图像大小) 2.图像平移代码 (改变图像大小) 二.图像旋转 1.图像旋转函数 2.仿射变换函数 3.代码 三.图像缩放 1.图像缩放函数 2.图像缩小代码 3.图像放大代码 总结 简介 图像的几何变换不改变图像的像素值,而是改变像素所在的几何位置,从变换的性质来分,图像的几何变换有图像的位置变换(平移,镜像,旋转).图像的形状变换(放大,缩小,错切)等基本变换,以及图像的复合变换等, 一.图像平移 图像平移是将一幅图像中所有的点都按照指定的平

  • python opencv 图像处理之图像算数运算及修改颜色空间

    目录 1.图像加法 1.1Numpy加法 1.2OpenCV加法 2.图像融合 3.改变颜色空间 1.图像加法 图像加法有两种方式,一种是通过 Numpy 直接对两个图像进行相加,另一种是通过 OpenCV 的 add() 函数进行相加. 不管使用哪种方法,相加的两个图像必须具有相同的深度和类型,简单理解就是图像的大小和类型必须一致. 1.1Numpy加法 Numpy 的运算方法是: img = img1 + img2 ,然后再对最终的运算结果取模. 当最终的像素值 <= 255 时,则运算结果

  • Python+OpenCV图像处理——图像二值化的实现

    简介:图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程. 普通图像二值化 代码如下: import cv2 as cv import numpy as np #全局阈值 def threshold_demo(image): gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY) #把输入图像灰度化 #直接阈值化是对输入的单通道矩阵逐像素进行阈值分割. ret, binary = cv.threshold(gray

  • C++ OpenCV中几种基本的图像处理方式

    目录 一.图像显示 1.OpenCV的命名空间 2.Mat类简析 3.图像的载入:imread()函数 4.imshow()函数 二.图像腐蚀和膨胀 三.图像模糊 四.canny边缘检测 虽然单单要做车牌号识别的话不需要特别多种类的图像处理,但是我们不能只是为了这么一个目标去学习,所以这次就讲一些OpenCV里基本的图像处理,大家以后可以根据需求使用不同的图像处理. 一.图像显示 [打开Visual Studio]→[新建项目]→[Win32控制台应用项目(修改名称后点确定)]→[下一步]→[空

  • Python OpenCV图像处理之图像滤波特效详解

    目录 1分类 2邻域滤波 2.1线性滤波 2.2非线性滤波 3频域滤波 3.1低通滤波 3.2高通滤波 1 分类 图像滤波按图像域可分为两种类型: 邻域滤波(Spatial Domain Filter),其本质是数字窗口上的数学运算.一般用于图像平滑.图像锐化.特征提取(如纹理测量.边缘检测)等,邻域滤波使用邻域算子——利用给定像素周围像素值以决定此像素最终输出的一种算子 频域滤波(Frequency Domain Filter),其本质是对像素频率的修改.一般用于降噪.重采样.图像压缩等. 按

  • Python+OpenCV实现六种常用图像特效

    目录 图像融合 灰度处理 颜色反转 灰度反转 彩色反转 马赛克效果 毛玻璃效果 浮雕效果 图像融合 按照一定的比例将两张图片融合在一起 addWeighted()方法: 参数1第一张图片矩阵 参数2第一张图片矩阵的权重 参数3第二张图片矩阵 参数4第二张图片矩阵的权重 融合之后的偏移量 进行叠加的两张图片宽高应该相同 叠加之后的像素偏移值如果填的话不要填太大,超过255会导致图像偏白 import cv2 import cv2 as cv img = cv.imread("img/lena.jp

随机推荐