图像的简单几何变换
几何变换不改变图像的像素值,只是在图像平面上进行像素的重新安排
适当的几何变换可以最大程度地消除由于成像角度、透视关系乃至镜头自身原因所造成的几何失真所产生的的负面影响。
一、图像的平移
在平移之前,需要构造一个平移矩阵,并将其传给仿射函数cv2.warpAffine()
import cv2 import numpy as np img = cv2.imread('dog.jpg') # 构造平移矩阵H H = np.float32([[1,0,50],[0,1,25]]) rows, cols = img.shape[:2] print(img.shape) print(rows,cols) res = cv2.warpAffine(img,H,(cols,rows)) cv2.imshow('origin_img',img) cv2.imshow('new_img',res) cv2.waitKey(0) cv2.destroyAllWindows()
二、图像的放大和缩小
图像的放大和缩小有一个专门的函数,cv2.resize(),需要设置缩放的比例,一种办法是设置缩放因子,另一种办法是直接设置图像的大小,在缩放以后,图像必然会发生变化,涉及图像的插值问题。
缩放有几种不同的插值(interpolation)方法,在缩小时推荐使用cv2.INTER_AREA,扩大时推荐使用cv2.INTER_CUBIC和cv2.INTER_LINEAR。
import cv2 import numpy as np img = cv2.imread('dog.jpg') # 一是通过设置图像缩放比例,即缩放因子 res1 = cv2.resize(img,None,fx=2,fy=2,interpolation=cv2.INTER_LINEAR) height,width = img.shape[:2] # 而是直接设置图像的大小 res2 = cv2.resize(img,(int(0.8*width),int(0.8*height)),interpolation=cv2.INTER_AREA) cv2.imshow('origin',img) cv2.imshow('res1',res1) cv2.imshow('res2',res2) cv2.waitKey(0) cv2.destroyAllWindows()
三、图像的旋转
对于图像的旋转,需要构造旋转矩阵,一般图像的旋转矩阵是在原点处进行的:
OpenCV采用了另一种方式:
cv2.getRotationMarix2D( )函数需要三个参数:旋转中心、旋转角度、旋转后图像的缩放比例:
import cv2 import numpy as np img = cv2.imread('dog.jpg') rows, cols = img.shape[:2] # 第一个参数是旋转中心,第二个参数是旋转角度,第三个参数是缩放比例 M1 = cv2.getRotationMatrix2D((cols/2, rows/2), 45, 0.5) M2 = cv2.getRotationMatrix2D((cols/2, rows/2), 45, 2) M3 = cv2.getRotationMatrix2D((cols/2, rows/2), 45, 1) res1 = cv2.warpAffine(img, M1, (cols, rows)) res2 = cv2.warpAffine(img, M2, (cols, rows)) res3 = cv2.warpAffine(img, M3, (cols, rows)) cv2.imshow('res1', res1) cv2.imshow('res2', res2) cv2.imshow('res3', res3) cv2.waitKey(0) cv2.destroyAllWindows()
四、图像的仿射
仿射变换是指在向量空间中进行一次线性变换(乘以一个矩阵)并加上一个平移,变换为另一个向量空间的过程。
仿射变化也是需要一个M矩阵就可以,但是由于仿射变换比较复杂,很难找到这个矩阵,opencv提供了根据变换前后三个点的对应关系来自动求解M, 这个函数是cv2.getAffineTransoform(pts1, pts2)事实上,仿射变换代表的是两幅图之间的关系,我们通常使用2x3矩阵来表示仿射变换如下:
import cv2 import numpy as np img = cv2.imread('dog.jpg') rows, cols = img.shape[:2] pts1 = np.float32([[50, 50], [200, 50], [50, 200]]) pts2 = np.float32([[10, 100], [200, 50], [100, 250]]) # 构造矩阵 M = cv2.getAffineTransform(pts1, pts2) res = cv2.warpAffine(img, M, (cols, rows)) cv2.imshow('origin', img) cv2.imshow('res', res) cv2.waitKey(0) cv2.destroyAllWindows()
五、图像的透射
仿射变换(affinetransform)与透视变换(prespectivetransform)在图像还原、图像局部变化处理方面有重要意义。
import cv2 import numpy as np
img = cv2.imread('dog.jpg') rows, cols = img.shape[:2] pts1 = np.float32([[56, 65], [238, 52], [28, 237], [239, 240]]) pts2 = np.float32([[0, 0], [200, 0], [0, 200], [200, 200]]) M = cv2.getPerspectiveTransform(pts1, pts2) res = cv2.warpPerspective(img, M, (cols, rows)) cv2.imshow('yuantu', img) cv2.imshow('res', res) cv2.waitKey(0) cv2.destroyAllWindows()