OpenCV-Python-(2)-几何变换

图像变换:

  • cv2.flip()    # 图像翻转
  • cv2.resize()   #图像尺寸变换
  • cv2.warpAffine() #图像仿射
  • cv2.getRotationMatrix2D() #取得旋转角度的Matrix
  • cv2.GetAffineTransform(src, dst, mapMatrix)    #取得图像仿射的matrix
  • cv2.getPerspectiveTransform(src, dst)    #取得投影变换矩阵的4个点起止值
  • cv2.warpPerspective() #图像投影变换

1.图像翻转cv2.flip()

cv2.flip(src, flipCode[, dst]) → dst

flipMode: 翻转模式。有三种模式:0 --- 垂直方向翻转; 1----- 水平方向翻转; -1:水平、垂直方向同时翻转

import cv2

img = cv2.imread(r'C:\Users\x\Desktop\11.jpg', cv2.IMREAD_ANYCOLOR)

#水平翻转
h_flip = cv2.flip(img, 1)
#垂直翻转
v_flip = cv2.flip(img, 0)
#水平垂直翻转
hv_flip = cv2.flip(img, -1)

cv2.imshow("img", img)
cv2.imshow("h_flip", h_flip)
cv2.imshow("v_flip", v_flip)
cv2.imshow("hv_flip", hv_flip)
cv2.waitKey(0)
cv2.destroyAllWindows()


2.图像尺寸变cv2.resize()

cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) -> dst 

dsize - 目标图像大小。

interpolation - 插值方法:

1)INTER_NEAREST - 最近邻插值法

2)INTER_LINEAR - 双线性插值法(默认)

3)INTER_AREA - 基于局部像素的重采样(resampling using pixel area relation)。对于图像抽取(image decimation)来说,这可能是一个更好的方法。但如果是放大图像时,它和最近邻法的效果类似。

4)INTER_CUBIC - 基于4x4像素邻域的3次插值法

5)INTER_LANCZOS4 - 基于8x8像素邻域的Lanczos插值

import cv2


img = cv2.imread(r'C:\Users\x\Desktop\79.jpg', cv2.IMREAD_ANYCOLOR)

h, w = img.shape[:2]
h_new, w_new = h*0.25, w*0.25
h_new = int(round(h_new))
w_new = int(round(w_new))

new_img = cv2.resize(img, (h_new, w_new), interpolation=cv2.INTER_CUBIC)

cv2.imshow('img',img)
cv2.imshow('resize', new_img)
cv2.imwrite(r'C:\Users\x\Desktop\11.jpg', new_img)
cv2.waitKey(0)
cv2.destroyAllWindows()


3.图像仿射变换

cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])

仿射变换函数:warpAffine(src, (2行3列的仿射变换矩阵A), (w, h)(输出图像大小宽、高),  填充模式)

cv2.getRotationMatrix2D(center, angle, scale)

旋转函数:getRotationMatrix2D(center(图片的旋转中心), angle(旋转角度), scale(等比例缩放系数))

import cv2
import numpy as np

if __name__ == "__main__":
    
    image = cv2.imread(r'C:\Users\x\Desktop\11.jpg', cv2.IMREAD_ANYCOLOR)
    
    #原图的高、宽
    h, w = image.shape[:2]
    
    #仿射变换矩阵,缩小两倍,不进行平移
    A1 = np.array([[0.5, 0, 0], [0, 0.5, 0]], np.float32)
    d1 = cv2.warpAffine(image, A1, (w,h), borderValue=125)
    
    #先缩小两倍再平移w/4和h/4个距离
    A2 = np.array([[0.5, 0, w/4], [0, 0.5, h/4]], np.float32)
    d2 = cv2.warpAffine(image, A2, (w,h), borderValue=125)
    
    #在d2的基础上,绕图像中心点旋转30°,缩放0.5倍
    A3 = cv2.getRotationMatrix2D((w/2.0, h/2.0), 30, 1) #getRotationMatrix2D(center, angle, scale(等比例缩放系数))
    d3 = cv2.warpAffine(d2, A3, (w,h), borderValue=125)
    
    cv2.imshow("image", image)
    cv2.imshow("d1", d1)
    cv2.imshow("d2", d2)
    cv2.imshow("d3", d3)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


4.图像投影变换

cv2.getPerspectiveTransform(src, dst) → retval

cv2.warpPerspective(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) → dst

视角变换,需要一个3*3变换矩阵。在变换前后要保证直线还是直线。
构建此矩阵需要在输入图像中找寻 4个点,以及在输出图像中对应的位置。这四个点中的任意三个点不能共线。

#投影变换
import cv2
import numpy as np

#灰度图像转化为ndarray类型
if __name__ == "__main__":

    img = cv2.imread(r'C:\Users\x\Desktop\11.jpg', cv2.IMREAD_ANYCOLOR)

    h, w = img.shape[:2]
    #原图的四个点与投影变换对应的点
    src = np.array([[0,0], [w-1,0], [0,h-1], [w-1,h-1]], np.float32)
    dst = np.array([[50,50], [w/3.0,50], [50,h-1], [w-1,h-1]], np.float32)
    #计算投影变换矩阵
    p = cv2.getPerspectiveTransform(src, dst)
    #计算投影变换
    r = cv2.warpPerspective(img, p, (h,w), borderValue=125)
    cv2.imshow("img", img)
    cv2.imshow("r", r)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

猜你喜欢

转载自blog.csdn.net/qq_40755643/article/details/83999716