20200406.图像几何变换

图像几何变换

  • 缩放
  • 翻转
  • 仿射
    • 平移
    • 旋转
    • 更复杂的仿射变换
  • 透视
  • 重映射
    • 复制
    • 绕x轴翻转
    • 绕y轴翻转
    • 绕x轴、y轴翻转
    • x轴、y轴互换
    • 图像缩放

何谓几何变换,将一幅图像映射到另一幅图像内的操作称为几何变换。
映射关系分为:缩放、翻转、仿射变换、透视、重映射。

缩放

函数名:cv2.resize()
语法格式:dst = cv2.resize(src , dsize [,fx[,fy[,interpolation]]])
参数名:dst:目标图像,类型与src一致,大小为dsize
src:原始图像 dsize:目标图像大小 fx:水平方向缩放比例 fy:垂直方向缩放比例 interpolation:插值方式
特别注意:1、优先通过dsize指定缩放、如果dsize=none 则通过参数fx、fy指定。2、缩小图像时,使用区域插值方式最好;放大图像时,三次样条插值和双线性插值效果较好。3、shape属性第一个参数对应行数,第二个参数对应列数;dsize参数与其相反。

import cv2
import numpy as np
jimin = cv2.imread("C:\\Users\\NNoisy\\Desktop\\Jimin.jpg")
# img.shape[:2] 取彩色图片的高、宽,如果img.shape[:3] 取彩色图片的高、宽、通道
rows , cols = jimin.shape[:2]
size = (int(cols*0.5),int(rows*0.5))
# 使用dsize进行缩放
rst1 = cv2.resize(jimin,size)
# 使用fx、fy参数进行缩放
rst2 = cv2.resize(jimin,None,fx = 0.5 , fy = 0.5)
cv2.imshow("jimin",jimin)
cv2.imshow("rst1",rst1)
cv2.imshow("rst2",rst2)
cv2.waitKey()
cv2.destroyAllWindows()

翻转

函数名:cv2.flip()
语法格式:dst = cv2.flip(src , flipCode)
参数名:dst:目标图像,类型、大小与src一致
src:原始图像 flipCode:旋转类型–>0:绕着x轴翻转 正数:绕着y轴旋转 负数:围绕x轴、y轴同时翻转

仿射

仿射变换是指图像可以通过一系列的几何变换来实现平移、旋转等多种操作。该变换能够保持图像的平直性和平行性。
函数名:cv2.warpAffine()
语法格式:dst = cv2.warpAffine(src,M,dsize[,flags[,borderMode[,bordervalue]]] )
参数名:dst:仿射后的输出图像 src:仿射的原始图像 M:变换矩阵,使用不同的变换矩阵可以实现不同的仿射变换。 dsize:输出图像的尺寸大小。 flags:插值方法 borderMode:边类型 borderValue:边界值,默认是0。

平移

先确定转换矩阵,然后利用cv2.warpAffine()函数进行平移。

import cv2
import numpy as np
jimin = cv2.imread("C:\\Users\\NNoisy\\Desktop\\Jimin.jpg")
# img.shape[:2] 取彩色图片的高、宽,如果img.shape[:3] 取彩色图片的高、宽、通道
height , weight = jimin.shape[:2]
x = 100
y = 200
# 定义转换矩阵
M = np.float32([[1,0,x],[0,1,y]])
# 对图像进行平移
move = cv2.warpAffine(jimin,M,(weight,height))
cv2.imshow("jimin",jimin)
cv2.imshow("move",move)
cv2.waitKey()
cv2.destroyAllWindows()

20200406.图像几何变换_第1张图片

旋转

转换矩阵的获得可以通过函数cv2.getRotationMatrix2D()获得。
函数名:cv2.getRotationMatrix2D()
语法格式:retval = cv2.getRotationMatrix2D(center,angle,scale)

import cv2
import numpy as np
jimin = cv2.imread("C:\\Users\\NNoisy\\Desktop\\Jimin.jpg")
# img.shape[:2] 取彩色图片的高、宽,如果img.shape[:3] 取彩色图片的高、宽、通道
height , weight = jimin.shape[:2]
# 定义转换矩阵
M = cv2.getRotationMatrix2D((weight/2,height/2),45,0.6)
# 对图像进行旋转
rotate = cv2.warpAffine(jimin,M,(weight,height))
cv2.imshow("jimin",jimin)
cv2.imshow("rotate",rotate)
cv2.waitKey()
cv2.destroyAllWindows()

更复杂的仿射变换

