Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之六 简单图像倾斜校正处理效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之六 简单图像倾斜校正处理效果

目录

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之六 简单图像倾斜校正处理效果

一、简单介绍

二、简单图像倾斜校正处理效果实现原理

三、简单图像倾斜校正处理效果案例实现简单步骤

四、注意事项


一、简单介绍

Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。

这里使用 Python  基于 OpenCV 进行视觉图像处理,......

二、简单图像倾斜校正处理效果实现原理

在 OpenCV 中,可以使用图像处理技术对图像进行倾斜纠正。一种常用的方法是通过霍夫变换检测图像中的直线,然后计算直线的角度,最后将图像根据角度进行旋转。

图像倾斜纠正的实现原理:

  1. 边缘检测:首先,将图像转换为灰度图,并使用边缘检测算法(如Canny边缘检测)找到图像中的边缘。

  2. 霍夫变换检测直线:使用霍夫变换(Hough Transform)检测图像中的直线。这可以通过 cv2.HoughLines() 函数来实现。

  3. 计算角度:对于每条直线,计算其与水平线的角度。一般来说,这可以通过直线的极坐标表示中的角度值来得到。

  4. 角度平均:计算所有检测到的直线的角度的平均值。这个平均角度通常代表图像的整体倾斜角度。

  5. 图像旋转:根据平均角度,使用旋转矩阵将图像进行逆时针旋转。这可以通过 cv2.getRotationMatrix2D() 函数来获得旋转矩阵,并使用 cv2.warpAffine() 函数来应用旋转。

三、简单图像倾斜校正处理效果案例实现简单步骤

1、编写代码

2、运行效果

3、具体代码

"""
简单图像倾斜校正处理效果

    1、首先将图像转换为灰度图,并使用 Canny 边缘检测算法检测图像边缘。
    2、然后,我们使用霍夫变换检测图像中的直线,并计算直线的角度。
    3、接着,我们计算直线角度的中位数,并根据该角度对图像进行旋转。
    4、最后,我们显示了纠正后的图像。
"""

import cv2
import numpy as np


def correct_skew(img):
    """
    处理,计算图片倾斜角度,然后旋转图片,纠正图片
    :param img: 原图
    :return:
    """
    # 将图像转换为灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # 使用 Canny 边缘检测算法
    edges = cv2.Canny(gray, 50, 150, apertureSize=3)

    # 使用霍夫变换检测直线
    lines = cv2.HoughLines(edges, 1, np.pi / 180, 200)

    # 检查是否检测到直线
    if lines is None:
        print("No lines detected. Using default angle.")
        return img

    # 计算直线的角度
    angles = []
    for line in lines:
        rho, theta = line[0]
        angle = theta * 180 / np.pi
        angles.append(angle)

    # 计算直线角度的中位数
    median_angle = np.median(angles)

    # 对图像进行旋转
    rotated = rotate_image(img, median_angle)

    return rotated


def rotate_image(img, angle):
    """
    旋转纠正图片
    :param img:
    :param angle:
    :return:
    """
    # 获取图像的中心点坐标
    height, width = img.shape[:2]
    center = (width / 2, height / 2)

    # 计算旋转矩阵
    matrix = cv2.getRotationMatrix2D(center, angle, 1.0)

    # 进行图像旋转
    rotated = cv2.warpAffine(img, matrix, (width, height), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)

    return rotated


def main():
    # 读取图像
    image = cv2.imread('Images/Tilt.jpg')
    # 显示结果
    cv2.imshow('Origin Image', image)

    # 对图像进行倾斜纠正
    corrected_image = correct_skew(image)

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


if __name__ == '__main__':
    main()

四、注意事项

  • 直线检测的阈值设置:霍夫变换检测直线时,阈值的设置会影响直线检测的准确性。需要根据实际情况调整阈值参数。
  • 角度计算的精度:角度的计算精度会影响到最终结果的准确性。在计算角度时,可以考虑使用更高的精度来提高准确性。
  • 旋转矩阵的边界处理:在计算旋转矩阵时,需要考虑到旋转后图像可能会超出原始图像的边界,因此需要使用合适的边界模式来处理这种情况,以避免产生不良影响。
  • 异常处理:在实际应用中,需要考虑到图像中可能不存在直线的情况,因此需要进行异常处理,确保程序的稳定性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/485900.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构——认识二叉树

这是一篇回顾二叉树概念的文章 前言:一、了解树形结构1.2 树的定义2.2 树的相关概念2.2 树的表示形式 二、了解二叉树结构和性质2.1 什么是二叉树?2.2 二叉树的性质2.3 二叉树的遍历2.3 二叉树的应用范围2.5 二叉树的优缺点 三、掌握二叉树的存储结构3.1…

NX二次开发常用函数:UF_MODL_ask_feat_......(二)

最近学习NX二次开发发现有一些函数经常使用,俗话说得好,好记性不如烂笔头,现在做一下笔记,帮助理解。 UF_MODL_ask_feat_......在头文件uf_modl.h中 1、UF_MODL_ask_feat_direction (查询特征的方向) 概…

Java基于微信小程序的校园订餐小程序的实现,附源码和数据库

博主介绍:✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不…

TypeScript类型缩小

类型缩小的概念 前面我们写了一些这样的代码: function padLeft(padding: number | string, input: string): string {if (typeof padding number) {return .repeat(padding) input}return padding input }没有if判断时,无法执行语句return ’ .re…

星云小窝项目1.0——项目介绍(一)

