图像倾斜角度求取-Radon变换

Radon算法

Radon(拉东)算法是一种通过定方向投影叠加,找到最大投影值时角度,从而确定图像倾斜角度的算法。具体过程如图所示 

图1 Radon变换算法

Radon计算示例

对于纹理方向明显的图像,如图2所示,可以通过Radon变换求取倾斜角度。

图2 带求倾斜角度图像

具体步骤如下:

1、图像傅里叶变换

采用Cv2.Dft函数,对图2进行傅里叶变换,变换后的图像如图3所示:

图3 二值化后的傅里叶变换图像

从上面图像可以看到,傅里叶变化图像3方向,与图像2纹理方向呈现垂直关系。我们只要求出来图3的倾斜方向,即可求出来实际图像的倾斜方向。

对于尺寸较大的图像,可采取金字塔下采样方式,将图像进行压缩,以减少Radon计算的时间。

2、金字塔下采样

应用Cv2.PyrDown进行金字塔下采样,减少图像3的尺寸。

while (pyrMat.Width > 100 || pyrMat.Height > 100)
{Cv2.PyrDown(pyrMat, pyrMat, new OpenCvSharp.Size(tempMat.Cols * 0.5, tempMat.Rows * 0.5));
}

压缩后的图像如下图4所示。

图4 金字塔下采样的图片 

3、Radon变换

根据Radon变换原理,编写Radon变换代码,伪代码如下所示:

            for (int t = 0; t < 180; t++){double tempAngle = t * Math.PI / angle;float[,] R = new float[3, 3] {{(float)Math.Cos(tempAngle), (float)Math.Sin(tempAngle), 0 },{ -(float)Math.Sin(tempAngle), (float)Math.Cos(tempAngle), 0},{ 0, 0, 1 } };Mat mR = new Mat(3, 3, MatType.CV_32FC1, R);Mat rotation = m1 * mR * m0;Mat rotated = new Mat();Cv2.WarpPerspective(dst, rotated, rotation, new OpenCvSharp.Size(dst.Rows, dst.Cols), InterpolationFlags.WarpInverseMap);rotated.ConvertTo(rotated, MatType.CV_8UC1);//Cv2.ImShow("test3", rotated);rotated.ConvertTo(rotated, MatType.CV_32FC1);double Sum = 0;List<float> arrMaxCol = new List<float>();for (int j = 0; j < rotated.Cols; j++){/*正文下载链接中有详细代码*/}             arrMaxAngle.Add(arrMaxCol.Max());}var maxSum = arrMaxAngle.Max();var maxInd = arrMaxAngle.IndexOf(maxSum);return maxInd-90;

 最终计算的倾斜角度如下图5程序界面所示。

图5 最终计算结果 

Radon变换的下载链接如下:

https://download.csdn.net/download/qq_20660115/88550141 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5.Java中的注释及Javadoc文档

本文讲解 Java 中的注释以及 Javadoc 文档 ~ 文章目录 1. 注释1.1 引言1.1.1 何为注释&#xff1f;1.1.2 注释有何用&#xff1f;1.1.2.1 方便阅读1.1.2.2 调试程序 1.1.3 单行注释和多行注释 1.2 方法注释1.2.1 什么是方法注释&#xff1f;1.2.2 如何写方法注释&#xff1f;1.…

C/C++通过位操作实现2个uint32_t合并为uint64_t

#include <iostream> using namespace std;int main() {uint32_t a 10;uint32_t b 600;//先将uint32_t的a转为uint64_t&#xff0c;此时a前面32位都是0&#xff0c;然后左移32位&#xff0c;此时右32位为0&#xff0c;最后加上uint32_t类型的b&#xff0c;填充右32位的…

打开游戏提示xapofx1_5.dll丢失如何修复?xapofx1_5.dll缺失的修复教程分享

xapofx1_5.dll是一个重要的Windows系统文件&#xff0c;它主要负责处理图形渲染和多媒体功能。如果在计算机中找不到xapofx1_5.dll&#xff0c;可能会导致程序无法正常运行。下面是关于xapofx1_5.dll丢失的4个修复方法以及xapofx1_5.dll的作用和丢失原因的介绍。 一、xapofx1_…

Java 算法篇-链表的经典算法:有序链表去重、合并多个有序链表

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 链表的说明 2.0 有序链表去重的实现方式 2.1 有序链表去重(保留重复的节点) - 使用递归来实现 2.2 有序链表去重(保留重复的节点) - 使用双指针来实现 2.3 有序…

在线代码调试运行微信开放平台官方接口调试校验工具大全

具体前往&#xff1a;在线代码调试&API校验工具大全

Bulk RNA-seq上下游分析

Bulk-RNA-seq上下游分析还是相对简单的&#xff0c;这次我以mouse为例&#xff0c;进行Bulk-RNA-seq上下游分析&#xff0c;并进行对应的图片绘制。 上游分析 1.软件准备 #安装所需软件 sudo apt install fastqc sudo apt install hisat2 sudo apt install cutadapt sudo ap…

场景交互与场景漫游-交运算与对象选取(8-1)

交运算与对象选取 在面对大规模的场景管理时&#xff0c;场景图形的交运算和图形对象的拾取变成了一项基本工作。OSG作为一个场景管理系统&#xff0c;自然也实现了场景图形的交运算&#xff0c;交运算主要封装在osgUtil 工具中在OSG中&#xff0c;osgUtil是一个非常强有力的工…

HWS-CTF-第七期山大站-inverse

文章目录 inversemainworkread_intread_n 思路onegadget exp 第一次真正意义上独立在比赛中做出题目来了&#xff0c;距离真正意义接触CTF-PWN差不多正好两个月。但由于不知道靶场要自己开而且端口每次自己打开会改&#xff0c;交flag稍微晚了些&#xff08;我太菜了&#xff0…

Linux之进程概念(一)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、冯诺依曼体系结构二、操作系统(Operator System)1、概念2、设计OS的目的3、定位4、如何理…

基于springboot实现摄影跟拍预定管理系统【项目源码+论文说明】

基于springboot实现摄影跟拍预定管理系统演示 摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要…

算法之路(二)

&#x1f58a;作者 : D. Star. &#x1f4d8;专栏 : 算法小能手 &#x1f606;今日分享 : 你知道北极熊的皮肤是什么颜色的吗&#xff1f;&#xff08;文章结尾有答案哦&#xff01;&#xff09; 文章目录 力扣的209题✔解题思路✔代码:✔总结: 力扣的3题✔解题思路&#xff1a…

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)

【单片机】14-I2C通信之EEPROM-CSDN博客 一、IIC总线协议介绍 1.IIC简介 同步&#xff08;有时钟频率&#xff09;&#xff0c;半双工&#xff08;同一个时间只能接收或者发送&#xff09;&#xff0c;串行&#xff08;一个字节一个字节传输&#xff09;&#xff0c;高位读取…