用opencv校正图片的方向

校正的过程可以分为以下几步:

1、转灰度图。

2、降噪。

3、Canny边缘检测。

4、膨胀。

5、轮廓检索。

6、从各个轮廓中选取合适的旋转角度并校正图像。

python 复制代码
import cv2
import numpy as np


def resize_image(image, scale_factor):
    """调整图像大小"""
    return cv2.resize(
        image, None, fx=scale_factor, fy=scale_factor, interpolation=cv2.INTER_AREA
    )


def main():
    # 读取图像
    src = cv2.imread("images/c3.jpg")
    if src is None:
        print("无法读取图像,请检查路径是否正确!")
        return

    # 调整图像大小以便展示
    scale_factor = 0.5  # 缩放比例
    src_resized = resize_image(src, scale_factor)
    cv2.imshow("src", src_resized)

    # 转灰度图
    gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
    gray_resized = resize_image(gray, scale_factor)
    cv2.imshow("gray", gray_resized)

    # 高斯模糊降噪
    blur = cv2.GaussianBlur(gray, (5, 5), 1.0)
    blur_resized = resize_image(blur, scale_factor)
    cv2.imshow("gaussianBlur", blur_resized)

    # Canny边缘检测
    canny = cv2.Canny(blur, 20, 100)
    canny_resized = resize_image(canny, scale_factor)
    cv2.imshow("canny", canny_resized)

    # 膨胀两次,让文字连到一块
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (4, 2))
    expand = cv2.dilate(canny, kernel, iterations=2)
    expand_resized = resize_image(expand, scale_factor)
    cv2.imshow("dialate", expand_resized)

    # 检索轮廓
    contours, _ = cv2.findContours(expand, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

    # 对各个轮廓的旋转角度进行排序
    vecAngles = []
    for contour in contours:
        rr = cv2.minAreaRect(contour)
        vecAngles.append(rr[2])  # RotatedRect.angle

    vecAngles.sort()

    # 以中间值为基准,取相差20%以内的角度的平均值作为结果
    midIndex = int(len(vecAngles) / 2) - 1
    midAngle = vecAngles[midIndex]
    maxAngleThreshold = midAngle + 15 if midAngle > 0 else midAngle - 15
    minAngleThreshold = midAngle - 15 if midAngle > 0 else midAngle + 15

    print("maxAngleThreshold:", maxAngleThreshold)
    print("minAngleThreshold:", minAngleThreshold)

    angleSum = 0
    angleCounter = 0
    for angle in vecAngles:
        print(angle)
        if minAngleThreshold < angle < maxAngleThreshold:
            angleSum += angle
            angleCounter += 1

    averageAngle = angleSum / angleCounter if angleCounter > 0 else 0
    print("averageAngle:", averageAngle)
    print("midAngle:", midAngle)

    # 旋转图像
    (h, w) = src.shape[:2]
    center = (w // 2, h // 2)
    rotateM = cv2.getRotationMatrix2D(center, averageAngle, 1.0)
    result = cv2.warpAffine(
        src,
        rotateM,
        (w, h),
        flags=cv2.INTER_LINEAR,
        borderMode=cv2.BORDER_CONSTANT,
        borderValue=(255, 255, 255),
    )
    result_resized = resize_image(result, scale_factor)
    cv2.imshow("result", result_resized)

    # 保存最终结果
    output_path = "result.jpg"
    cv2.imwrite(output_path, result)
    print(f"最终结果已保存到:{output_path}")

    cv2.waitKey(0)
    cv2.destroyAllWindows()


if __name__ == "__main__":
    main()
相关推荐
大千AI助手7 分钟前
DTW模版匹配:弹性对齐的时间序列相似度度量算法
人工智能·算法·机器学习·数据挖掘·模版匹配·dtw模版匹配
AI生存日记20 分钟前
百度文心大模型 4.5 系列全面开源 英特尔同步支持端侧部署
人工智能·百度·开源·open ai大模型
LCG元43 分钟前
自动驾驶感知模块的多模态数据融合:时序同步与空间对齐的框架解析
人工智能·机器学习·自动驾驶
why技术1 小时前
Stack Overflow,轰然倒下!
前端·人工智能·后端
彭祥.1 小时前
Jetson边缘计算主板:Ubuntu 环境配置 CUDA 与 cudNN 推理环境 + OpenCV 与 C++ 进行目标分类
c++·opencv·分类
超龄超能程序猿2 小时前
(三)PS识别:基于噪声分析PS识别的技术实现
图像处理·人工智能·计算机视觉
要努力啊啊啊2 小时前
YOLOv3-SPP Auto-Anchor 聚类调试指南!
人工智能·深度学习·yolo·目标检测·目标跟踪·数据挖掘
好开心啊没烦恼2 小时前
Python 数据分析:numpy,说人话,说说数组维度。听故事学知识点怎么这么容易?
开发语言·人工智能·python·数据挖掘·数据分析·numpy
生态遥感监测笔记2 小时前
GEE利用已有土地利用数据选取样本点并进行分类
人工智能·算法·机器学习·分类·数据挖掘