图片倾斜矫正处理(Hough Transform)

目录

    • 倾斜矫正原理及实现方式
    • Canny边缘检测
    • 非极大值抑制
    • 霍夫变换

倾斜矫正原理及实现方式

代码连接:https://github.com/shuyeah2356/Image-Angel-correction/tree/main
倾斜矫正的实现原理:

使用霍夫变换检测图片中的直线;
计算直线与水平方向的倾斜角度;
最后根据角度旋转图片

实现步骤:

  1. 边缘检测,将图片转为灰度图,使用Canny边缘检测找到图片中的所有边缘
  2. 使用霍夫变换检测直线
  3. 计算角度:对于每一条直线计算其于水平线的角度,(可以用直线的极坐标表示中的角度得到)
  4. 角度平均:计算所有角度的中位数,用这个角度值来代表图片整体的倾斜角度
  5. 图片旋转:根据该角度对图片进行旋转

图片矫正效果:
在这里插入图片描述
在这里插入图片描述

Canny边缘检测

在边缘检测之前为什么转为灰度图?
1、简化处理,灰度图只有一个通道,而彩色图由三个通道,灰度图容易处理和分析,较少计算的复杂性;
2、降低数据量,灰度图只需要用一个字节来表示像素的亮度,而彩色图像需要三个值,使用灰度图能够减少数据量,节省存储空间;
3、对于边缘检测更关注图像中的边界纹理特征,不需要图片中的色彩信息。

Canny边缘检测的实现步骤

  1. 抑制噪声:通过高斯滤波对图像做平滑处理,滤除图像中的噪声,同时保留边缘的细节;
  2. 计算梯度的幅值和方向:使用sobel算子计算图像中每一个像素点的水平方向和垂直方向的梯度值,根据梯度值计算每一个像素点的梯度幅值和方向;
  3. 非极大值抑制:在计算得到的梯度幅值图上进行非极大值抑制,初步筛选边界;
  4. 双阈值方法:设置高阈值和低阈值,将图像中的像素点分为强边缘、弱边缘和非边缘。
    像素值的梯度幅值超过高阈值称为强边缘,被看作是边缘;
    像素的梯度值结余高阈值和低阈值之间,被看做是弱边缘,如果弱边缘与强边缘连接,则该像素视为边缘,否则将其抑制;
    像素的梯度幅值小于低阈值,则该像素为非边缘。

在OpenCV中通过cv2.Canny(image, threshold1, threshold2, edges=None, apertureSize=None, L2gradient=None)实现,
其中第一个参数表示输入的图像;
threshold1, threshold2表示双阈值中的低阈值和高阈值;
edge表示输出图片的大小;
apertureSize表示sobel算子中卷积核的大小;
L2gradient表示梯度如何计算,默认使用:在这里插入图片描述
该参数设置为True,则计算梯度幅值使用:
在这里插入图片描述

非极大值抑制

边缘检测中的非极大值抑制方法,作用是对边缘做初步筛选,去除图像中冗余的边缘。
判断当前像素点的梯度是都为梯度方向上的极值点,如果当前像素点为梯度方向上的极值点则该点保留为边缘,如果当前像素点不是极值点,则将该点抑制。

周围像素点的梯度可能无法计算,则根据已知的像素只梯度通过插值计算。
非极大值抑制只在水平、垂直和两个对角线方向,每一个像素点的梯度方向按照近似程度用0°、90°、45°、135°来近似表示。
通过a2/a5计算出n像素值的梯度;通过a3/a6计算m像素点的梯度。
在这里插入图片描述
非极大值抑制参考

https://blog.csdn.net/weixin_42491648/article/details/131348643?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-131348643-blog-11620357.235v43pc_blog_bottom_relevance_base9&spm=1001.2101.3001.4242.1&utm_relevant_index=3

霍夫变换

极坐标上的一个点对应直角坐标中的一条直线;
直角坐标中的一个点对应极坐标中的一条正弦曲线。
直角坐标映射为极坐标:
在这里插入图片描述
极坐标映射为直角坐标:
在这里插入图片描述