openCV提供cv2.getAffineTransform()来生成仿射函数所使用的转换矩阵M。可以将矩形映射为任意平行四边形。
语法格式:retval = cv2.getAffineTransform(src , dst)
参数:src = 输入图像的三个点坐标 dst = 输出图像的三个点坐标

import cv2
import numpy as np
jimin = cv2.imread("C:\\Users\\NNoisy\\Desktop\\Jimin.jpg")
# img.shape[:2] 取彩色图片的高、宽,如果img.shape[:3] 取彩色图片的高、宽、通道
height , weight = jimin.shape[:2]
# 定义src和dst
s = np.float32([[0,0],[weight-1,0],[0,height-1]])
d = np.float32([[0,height*0.5],[weight*0.8,height*0.25],[weight*0.15,height*0.6]])
# 定义转换矩阵
M = cv2.getAffineTransform(s,d)
# 对图像进行变换
rotate = cv2.warpAffine(jimin,M,(weight,height))
cv2.imshow("jimin",jimin)
cv2.imshow("rotate",rotate)
cv2.waitKey()
cv2.destroyAllWindows()

透视

透视变换可以将矩形映射为任意四边形。
函数名:cv2.warpPerspective()
语法格式:dst = cv2.warpPerspective(src,M,dsize[,flags[,borderMode[,bordervalue]]] )
参数名:dst:透视后的输出图像 src:透视的原始图像 M:变换矩阵,使用不同的变换矩阵可以实现不同的透视变换。 dsize:输出图像的尺寸大小。 flags:插值方法 borderMode:边类型 borderValue:边界值,默认是0。

openCV提供cv2.getPerspectiveTransform()来生成透视函数所使用的转换矩阵M。
语法格式:retval =cv2.getPerspectiveTransform(src , dst)
参数:src = 输入图像的四个点坐标 dst = 输出图像的四个点坐标

import cv2
#和仿射的代码基本一致。

重映射

把一幅图像内的像素点放置到另一幅图像内的指定位置,这个过程称为重映射。
函数名:cv2.remap()
语法格式:dst = cv2.remap(src , map1 , map2 ,interpolation , [, borderMode [, borderValue ] ] )
参数含义
dst = 目标图像
src = 原始图像
map1 = (1)表示点(x,y)的一个映射;(2)表示CV_16SC2,CV_32FC1,CV_32FC1类型 (x,y)点的x值。
map2 = (1)当map1表示(x,y)时,该值为空;(2)当map1表示点(x,y)的x值时,表示CV_16SC2,CV_32FC1类型 (x,y)点的y值。
interpolation:插值方式,不支持INTER_AREA

复制

import cv2
import numpy as np
jimin = cv2.imread("C:\\Users\\NNoisy\\Desktop\\Jimin.jpg")
r , c = jimin.shape[:2]
mapx = np.zeros(jimin.shape[:2],np.float32)
mapy = np.zeros(jimin.shape[:2],np.float32)
for i in range(r):
    for j in range(c):
        mapx.itemset((i,j),j)
        mapy.itemset((i,j),i)
jimincopy = cv2.remap(jimin,mapx,mapy,cv2.INTER_LINEAR)
cv2.imshow("jimin",jimin)
cv2.imshow("jimincopy",jimincopy)
cv2.waitKey()
cv2.destroyAllWindows()

绕x轴翻转

图像绕x轴旋转,意味着在映射过程中:x轴的值不变,y轴的值以x轴为对称轴进行变换。
反映在map1,map2的变化即:
map1值保持不变;map2的值调整为“总行数-1-当前行号”

绕y轴翻转

图像绕y轴旋转,意味着在映射过程中:y轴的值不变,x轴的值以y轴为对称轴进行变换。
反映在map1,map2的变化即:
map2值保持不变;map1的值调整为“总列数-1-当前列号”

绕x轴、y轴翻转

综上,如果想图像绕x轴、y轴翻转,则:
y轴的值以x轴为对称轴进行变换
x轴的值以y轴为对称轴进行变换
反映在map1,map2的变化即:
map1的值调整为“总列数-1-当前列号”
map2的值调整为“总行数-1-当前行号”

x轴、y轴互换

如果想图像x轴、y轴互换,则:
x、y轴坐标互换
反映在map1,map2的变化即:
map1的值调整为所在行的行号
map2的值调整为所在列的列号

图像缩放

通过对map1、map2的值进行调整,实现更为复杂的问题。

你可能感兴趣的:(openCV图像处理入门,opencv,计算机视觉,python)