星云小窝项目1.0——项目介绍(一) 文章目录 前言1. 介绍页面2. 首页2.1. 游客模式2.2. 注册用户后 3. 星云笔记3.1. 星云笔记首页3.2. 星云笔记 个人中心3.2. 星云笔记 系统管理3.3. 星云笔记 文章展示3.3. 星云笔记 新建文章 4. 数据中心5. 交流评论6. …

Qt读取本地系统时间的几种方式

一,使用Windows API函数GetLocalTime(精确到毫秒) typedef struct _SYSTEMTIME //SYSTEMTIME结构体定义 {   WORD wYear;//年   WORD wMonth;//月   WORD wDayOfWeek;//星期,0为星期日,1为星期一&#xff0c…

深入理解Java中的Reader类

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好…

【JAVA】通过JAVA实现用户界面的登录

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-wyCvaz0EBNwHcwsi {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

宋仕强说金航标kinghelm萨科微slkor都是网红品牌

宋仕强说金航标kinghelm萨科微slkor都是网红品牌,和宋仕强先生研究的“华强北”大ip一起,相互支持相互驱动,与金航标网站(www.kinghelm.com.cn)、萨科微网站(www.slkormicro.com)组合成为宣传矩…

Excel 导入指定分隔符的 csv 文件

原文:https://blog.iyatt.com/?p14373 基于 Excel 2024 预览版测试 csv 文件本身是纯文本的,同行数据之间通过一定的分隔符打断识别为不同的列,常用的分隔符是英文逗号,使用逗号分隔符的 csv 文件直接用 Excel 打开能正常识别单…

输入网址到网页显示全过程

TCP/IP ⽹络模型 对于同⼀台设备上的进程间通信,有很多种⽅式,⽐如有管道、消息队列、共享内存、信号等⽅式,⽽对于不同设备上的进程间通信,就需要⽹络通信,⽽设备是多样性的,所以要兼容多种多样的设备&am…

封装函数实现一维数组输入、输出以及冒泡排序

1. 代码 #include <stdio.h>int InputArray(int *pa, int len) {int i 0;for (i 0; i < len; i){scanf("%d", &pa[i]);}return 0; }int OutputArray(int *pa, int len) {int i 0;for (i 0; i < len; i){printf("%-2d ", pa[i]);}putc…

中标,我们是认真的!菊风再携手吉林银行打造智能双录系统

当前&#xff0c;数字化发展步伐持续加快&#xff0c;各个金融机构纷纷按下数字化转型的加速键&#xff0c;陆续推进数字化发展战略&#xff0c;加快数字金融建设。近期&#xff0c;吉林银行面对业务快速发展的需要&#xff0c;服务效率、人力成本等挑战日益凸显&#xff0c;逐…

YOLOv5全网独家改进: 注意力机制改进 | 并行化注意力设计(PPA)模块,红外小目标暴力涨点 | 2024年3月最新成果

💡💡💡本文独家改进:红外小目标涨点利器,在多个数据集下进行验证,其中并行化 patch-aware 注意力(PPA)模块,解决目标的大小微小以及红外图像中通常具有复杂的背景的问题点 💡💡💡红外小目标实现暴力涨点,只有几个像素的小目标识别率大幅度提升 改进结构图如…

MySQL的基本操作与增删改查管理操作

一、MySQL数据库sql语句 1.1 sql 命令 database数据库table表row行column列user用户select从数据表中获取数据updata更新数据库中的数据delete从数据库中删除数据insert into 向数据表插入数据create database创建新数据库alter database修改数据库create table创建新表alter…

第八节:深入讲解SMB中的Http组件

一、概述 Http组作是SMB中的核心组件之一&#xff0c;在第七节中讲解了如何简洁的进行web程序部署和运行&#xff0c;这只是它的功能之一。在本节中&#xff0c;我们将介绍Http组件的重要属性。 二、请求头Request 1、支持方法 支持POST、GET、PUT、DELETE、OPTIONS等方法&a…

AI数字人“搅局”直播电商

现如今&#xff0c;直播带货已然成为了备受消费者欢迎的一种新的购物模式&#xff0c;人们已经愈发习惯在直播间购物了。在直播带货热度居高不下背后&#xff0c;除了低价优势之外&#xff0c;还在于直播带货所具备的实时互动、全方位展示能够为消费者带去更加真实、直观、沉浸…

Java集合框架初学者指南:List、Set与Map的实战训练

Java集合框架是Java语言的核心部分&#xff0c;它提供了丰富的类和接口&#xff0c;用来高效地管理和操作大量数据。这个强大的工具箱包括多种集合类型&#xff0c;其中最为常用的是List、Set和Map。 1.List - 有序且可重复的数据清单 概念&#xff1a; List就像一个购物清单&…

python usb与下位机 硬件通信

需求分析 上周接到一个需求 用usb和硬件连接 轮询读取usb中指定功能码的指定个数的数据并生成一个桌面程序 刚接到这个需求时 我第一时间想到的就是使用python去尝试 期间也踩了很多的坑 第一版效果如下 特此记录 环境搭建 首先第一点就是将所需要的库进行安装 这里是我这…

Springboot2 restTemplate 使用UriComponentsBuilder时编码问题

文章目录 简要说明maven依赖样例代码 简要说明 在使用springboot2的restTemplate配合UriComponentsBuilder&#xff0c;UriComponentsBuilder拿到uri字符串时有编码过程&#xff0c;而restTemplate在execute时&#xff0c;底层也是有encode编码&#xff0c;这样就到时了双重编…