图像的几何变换

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)
相关推荐
Godspeed Zhao20 小时前
自动驾驶中的传感器技术24.3——Camera(18)
人工智能·机器学习·自动驾驶
顾北1221 小时前
MCP协议实战|Spring AI + 高德地图工具集成教程
人工智能
wfeqhfxz258878221 小时前
毒蝇伞品种识别与分类_Centernet模型优化实战
人工智能·分类·数据挖掘
中杯可乐多加冰1 天前
RAG 深度实践系列(七):从“能用”到“好用”——RAG 系统优化与效果评估
人工智能·大模型·llm·大语言模型·rag·检索增强生成
珠海西格电力科技1 天前
微电网系统架构设计:并网/孤岛双模式运行与控制策略
网络·人工智能·物联网·系统架构·云计算·智慧城市
FreeBuf_1 天前
AI扩大攻击面,大国博弈引发安全新挑战
人工智能·安全·chatgpt
weisian1511 天前
进阶篇-8-数学篇-7--特征值与特征向量:AI特征提取的核心逻辑
人工智能·pca·特征值·特征向量·降维
Java程序员 拥抱ai1 天前
撰写「从0到1构建下一代游戏AI客服」系列技术博客的初衷
人工智能
186******205311 天前
AI重构项目开发全流程:效率革命与实践指南
人工智能·重构
森之鸟1 天前
多智能体系统开发入门:用鸿蒙实现设备间的AI协同决策
人工智能·harmonyos·m