图像的几何变换

1.图像的缩放

python 复制代码
import cv2

# 读取图像
image = cv2.imread('D:\\photo\\lena.tif')

# 方法一:直接指定目标尺寸
resized_direct = cv2.resize(image, (800, 600))
cv2.imwrite('resized_opencv.jpg', resized_direct)

# 方法二:按比例缩放
# cv2.INTER_LINEAR(双线性插值):默认选项,速度和质量的良好平衡,适用于大多数放大场景
# cv2.INTER_CUBIC(双三次插值):比双线性插值计算量更大,结果更平滑,适用于大幅放大
# cv2.INTER_AREA:缩小图像时的推荐选项。它通过像素区域关系重采样,能在缩小图像时避免出现波纹(摩尔纹),更好地保留细节
# cv2.INTER_NEAREST(最近邻插值):速度最快,但效果粗糙,可能导致锯齿状边缘,通常只在需要保持像素完美对应关系(如像素艺术游戏)时使用
scale_percent = 50  # 缩小为原图的50%
width = int(image.shape[1] * scale_percent / 100)
height = int(image.shape[0] * scale_percent / 100)
dim = (width, height)
resized_by_percent = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
cv2.imwrite('D:\\photo\\resized_percent.jpg', resized_by_percent)

2.图像的旋转

旋转属于等距变换,变换后图像的长度和面积保持不变。既可以用来自动校正倾斜的文档,也能为数据增强创造更多训练样本。

python 复制代码
import cv2
import numpy as np

def rotate_image(image, angle):
    (h, w) = image.shape[:2]
    center = (w // 2, h // 2)

    # 获取旋转矩阵
    M = cv2.getRotationMatrix2D(center, angle, 1.0)

    # 计算旋转后图像的边界,避免内容被裁剪
    cos = np.abs(M[0, 0])
    sin = np.abs(M[0, 1])
    new_w = int((h * sin) + (w * cos))
    new_h = int((h * cos) + (w * sin))

    # 调整旋转矩阵的中心点
    M[0, 2] += (new_w / 2) - center[0]
    M[1, 2] += (new_h / 2) - center[1]

    # 执行旋转,并指定新图像的尺寸
    rotated = cv2.warpAffine(image, M, (new_w, new_h))
    return rotated

# 读取图像
img = cv2.imread('your_image.jpg')
# 逆时针旋转45度
rotated_img = rotate_image(img, 45)

# 显示结果
cv2.imshow('Rotated Image', rotated_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.图像的翻转

python 复制代码
import cv2

# 读取图像
img = cv2.imread('your_image.jpg')

# 水平翻转
flip_horizontal = cv2.flip(img, 1)
# 垂直翻转
flip_vertical = cv2.flip(img, 0)
# 水平垂直同时翻转
flip_both = cv2.flip(img, -1)

# 显示结果(示例)
cv2.imshow('Original', img)
cv2.imshow('Horizontal Flip', flip_horizontal)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.图像的斜切变换

图像的斜切变换(Shear Transformation)是一种让图像在水平或垂直方向上发生倾斜的几何变换,会产生类似"推斜"的效果。图像在水平或垂直方向上发生倾斜,形状发生改变,但原本平行的边在变换后依然保持平行。水平斜切(图像沿水平方向倾斜)、垂直斜切(图像沿垂直方向倾斜)。其数学基础是通过变换矩阵实现像素坐标的重新计算。

python 复制代码
import cv2
import numpy as np

# 读取图像
img = cv2.imread("D:\\photo\\lena.tif")
height, width = img.shape[:2]

# 设置水平斜切系数,例如0.2(正值向右斜,负值向左斜)
shear_factor = 0.2
M = np.float32([[1, shear_factor, 0],
                [0, 1, 0]])

# 应用变换,并考虑斜切后图像会变宽,需要调整输出画布大小
new_width = width + int(height * abs(shear_factor))
sheared_img = cv2.warpAffine(img, M, (new_width, height))

cv2.imshow("Sheared Image", sheared_img)
cv2.waitKey(0)

如下图所示:

5.图像的投影变换

图像的投影变换是计算机视觉中一项强大的几何变换技术,它允许你从不同的视角来"观察"图像,常用于校正透视失真或创造透视效果。简单来说,投影变换(也叫透视变换)是将图像从一个视角投影到一个新的虚拟平面上的过程。它使用一个3x3的变换矩阵(单应性矩阵,Homography Matrix)来实现这种映射。日常生活中有很多应用:文档/车牌校正 :将从倾斜角度拍摄的文档或车牌图像,通过投影变换校正为规整的正方形或矩形视图,便于后续的OCR(光学字符识别)或分析。鸟瞰图生成 :在自动驾驶和机器人领域,将车载摄像头拍摄的前方道路图像转换为鸟瞰视角,可以极大方便路径规划和障碍物检测。这个过程也称为逆透视映射(IPM)。图像拼接:在创建全景图时,需要将不同视角拍摄的图像进行对齐。投影变换可以校正这些图像之间的透视差异,使它们能够无缝融合。

python 复制代码
import cv2
import numpy as np

# 1. 读取图像
img = cv2.imread('skewed_document.jpg')
height, width = img.shape[:2]

# 2. 定义4组对应点 (源点src 和 目标点dst)
# 源点 (src): 在倾斜图像上选取文档的四个角点,顺序为 [左上, 右上, 右下, 左下]
src_points = np.float32([[100, 50], [600, 50], [600, 390], [100, 390]])

# 目标点 (dst): 我们希望文档最终呈现的位置和大小,顺序必须与源点一致
# 这里我们定义一个新的矩形
dst_points = np.float32([[0, 0], [500, 0], [500, 400], [0, 400]])

# 3. 计算投影变换矩阵
M = cv2.getPerspectiveTransform(src_points, dst_points)

# 4. 应用变换
warped_img = cv2.warpPerspective(img, M, (500, 400)) # 输出图像尺寸为 (500, 400)

# 5. 显示结果
cv2.imshow('Original Image', img)
cv2.imshow('Warped Image', warped_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 可选:保存结果图像
# cv2.imwrite('corrected_document.jpg', warped_img)
相关推荐
NAGNIP9 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab10 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab10 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP14 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年14 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼14 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS15 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区16 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈16 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang16 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx