opencv图像的几何变换

1.扩展缩放  cv2.resize()

只是改变图像的尺寸大小,cv2.resize()可以实现这个功能。在缩放时推荐cv2.INTER_AREA,在拓展时推荐cv2.INTER_CUBIC(慢)和cv2.INTER_LINEAR。默认情况下所有改变图像尺寸大小的操作使用的是插值法都是cv2.INTER_LINEAR。

import cv2

img = cv2.imread('shanghai.jpg')

#下面的None本应该是输出图像的尺寸,但是因为后面我们设置了缩放因子,所以,这里为None

res = cv2.resize(img,None,fx=2,fy=2,interpolation=cv2.INTER_CUBIC)

#or  这里直接设置输出图像的尺寸,所以不用设置缩放因子

height , width =img.shape[:2]

res = cv2.resize(img,(2*width,2*height),interpolation=cv2.INTER_CUBIC)

    while(1):

    cv2.imshow('res',res)

    cv2.imshow('img',img)

    if cv2.waitKey(1)&0xFF == 27:

        break

cv2.destroyAllWindows()


2.平移  cv2.warpAffine()

如果想要沿(x,y)方向移动,移动的距离为(tx,ty)可以以下面方式构建移动矩阵。

opencv图像的几何变换_第1张图片

可以使用Numpy数组构建矩阵,数据类型是np.float32,然后传给函数cv2.warpAffine().

以下的例子,像素被移动了(100,50)

img = cv2.imread('color2_small.jpg',0)

rows,cols = img.shape

M = np.float32([[1,0,100],[0,1,50]])

dst = cv2.warpAffine(img,M,(cols,rows))

titles = ['original image','dst']

images = [img,dst]for i in range(2):

    plt.subplot(2,1,i+1),plt.imshow(images[i],'gray')

    plt.title(titles[i]) plt.xticks([]),plt.yticks([])

plt.show()


opencv图像的几何变换_第2张图片

PS:函数cv2.warpAffine() 的第三个参数的是输出图像的大小,它的格式应该是图像的(宽,高)。应该记住的是图像的宽对应的是列数,高对应的是行数。

3.旋转 cv2.getRotationMatrix2D()

对一个图像旋转角度θ,需要使用下面的旋转矩阵。

但OpenCVC允许在任意地方进行旋转,所以矩阵应该为

opencv图像的几何变换_第3张图片

其中α = scale · cos θ

为构建旋转矩阵,OpenCV提供了一个函数cv2.getRotationMatrix2D。

例:旋转45度

 #这里的第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子 #可以通过设置旋转中心,缩放因子以及窗口大小来防止旋转后超出边界的问题。

M = cv2.getRotationMatrix2D((cols/2,rows/2),45,1)

dst = cv2.warpAffine(img,M,(cols,rows))


opencv图像的几何变换_第4张图片

4.仿射变换  cv2.getAffineTransForm()

在仿射变换中,原图中所有平行线在结果图像中同样平行。为创建这个矩阵,需要从原图像中找到三个点以及他们在输出图像中的位置,然后cv2.getAffineTransForm()会创建一个2X3的矩阵。最后这个矩阵会被传给函数cv2.warpAffine()

img = cv2.imread('color2_small.jpg')

rows,cols,ch = 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,(cols,rows))

plt.subplot(121),plt.imshow(img),plt.title('Input')

plt.subplot(122),plt.imshow(dst),plt.title('Output')

plt.show()

opencv图像的几何变换_第5张图片

5.透视变换  cv2.warpPerspective()

对于视角变换,我们需要一个3x3变换矩阵。在变换前后直线还是直线。需要在原图上找到4个点,以及他们在输出图上对应的位置,这四个点中任意三个都不能共线,可以有函数cv2.getPerspectiveTransform()构建,然后这个矩阵传给函数cv2.warpPerspective()

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,(300,300))


opencv图像的几何变换_第6张图片

PS:cv2.warpaffine和cv2.warpervience,您可以使用它们进行各种转换。cv2.warpaffine采用2×3变换矩阵,而cv2.warppervieve采用3×3变换矩阵作为输入

你可能感兴趣的:(opencv图像的几何变换)