【OpenCV学习】(六)图像基本变换

【OpenCV学习】(六)图像基本变换

背景

图像的变换通常用于数据预处理部分,例如缩放旋转等常见的图像变换方法;在一些深度学习框架内部都分装了图像变换的方法,对训练集做统一的图像变换操作;

一、图像缩放

函数原型:

resize(src,dsize,[fx,fy,interpolation])

  • fx:x轴的缩放因子;
  • fy:y轴的缩放因子;
  • interpolation:插值算法;

插值算法有以下几种:

1、INTER_NEAREST:最近邻插值,速度快,效果差;

2、INTER_LINEAR:双线性插值,基于原图的四个点;(默认插值方法)

3、INTER_CUBIC:三次插值,基于原图16个点,效果好但耗时大;

4、INTER_AREA:效果最好,速度也最慢;

二、图像翻转

图像翻转不等同于旋转,类似于一些视频的拍摄,拍摄后实际是左右颠倒的,通过图像翻转可进行还原;

函数原型:

filp(img,filpCode):filpCode等于0(上下翻转)、大于0(左右翻转)、小于0(上下+左右翻转)

代码案例:

cv2.filp(img, 0)	# 上下翻转
cv2.filp(img, 1)	# 左右翻转
cv2.filp(img, -1)	# 上下左右翻转

三、图像旋转

函数原型:

rotate(img,rotateCode)

  • ROTATE_90_CLOCKWISE:顺时针旋转90°
  • ROTATE_180:旋转180°
  • ROTATE_90_COUNTERCLOCKWISE:逆时针旋转90°

四、图像仿射变换——平移

首先介绍一下放射变换,简单来说就是图像旋转、缩放、平移的总称;

函数原型:

warpAffine(src,M,dsize,flags,mode,value)

  • M:变换矩阵
  • dsize:输出尺寸大小
  • flags:与size中的插值算法一致
  • mode:边界外推法标志
  • value:填充边界的值

实际上平移矩阵就是一个2x2的单位矩阵加上一个2x1的平移向量,也就是2x3的矩阵;

代码案例:

img = cv2.imread('img.jpg')
h,w,c = img.shape
M = np.float32([[1, 0, 500], [0, 1, 0]])	# x方向平移500个像素点
new = cv2.warpAffine(img, M, (w, h))
cv2.imshow('new', new)
cv2.waitKey(0)

五、图像仿射变换——旋转

获取变换矩阵M的两种方法:

1、getRotationMatrix2D(center,angle,scale)

  • center:中心点
  • angle:旋转角度(逆时针)
  • scale:缩放比例(宽高同时缩放)

代码案例:

M = cv2.getRotationMatrix2D((100,100), 30, 1.0)
new = cv2.warpAffine(img, M, (w, h))

2、getAffineTransform(src[],dst[])

定义:通过点对应找到变换矩阵,一般三个点就可以;

拓展:这里可以联想到TPS算法,也是通过对应点进行变换的一种方法,二者可能有想通之处;

代码案例:

src = np.float32([[100, 200], [300, 400], [500, 700]])
dst = np.float32([[300, 400], [800, 500], [900, 800]])
cM = cv2.getAffineTransform(src, dst)
new = cv2.warpAffine(img, M, (w, h))

六、透视变换

这里用一个具体案例来介绍,例如拍照搜题的软件,当拍摄整页时会有一种书本和桌面组合的样子,经过透视变换后能更好的将想要的信息放在图像中;

仿射变换函数原型:

warpPerspective(img,M,dsize,…)

获取变换矩阵函数原型:

getPerspective(src,dst):和getAffineTransform函数比较类似,不同的是需要四个坐标点(图形四个角);

代码案例:

paper = cv2.imread('paper.png')

src = np.float32([[100,1100], [2100, 1100], [0, 4000], [2500, 3900]])
dst = np.float32([[0, 0], [2300, 0], [0, 3000], [2300, 3000]])

M = cv2.getPerspectiveTransform(src, dst)
new = cv2.warpPerspective(paper, M, (2300, 3000))
paper = cv2.resize(paper, (460, 600))
new = cv2.resize(new, (460, 600))

cv2.imshow('org', paper)
cv2.imshow('new', new)
cv2.waitKey(0)

【OpenCV学习】(六)图像基本变换_第1张图片

总结

图像的变换在解决一些小问题上十分有效,特别是变换矩阵的获取,本质上变换矩阵就是一个滤波器,通过该滤波器改变了图像中一些点的像素值;像仿射变换、透视变换,都是十分常用的方法,用于图像的前处理部分;

你可能感兴趣的:(OpenCV,opencv,计算机视觉,python,图像处理,程序员)