首页 > 其他分享 >OpenCV | 基于最细长轮廓自动校正旋转图片

OpenCV | 基于最细长轮廓自动校正旋转图片

时间:2024-10-30 22:30:52浏览次数:4  
标签:校正 angle width slimmest image cv2 height OpenCV 轮廓

点击查看代码
import cv2
import numpy as np


def preprocess_image(image):
    # 转换为灰度图像
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    # 高斯模糊去噪
    blurred = cv2.GaussianBlur(gray, (33, 33), 0)

    # 自适应阈值二值化
    binary = cv2.adaptiveThreshold(blurred, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                                   cv2.THRESH_BINARY_INV, 31, 2)

    # 如果黑色像素多于白色像素,反相图像
    black_pixels = np.sum(binary == 255)
    white_pixels = np.sum(binary == 0)
    if white_pixels < black_pixels:
        binary = cv2.bitwise_not(binary)

    return binary


def rotate_image(image_path, angle):
    image = cv2.imread(image_path)
    height, width = image.shape[:2]

    # 旋转后的尺寸
    rad_angle = np.deg2rad(angle)
    new_width = int(abs(width * np.cos(rad_angle)) + abs(height * np.sin(rad_angle)))
    new_height = int(abs(width * np.sin(rad_angle)) + abs(height * np.cos(rad_angle)))

    # 旋转矩阵
    rotation_matrix = cv2.getRotationMatrix2D((width // 2, height // 2), angle, 1)

    # 调整旋转矩阵,将图像放到中心
    rotation_matrix[0, 2] += (new_width - width) / 2
    rotation_matrix[1, 2] += (new_height - height) / 2

    rotated_image = cv2.warpAffine(image, rotation_matrix, (new_width, new_height))

    return rotated_image


def correct_image_skew(image_path):
    image = cv2.imread(image_path)
    processed_image = preprocess_image(image)
    cv2.imshow('processed_image', processed_image)

    # 找到所有的轮廓
    contours, _ = cv2.findContours(processed_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    slimmest_ratio = 0
    slimmest_rect = None
    slimmest_angle = 0
    i = 0

    for contour in contours:
        if len(contour) < 5:
            continue
        else:
            # 计算最小外接矩形
            rect = cv2.minAreaRect(contour)
            box = cv2.boxPoints(rect)
            box = np.int32(box)

            # 计算矩形的宽和高
            width = rect[1][0]
            height = rect[1][1]

            # 计算长宽比
            if height == 0:
                ratio = 0
            else:
                ratio = max(width, height) / min(width, height)

            print(ratio)
            # 检查是否是最“细长”的
            if ratio > slimmest_ratio:
                slimmest_ratio = ratio
                slimmest_rect = rect
                slimmest_angle = rect[2]  # 获取倾斜角度
                print(f"slimmest_angle = {slimmest_angle}")

                i += 1
                print(f"contour{i} = {contour}")
                # 初始化一个空白图像
                contour_img = np.zeros((image.shape[0], image.shape[1], 3), dtype=np.uint8)
                # 绘制单个轮廓
                cv2.drawContours(contour_img, [contour.reshape((-1, 1, 2))], -1, (255, 255, 255), 2)
                # 显示图像
                cv2.imshow(f'Single Contour{i}', contour_img)

    corrected_image = rotate_image(image_path, slimmest_angle - 90)

    return corrected_image, slimmest_angle


if __name__ == '__main__':
    corrected, correct_angle = correct_image_skew(r'bldr_tm.jpg')
    cv2.imshow(f'Corrected Image, angle={correct_angle - 90}', corrected)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


标签:校正,angle,width,slimmest,image,cv2,height,OpenCV,轮廓
From: https://www.cnblogs.com/IronRocGIS/p/18516744

相关文章

  • 使用 OpenCV 进行视频帧操作
    视频帧的基本操作是视频处理的基础,构建了图像分析和计算机视觉等高级应用的技术前提。通过OpenCV库,视频处理从视频加载、帧读取到窗口显示与帧保存的流程逐步展开,实现了对视频信息的逐帧获取和操作。在此基础上,引入了灰度转换、模糊处理和边缘检测等技术,提升了视频帧的处理......
  • OpenCV与AI深度学习 | 实战 | YOLO11自定义数据集训练实现缺陷检测 (标注+训练+预测
    本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。原文链接:实战|YOLO11自定义数据集训练实现缺陷检测(标注+训练+预测保姆级教程)导 读   本文将手把手教你用YOLO11训练自己的数据集并实现缺陷检测。安装环境YOLO11的介绍和使用这里不再赘......
  • 编译opencv 提示opencv_sfm links to target absl::log but not found解决办法
    先说解决办法,安装ceres库版本需要<2ErrorwhileconfiguringCMaketobuildwithcontribmodules在香橙派5上编译opencv+opencv_contrib我是先源码编译的ceres库(2.2版本的,查看include\version.h)在opencv\build目录下生成配置时,提示configdone,generatefailed!并报......
  • OpenCV(cv::dnn::blobFromImage())
    目录1.函数定义2.示例代码3.应用场景4.注意事项cv::dnn::blobFromImage()是OpenCV的DNN模块中的一个函数,用于将输入图像转换为深度学习模型可接受的输入格式(称为“blob”)。它通常在使用预训练的深度学习模型进行推理时,用于图像预处理,将图像格式转换为模型所需的四维张......
  • OpenCV(cv::copyMakeBorder())
    目录1.函数定义2.示例代码3.应用场景4.注意事项cv::copyMakeBorder()是OpenCV中用于给图像添加边框的函数,可以将指定宽度和类型的边框添加到图像的四周。这种操作在图像处理和计算机视觉任务中非常常见,比如在卷积运算中,通过填充边框来避免边界效应影响结果。1.函数......
  • Python从0到100(六十八):Python OpenCV-图像边缘检测及图像融合
    前言:零基础学Python:Python从0到100最新最全教程。想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、计算机视觉、机器学习、神经网络以及人工智能相关知......
  • 手机中的计算摄影:超广角畸变校正
    广角镜头,甚至超广角镜头已经成为了现在手机的标配,这样的手机能够拍摄出宽广的视角,还能够在合拍时拍下更多的人物。比如最新的iPhone13Pro就有一颗26mm焦距的广角镜头,还有一颗13mm焦距的超广角镜头。事实上,自2019年起,很多手机摄像头的FOV就已经超过100度了然而,广角镜头也会带......
  • vins-fusion gpu, docker, opencv4.5.4(cuda) 复现
    代码:https://gitee.com/zheng-yongjie/vins-fusion-gpu-cv4?skip_mobile=true硬件:jetsonxaviernx,系统20.04nvcc-V可查看cuda版本本文在docker里面复现1.opencvcuda安装root@ubuntu:~#pwd/rootwget-Oopencv-4.5.4.ziphttps://github.com/opencv/opencv/archi......
  • C++之OpenCV入门到提高002:加载、修改、保存图像
    一、介绍今天是这个系列《C++之Opencv入门到提高》得第二篇文章。今天这个篇文章很简单,只是简单介绍如何使用Opencv加载图像、显示图像、修改图像和保存图像,先给大家一个最直观的感受。但是,不能认为很简单,只是让学习的过程没那么平滑一点,以后的路就好走了。OpenCV具......
  • day10(Qt)OpenCV
    目录OpenCV1.OpenCV简介2.环境搭建3.人脸检测OpenCV1.OpenCV简介OpenCV(OpenSourceComputerVisionLibrary)是一个开源的计算机视觉库,它提供了丰富的图像处理和计算机视觉功能。该库由英特尔公司发起,并在BSD许可证下发布,因此它是免费的,且开放源代码。OpenCV......