用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视觉网奇16 分钟前
公式动画软件学习笔记
人工智能·公式绘图
天天代码码天天19 分钟前
C# OnnxRuntime 部署 DDColor
人工智能·ddcolor
惠惠软件20 分钟前
豆包 AI 学习投喂与排名优化指南
人工智能·学习·语音识别
数据中心的那点事儿21 分钟前
从设计到运营全链破局 恒华智算专场解锁产业升级密码
大数据·人工智能
FluxMelodySun25 分钟前
机器学习(三十三) 概率图模型与隐马尔可夫模型
人工智能·机器学习
深兰科技30 分钟前
深兰科技与淡水河谷合作推进:矿区示范加速落地
java·人工智能·python·c#·scala·symfony·深兰科技
V搜xhliang024634 分钟前
OpenClaw、AI大模型赋能数据分析与学术科研 学习
人工智能·深度学习·学习·机器学习·数据挖掘·数据分析
PHOSKEY36 分钟前
3D工业相机对焊后缺陷全检——机械手焊接系统质量控制的最后关口
人工智能
Aaron158837 分钟前
8通道测向系统演示科研套件
人工智能·算法·fpga开发·硬件工程·信息与通信·信号处理·基带工程
每天进步一点点️41 分钟前
AI芯片制造的“择优录用”:解读 APU Cluster4 的 Harvesting 机制
人工智能·soc片上系统·半导体芯片