直角坐标对极坐标的变换可以看作是一个参数方程,不同的θ对应不同的ρ值。
在直角坐标系中多个点共线,对应在极坐标系中,多条正弦曲线相交于一点。
霍夫变换检测直线的原理:

  1. Canny边缘检测后得到图像中所有边缘,遍历每一个边缘的像素点映射到极坐标系下。
  2. 该曲线经过的像素点的像素值+1
  3. 极坐标系下每一个元素的数值代表图像中共线的点的个数,
  4. 数值较大的点可以拟合为一条直线,将极坐标下的点的坐标反映射回直角坐标系下,对应一条直线。

感谢:
https://blog.csdn.net/weixin_48938349/article/details/128750770

https://blog.csdn.net/weixin_42491648/article/details/131348643?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-131348643-blog-11620357.235v43pc_blog_bottom_relevance_base9&spm=1001.2101.3001.4242.1&utm_relevant_index=3

https://blog.csdn.net/weixin_42491648/article/details/131348643?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-131348643-blog-11620357.235%5Ev43%5Epc_blog_bottom_relevance_base9&spm=1001.2101.3001.4242.1&utm_relevant_index=3

https://blog.csdn.net/hai411741962/article/details/132144264

https://blog.csdn.net/gangeqian2/article/details/80034070

https://www.bilibili.com/video/BV1Gv4y167t9/?spm_id_from=333.337.search-card.all.click&vd_source=91cfed371d5491e2973d221d250b54ae

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

TCP四次挥手分析

TCP四次挥手分析 概念过程分析为什么连接的时候是三次握手,关闭的时候却是四次握手?为什么要等待2MSL? 概念 四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。 在…

机器视觉系统-条形光源安装位置计算

使用条形光对反光材质物体打光时,常常出现强烈的光斑反射,影响图像处理。如果不想图像中出现光源的光斑,可以通过计 算得出条形光源的安装范围。 检则PCB板上的二维码字符,使用两个条形光打光的效果图 以及等效模型: …

机器学习:深入解析SVM的核心概念【二、对偶问题】

对偶问题 **问题一:什么叫做凸二次优化问题?而且为什么符合凸二次优化问题?**为什么约束条件也是凸的半空间(Half-Space)凸集(Convex Set)半空间是凸集的例子SVM 约束定义的半空间总结 **问题二…

领域驱动设计(DDD)笔记(三)后端工程架构

文章链接 领域驱动设计(DDD)笔记(一)基本概念-CSDN博客领域驱动设计(DDD)笔记(二)代码组织原则-CSDN博客领域驱动设计(DDD)笔记(三)后端工程架构-CSDN博客前导 领域驱动设计(Domain Driven Design,简称DDD)是业内主导的业务工程理论。它在各中权威人士被广泛讨论…

ArrayList应用

1.简单的洗牌算法 基本要求: 人数为3个人没人轮流抽一张牌,抽五轮,也就是每人五张牌去除大小王,一共52张牌,要求牌打乱顺序 思路: 创建Card对象,有花色和牌面值两个成员属性生成一副扑克牌&…

ICode国际青少年编程竞赛- Python-1级训练场-for循环练习

ICode国际青少年编程竞赛- Python-1级训练场-for循环练习 1、 for i in range(3):Dev.step(4)Dev.turnLeft()2、 for i in range(3):Dev.step(2)Dev.turnRight()Dev.step(2)Dev.turnLeft()3、 for i in range(3):Dev.step(2)Dev.turnRight()Dev.step(2)Dev.turnLeft()4、 for…

痉挛性斜颈患者早上运动还是下午运动更合适?选对了让治疗更简单!【北京仁爱堂】

对于痉挛性斜颈患者来说,选择合适的运动时间对于治疗的效果和舒适度至关重要。那么,痉挛性斜颈患者早上运动还是下午运动更合适呢?本文将从多个角度对此进行分析,帮助患者找到最适合自己的运动时间。 首先,我们需要了…

网络安全的重要性及人才需求

安全现在是大趋势,说是铁饭碗也不为过,就业前景好,方向多比传统计算机行业就业舒服点。但是大厂依然是985,211的天下,是双非能进大厂的,只是凤毛麟角。前提是你的能力可以让公司忽略你的学历。 以2023年为…

HTML_CSS学习:常用文本属性

