计算机视觉|OpenCV_05图像变换

前言:总纲请查看《计算机视觉学习路》
缩放
resize(src , dst , dsize , fx , fy , interpolation)
源,目的–python中不需要dst这个参数,目标的大小,x,y轴的缩放因子,插值算法
如果设置了dsize,就不需要设置fx,fy,二者选其一
插值算法:临近插值INTER_NEAREST,双线性插值(默认)INTER_LINEAR,三次插值INTER_CUBIC,INTER_AREA插值

import cv2 import numpy as npimg = cv2.imread('../img/ex03.jpg') print(img.shape)#676 1202 3 # 缩放成指定大小 new = cv2.resize(img,(400,400)) # 按fx,fy缩放:三次插值 new2 = cv2.resize(img,None,fx=0.3,fy=0.3,interpolation=cv2.INTER_CUBIC)cv2.imshow('img',img) cv2.imshow('new',new) cv2.imshow('new2',new2)cv2.waitKey(0)

翻转
flip(img , flipCode) # flipCode=0 上下翻转; >0 左右翻转 ; <0 上下+左右翻转

import cv2img = cv2.imread('../img/ex03.jpg') img = cv2.resize(img,None,fx=0.5,fy=0.5)# 上下翻转 img1 = cv2.flip(img, 0)# 左右翻转 img2 = cv2.flip(img, 1)# 上下加左右 img3 = cv2.flip(img, -1)cv2.imshow('img', img) cv2.imshow('img1', img1) cv2.imshow('img2', img2) cv2.imshow('img3', img3)cv2.waitKey(0)

旋转
rotate(img, rotateCode)
rotateCode:
ROTATE_90_CLOCKWISE , 旋转90度
ROTATE_180 , 旋转180度
ROTATE_90_COUNTERCLOCKWISE , 旋转270度(反向旋转90度)

import cv2img = cv2.imread('../img/ex03.jpg') img = cv2.resize(img, None, fx=0.5, fy=0.5)img1 = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE) img2 = cv2.rotate(img, cv2.ROTATE_180) img3 = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE)cv2.imshow('img', img) cv2.imshow('img1', img1) cv2.imshow('img2', img2) cv2.imshow('img3', img3)cv2.waitKey(0)

仿射变换
仿射变换是图像旋转、缩放、平移的总称
warpAffine(src , M , dsize , flags , mode , value)
M:变换矩阵
dsize 输出大小
flag 和resize中的插值算法一致
mode 边界外推法
value 填充边界的值
平移 计算机视觉|OpenCV_05图像变换
文章图片

import cv2 import numpy as npimg = cv2.imread('../img/ex03.jpg') img = cv2.resize(img, None, fx=0.5, fy=0.5)# 向右平移100个点 M = np.float32([[1, 0, 100], [0, 1, 0]]) h,w,c = img.shape img1 = cv2.warpAffine(img,M,(w,h))cv2.imshow('img', img) cv2.imshow('img1', img1)cv2.waitKey(0)

变换矩阵 简单的平移矩阵我们可以自己指定,如果变化复杂,我们怎么获得变换矩阵呢?
getRotationMatrix2D(center , angle , scale)
center : 中心点
angle : 角度(逆时针)
scale : 缩放比例
计算机视觉|OpenCV_05图像变换
文章图片

import cv2 import numpy as npimg = cv2.imread('../img/ex03.jpg') img = cv2.resize(img,None,fx=0.5,fy=0.5) h,w,c = img.shape#获取变换矩阵M M = cv2.getRotationMatrix2D((w/2,h/2),60,1.0)# 不改变原图的尺寸所以传入(w,h) img1 = cv2.warpAffine(img,M,(w,h))cv2.imshow('img', img) cv2.imshow('img1', img1)cv2.waitKey(0)

还可以通过变换前后点的坐标获取变换矩阵(三个点可以确定)
getAffineTransform(src[ ], dst[ ])
计算机视觉|OpenCV_05图像变换
文章图片


import cv2 import numpy as npimg = cv2.imread('../img/ex03.jpg') h, w, c = img.shapesrc = https://www.it610.com/article/np.float32([[400,300],[800,300],[400,1000]]) dst = np.float32([[200,400],[600,500],[150,1100]]) # 第二种获取仿射变化图片的方法:通过变换前后点的坐标 M = cv2.getAffineTransform(src,dst)img1 = cv2.warpAffine(img, M, (w, h))cv2.imshow('img', img) cv2.imshow('img1', img1)cv2.waitKey(0)

透视变换
warpPerspective(img , M , dsize, …)
获取变换矩阵:
getPersectiveTransform(src , dst) # 需要四个坐标点(图形的四个角)
【计算机视觉|OpenCV_05图像变换】计算机视觉|OpenCV_05图像变换
文章图片

import numpy as np import cv2im = cv2.imread('../img/pers.png') h, w = im.shape[:2]# 取出高度和宽度# 设置透视变换的原点和目标点 pts1 = np.float32([[58, 2], [167, 9], [8, 196], [126, 196]])# 输入图像四个顶点坐标 pts2 = np.float32([[16, 2], [167, 8], [8, 196], [169, 196]])# 输出图像四个顶点坐标# 生成透视变换矩阵 M = cv2.getPerspectiveTransform(pts1,# 输入图像四个顶点坐标 pts2)# 输出图像四个顶点坐标# 执行透视变换 dst = cv2.warpPerspective(im, M, (w, h))cv2.imshow('im', im) cv2.imshow('dst', dst)cv2.waitKey() cv2.destroyAllWindows()

    推荐阅读