【计算机视觉(6)】

基于Python的OpenCV基础入门——图像的几何变换(2)

仿射变换

仿射变换是一种仅在二维平面中发生的几何变形,通俗的理解原来的直线变换之后还是直线,平行线变换之后还是平行线。OpenCV关于仿射变换提供了warpAffine方法,可以实现图像的平移、旋转、倾斜等。
image = cv2.warpAffine(src, M, dsize, flags,borderMode, borderValue)
参数:
src:原始图像。
M:一个2行3列的矩阵,根据此矩阵的值变换原图中的像素位置,决定做哪种变换。
dsize:输出图像的尺寸大小。
flags:可选参数,插值方式,建议使用默认值。
borderMode:可选参数,边界类型,建议使用默认值。
borderValue:可选参数,边界值,默认为0,建议使用默认值。

在实际的应用中最常使用的是图像的旋转,OpenCV提供了getRotationMatrix2D方法自动计算旋转图像的M矩阵。
M = cv2.getRotationMatrix2D(center, angle,scale)
参数:
center:旋转的中心点坐标 (x, y)。
angle:旋转的角度(不是弧度)。正数表示逆时针旋转,负数表示顺时针旋转。
scale:缩放比例,浮点类型。如果取值1,表示图像保持原来的比例。

透视变换

图像透视变换的本质是将图像投影到一个新的视平面,从不同的角度观察物体,会看到不同的变形画面。
dst = cv2.warpPerspective(src, M, dsize, flags,borderMode, borderValue)
参数:
src:原始图像。
M:一个3行3列的矩阵,根据此矩阵的值变换原图中的像素位置。
dsize:输出图像的尺寸大小 (rows,cols)。
flags:可选参数,插值方式,建议使用默认值。
borderMode:可选参数,边界类型,建议使用默认值。
borderValue:可选参数,边界值,默认为0,建议使用默认值。

在warpPerspective方法中的参数也有一个M矩阵,这个矩阵通过getPerspectiveTransform方法计算得到。
M = cv2.getPerspectiveTransform(pos1, pos2)
参数:
Pos1和pos2:原图4个点坐标和透视后的四个点的坐标,例如:[[0, 0], [1, 0], [0, 1],[1, 1]]。

仿射变化和透视变换的代码实现:

import cv2                       
import matplotlib.pyplot as plt 
image = cv2.imread("img/cat.jpg") 
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image_shape = image.shape # 获取图像的垂直尺寸、水平尺寸、通道数(image.shape[0],image.shape[1],image.shape[2])  
M1 = cv2.getRotationMatrix2D((image_shape[0] / 2, image_shape[1] / 2), 45, 1) # 求出绕图像中心逆时针旋转45度的旋转矩阵  
image_clockwise = cv2.warpAffine(image, M1, (image_shape[0], image_shape[1])) # 图像旋转  
M2 = cv2.getRotationMatrix2D((image_shape[0] / 2, image_shape[1] / 2), -45, 1) # 求出绕图像中心顺时针旋转45度的旋转矩阵  
image_anticlockwise = cv2.warpAffine(image, M2, (image_shape[0], image_shape[1])) # 图像旋转  
image_list = [image, image_clockwise, image_anticlockwise] 
titles = ["Original", "anticlockwise", "clockwise"]  
for i in range(3):  
    plt.subplot(1, 3, i + 1), plt.imshow(image_list[i], 'gray')  
    plt.xticks([]), plt.yticks([]) 
plt.show() 

代码实现效果图:
在这里插入图片描述

import cv2                       
import matplotlib.pyplot as plt 
import numpy as np  
image = cv2.imread("img/cat.jpg") 
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image_shape = image.shape # 获取图像的垂直尺寸、水平尺寸、通道数(image.shape[0],image.shape[1],image.shape[2])  
h, w = image_shape[:2] # 获取高和宽  
pts1 = np.float32([[0, 0], [0, h - 1], [w - 1, h - 1], [w - 1, 0]]) # 获取原图的四个角点  
pts2 = np.float32([[0, 0], [200, h - 36], [w - 36, h - 36], [w - 1, 0]]) # 变换后的四个顶点坐标  
M = cv2.getPerspectiveTransform(pts1, pts2) # 先得确定透视变换的系数  
dst = cv2.warpPerspective(image, M, (500, 526)) # 对原图进行仿射变换  
image_list = [image, dst] 
titles = ["Original", " perspective"] 
for i in range(2):  
    plt.subplot(1, 2, i + 1), plt.imshow(image_list[i], 'gray')  
    plt.title(titles[i])  
    plt.xticks([]), plt.yticks([]) 
plt.show()  

代码实现效果图:
在这里插入图片描述

相关推荐

  1. 计算机视觉

    2024-06-07 09:54:03       21 阅读
  2. 计算机视觉

    2024-06-07 09:54:03       17 阅读
  3. 计算机视觉

    2024-06-07 09:54:03       14 阅读
  4. 计算机视觉

    2024-06-07 09:54:03       8 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-07 09:54:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-07 09:54:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-07 09:54:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-07 09:54:03       18 阅读

热门阅读

  1. Docker

    Docker

    2024-06-07 09:54:03      6 阅读
  2. ubuntu22.04防火墙策略

    2024-06-07 09:54:03       6 阅读
  3. Linux-用户管理与软件管理

    2024-06-07 09:54:03       9 阅读
  4. Python3 推导式

    2024-06-07 09:54:03       7 阅读
  5. C++ STL std::vector的实现机制【面试】

    2024-06-07 09:54:03       7 阅读
  6. python使用appium截图手机屏幕图片

    2024-06-07 09:54:03       6 阅读
  7. 【CentOS】手动编译安装make、cmake、gcc、git

    2024-06-07 09:54:03       7 阅读
  8. centos如何压缩zip

    2024-06-07 09:54:03       8 阅读
  9. 【设计模式】责任链模式(行为型)⭐⭐

    2024-06-07 09:54:03       8 阅读
  10. 腾讯云的身份证核验,找不到这个类

    2024-06-07 09:54:03       8 阅读
  11. 适用于STM32的U8G2回调函数例程

    2024-06-07 09:54:03       8 阅读