目录
- 倾斜矫正原理及实现方式
- Canny边缘检测
- 非极大值抑制
- 霍夫变换
倾斜矫正原理及实现方式
代码连接:https://github.com/shuyeah2356/Image-Angel-correction/tree/main
倾斜矫正的实现原理:
使用霍夫变换检测图片中的直线;
计算直线与水平方向的倾斜角度;
最后根据角度旋转图片
实现步骤:
- 边缘检测,将图片转为灰度图,使用Canny边缘检测找到图片中的所有边缘
- 使用霍夫变换检测直线
- 计算角度:对于每一条直线计算其于水平线的角度,(可以用直线的极坐标表示中的角度得到)
- 角度平均:计算所有角度的中位数,用这个角度值来代表图片整体的倾斜角度
- 图片旋转:根据该角度对图片进行旋转
图片矫正效果:
Canny边缘检测
在边缘检测之前为什么转为灰度图?
1、简化处理,灰度图只有一个通道,而彩色图由三个通道,灰度图容易处理和分析,较少计算的复杂性;
2、降低数据量,灰度图只需要用一个字节来表示像素的亮度,而彩色图像需要三个值,使用灰度图能够减少数据量,节省存储空间;
3、对于边缘检测更关注图像中的边界纹理特征,不需要图片中的色彩信息。
Canny边缘检测的实现步骤
- 抑制噪声:通过高斯滤波对图像做平滑处理,滤除图像中的噪声,同时保留边缘的细节;
- 计算梯度的幅值和方向:使用sobel算子计算图像中每一个像素点的水平方向和垂直方向的梯度值,根据梯度值计算每一个像素点的梯度幅值和方向;
- 非极大值抑制:在计算得到的梯度幅值图上进行非极大值抑制,初步筛选边界;
- 双阈值方法:设置高阈值和低阈值,将图像中的像素点分为强边缘、弱边缘和非边缘。
像素值的梯度幅值超过高阈值称为强边缘,被看作是边缘;
像素的梯度值结余高阈值和低阈值之间,被看做是弱边缘,如果弱边缘与强边缘连接,则该像素视为边缘,否则将其抑制;
像素的梯度幅值小于低阈值,则该像素为非边缘。
在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
霍夫变换
极坐标上的一个点对应直角坐标中的一条直线;
直角坐标中的一个点对应极坐标中的一条正弦曲线。
直角坐标映射为极坐标:
极坐标映射为直角坐标:
直角坐标对极坐标的变换可以看作是一个参数方程,不同的θ对应不同的ρ值。
在直角坐标系中多个点共线,对应在极坐标系中,多条正弦曲线相交于一点。
霍夫变换检测直线的原理:
- Canny边缘检测后得到图像中所有边缘,遍历每一个边缘的像素点映射到极坐标系下。
- 该曲线经过的像素点的像素值+1
- 极坐标系下每一个元素的数值代表图像中共线的点的个数,
- 数值较大的点可以拟合为一条直线,将极坐标下的点的坐标反映射回直角坐标系下,对应一条直线。
霍夫变换检测到之间可视化结果:
感谢:
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