几何变换的几个操作其实就是缩放,移动,旋转,放射变换。
先看缩放,主要函数是resize,形式为resize(img,(x,y),interpolation=)。img是原图像;第二个参数是缩放的规模,可以自定义;interpolation是变换方法,默认的是interpolation=CV2.INTER_LINEAR,此外还有CV2.INTER_NN,CV2.INTER_AREA像素关系重采样;还有CV2.INTER_CUBIC立方插值(速度最慢)。一般选择默认就好,具体的要求还是使用具体的参数。案例如下:
import cv2 import numpy as np import matplotlib.pyplot as plt img=cv2.imread('C:/Users/dell/Desktop/cos.jpg') res=cv2.resize(img,(100,100)) while(1): cv2.imshow('res',res) cv2.imshow('img',img) if cv2.waitKey(1)&0xFF==27: break cv2.destroyAllWindows()这里是把图像缩放成100X100的规模,那时图像也已经不成样子了。
图像平移的函数是cv2.warpAffine,主要的参数有cv2.warpAffine(img,M,(rows,cols))第一个参数是原图像,M是位移矩阵,第三个参数是输出图像的规模。解释一下M矩阵
tx是行的位移,ty是列的位移。还是走一波代码。
import cv2 import numpy as np import matplotlib.pyplot as plt img=cv2.imread('C:/Users/dell/Desktop/cos.jpg') rows,cols,channel=img.shape M=np.float32([[1,0,100],[0,1,50]]) dst=cv2.warpAffine(img,M,(rows,cols)) cv2.imshow('image',dst) cv2.waitKey(0) cv2.destroyAllWindows()
下一个是旋转了,主要的函数是cv2.getRotionMatrix2D,主要形式为cv2.getRotionMatrix2D(center,angle,scale),第一个参数是旋转因子,最后一个参数是放缩的规模。最后在结合平移函数实现。
import cv2 import numpy as np import matplotlib.pyplot as plt img=cv2.imread('C:/Users/dell/Desktop/cos.jpg') rows,cols,channel=img.shape M=cv2.getRotationMatrix2D((rows/2,cols/2),45,0.4) dst=cv2.warpAffine(img,M,(rows,cols)) cv2.imshow('image',dst) cv2.waitKey(0) cv2.destroyAllWindows()
仿射变换要求原图的平行线在输出图像中同样平行,这样至少需要原图和输出图像的三个来创建旋转矩阵,这种操作是比较精细化的。关键的函数是getAffineMatrix,她可以根据那六个点创建一个旋转矩阵。
import cv2 import numpy as np import matplotlib.pyplot as plt img=cv2.imread('C:/Users/dell/Desktop/cos.jpg') rows,cols,channel=img.shape #原图的三个点 pts1=np.float32([[50,50],[200,50],[50,200]]) #输出图象的三个点 pts2=np.float32([[10,100],[200,50],[100,250]]) M=cv2.getAffineTransform(pts1,pts2) dst=cv2.warpAffine(img,M,(rows,cols)) plt.subplot(1,2,1) plt.imshow(img) plt.title('input') plt.subplot(1,2,2) plt.imshow(dst) plt.title('output') plt.show()
颜色是信道问题一起的不必太在意。
最后一个是投影变换,和仿射变换的形式差不多,不过投影变幻是主要四个点(任意三个点不能是一条直线),我记得某手机的拍照功能有把你拍的PPT完全去掉边边角角,想来原理差不多是类似的,只不过这里咱们要自己找坐标。
import cv2 import numpy as np import matplotlib.pyplot as plt img=cv2.imread('C:/Users/dell/Desktop/cos.jpg') rows,cols,channel=img.shape #原图的四个点 pts1=np.float32([[56,65],[368,52],[28,387],[389,390]]) #输出图象的四个点 pts2=np.float32([[0,0],[300,0],[0,300],[300,300]]) M=cv2.getPerspectiveTransform(pts1,pts2) dst=cv2.warpPerspective(img,M,(rows,cols)) plt.subplot(1,2,1) plt.imshow(img) plt.title('input') plt.subplot(1,2,2) plt.imshow(dst) plt.title('output') plt.show()好了,今天就到这里了,明天开始的是图象阈值。