一、文本颜色 相关代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>文本颜色</title><style>div{font-size: 90px;}.atguigu1{color: #238c20;}.atguigu2{color: rgb(2…

文心一言 VS 讯飞星火 VS chatgpt (250)-- 算法导论18.2 3题

三、请说明如何在一棵 B 树中找出最小关键字&#xff0c;以及如何找出某一给定关键字的前驱。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 在B树&#xff08;也称为B-tree&#xff09;中&#xff0c;最小的关键字总是位于最左边的叶子节点的最左边的元素。要…

中国科学院南京地理与湖泊研究所张科研究员团队联合多家单位科学家在PNAS发文:湖泊沉积物解锁长三角太湖流域可持续发展之道

文章简介 论文名称&#xff1a;Transient social–ecological dynamics reveal signals of decoupling in a highly disturbed Anthro-pocene landscape&#xff08;瞬态社会生态动力学揭示了高度干扰的人类景观中解耦的信号&#xff09; 第一作者及通讯作者&#xff1a;林琪…

波形发生器设计(频率、占空比、幅值可调)

一、正弦波信号发生器 1.电路原理图&#xff1a; 2.原理&#xff1a; 采用了文氏电桥的方法&#xff0c;通过自激振荡的方式出波。 其中R6,C1,R2,C2构成正反馈支路&#xff0c;令R1R2R,C1C2C&#xff0c;可以计算出正弦波的振荡频率f1/2πRC。将文氏电路的电容值固定&#xff0…

《21天学通C++》(第十五章)标准模板库简介

本章简单介绍STL容器、迭代器和算法的基本概念&#xff0c;之后几章会分别详述 1.STL容器 STL容器是STL中用于存储集合数据的组件&#xff0c;它们可以被看作是模板类&#xff0c;允许开发者定义特定类型的容器发&#xff0c;这里按照C11标准分为四类&#xff1a;顺序容器、关…

信息系统项目管理师0082:项目基础(6项目管理概论—6.2项目基本要素—6.2.1项目基础)

点击查看专栏目录 文章目录 6.2项目基本要素6.2.1项目基础1.独特的产品、服务或成果2.临时性工作3.项目驱动变更4.项目创造业务价值5.项目启动背景记忆要点总结6.2项目基本要素 6.2.1项目基础 项目是为创造独特的产品、服务或成果

XYCTF2024 RE ez unity 复现

dll依然有加壳 但是这次global-metadata.dat也加密了&#xff0c;原工具没办法用了&#xff0c;不过依然是可以修复的 a. 法一&#xff1a;frida-il2cpp-bridge 可以用frida-il2cpp-bridge GitHub - vfsfitvnm/frida-il2cpp-bridge: A Frida module to dump, trace or hijac…

STM32入门_江协科技_3~4_OB记录的自学笔记_软件安装新建工程

3. 软件安装 3.1. 安装Keil5 MDK 作者的资料下载的连接如下&#xff1a;https://jiangxiekeji.com/download.html#32 3.2. 安装器件支持包 因为新的芯片层出不穷&#xff0c;所以需要安装Keil5提供的器件升级版对软件进行升级&#xff0c;从而支持新的芯片&#xff1b;如果不…

JSP语法——[JSP]7

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;大大会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

SVM单类异常值检测

SVM是一种广泛使用的分类器&#xff0c;通常用于二分类或多分类问题。然而&#xff0c;在异常点检测的场景中&#xff0c;我们通常会将数据视为一个类别&#xff08;即正常数据点&#xff09;&#xff0c;并尝试找到那些与正常数据点显著不同的点&#xff08;即异常点&#xff…

基础IO认识

回顾文件 我们之前认识文件只是在语言程度上理解&#xff0c;但是我们理解的不够彻底&#xff0c;要想真正理解文件要在os上理解。 简单代码认识 1 #include<stdio.h>2 int main(){3 FILE* fpfopen("log.txt","w");4 if(fpNULL){5 p…

PG实例连接访问控制

实例访问控制可以控制来自于不同主机&#xff0c;不同用户是否允许访问指定的数据库&#xff0c;以及验证方式。 与oracle中的连接管理器的功能相同&#xff0c;之前有写过一篇oracleCMAN连接管理器的配置实操&#xff1a; 配置oracle连接管理器&#xff08;cman&#xff09;…