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

news2024/11/15 8:50:48

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.coloradmin.cn/o/1227581.html

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

相关文章

GitHub如何删除仓库

GitHub如何删除仓库 删除方法第一步第二步第三步 删除方法 第一步 在仓库的界面选择Settings 第二步 选择General,页面拉到最后。 第三步 删除仓库。

程序员开发者神器:10个.Net开源项目

今天一起盘点下&#xff0c;8月份推荐的10个.Net开源项目&#xff08;点击标题查看详情&#xff09;。 1、基于C#开发的适合Windows开源文件管理器 该项目是一个基于C#开发、开源的文件管理器&#xff0c;适用于Windows&#xff0c;界面UI美观、方便轻松浏览文件。此外&#…

基于springboot实现校园在线拍卖系统项目【项目源码】计算机毕业设计

基于springboot实现校园在线拍卖系统演示 Javar技术 JavaScript是一种网络脚本语言&#xff0c;广泛运用于web应用开发&#xff0c;可以用来添加网页的格式动态效果&#xff0c;该语言不用进行预编译就直接运行&#xff0c;可以直接嵌入HTML语言中&#xff0c;写成js语言&…

2020年09月 Scratch(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 下面哪个按钮可以实现音乐结束时音量慢慢变小? A: B: C: D:

基于RK3588的8k多屏异显安卓智能网络机顶盒

采用RK3588芯片方案的8K网络机顶盒&#xff0c;搭载纯净的安卓12操作系统&#xff0c;支持Ubuntu和Debian系统容拓展。主要面向外贸市场。此款机顶盒自带两个HDMI输出接口&#xff0c;一个HDMI输入接口&#xff0c;内置双频WiFi6无线模块&#xff0c;支持千兆以太网和USB接口。…

用向量数据库Milvus Cloud搭建GPT大模型+私有知识库的定制AI助手——PPT大纲助手

随着人工智能技术的不断发展,AI助手在各行各业中扮演着越来越重要的角色。在商业领域,PPT演示是一种常见的沟通方式,而定制化的PPT大纲助手能够极大地提高PPT制作效率和质量。本文将介绍如何利用向量数据库Milvus Cloud搭建GPT大模型和私有知识库,构建一款高效的PPT大纲助手…

SQL单表复杂查询where、group by、order by、limit

1.1SQL查询代码如下&#xff1a; select job as 工作类别,count(job) as 人数 from tb_emp where entrydate <2015-01-01 group by job having count(job) > 2 order by count(job) limit 1,1where entrydate <‘2015-01-01’ 表示查询日期小于2015-01-01的记录…

快速修改ppt | 显得不单调

做完ppt&#xff0c;怎样不显得单调 ----> 加个 主题&#xff0c;首页 改下 字体&#xff08;如 华文行楷&#xff0c;96&#xff0c;字体颜色&#xff09;

VMware——WindowServer2012R2安装jdk1.8及环境变量配置

一、安装 双击【jdk-8u161-windows-x64.exe】程序包&#xff0c;弹出窗口点击【下一步】&#xff0c;如下图&#xff1a; 指定安装目录为【Java\jdk1.8.0_161】&#xff0c;磁盘目录自定义&#xff0c;如下图&#xff1a; 点击【下一步】一直到有个【更改】按钮&#xff0c;可…

九、Linux用户管理

1.基本介绍 Linux系统是一个多用户多任务的操作系统&#xff0c;任何一个要使用系统资源的用户&#xff0c;都必须首先向系统管理员申请一个账号&#xff0c;让后以这个账号的身份进入系统 2.添加用户 基本语法 useradd 用户名 应用案例 案例1&#xff1a;添加一个用户 m…

【Python数据结构与算法】——(线性结构)精选好题分享,不挂科必看系列

&#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏:<<Python数据结构与算法专栏>>&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 时间复杂度大小比较 1.time complexity of algorithm A is O(n^3) while algorithm B is O(2^n). Which o…

LinkWeChat V4.9.8 版本发布

LinkWeChat v4.9.8 已经发布&#xff0c;基于企业微信的 SCRM 系统 LinkWeChat 是国内首个基于企业微信的开源 SCRM&#xff0c;在集成了企微强大的开放能力的基础上&#xff0c;进一步升级拓展灵活高效的客户运营能力及多元化精准营销能力&#xff0c;让客户与企业之间建立强…

开拓经验专栏:从十来天的晨型人体验开始

文章目录 拓新缘起契机实践心得 拓新 确定要新开一个板块&#xff0c;用来记录持续自我提升的经验和教训&#xff0c;着实遭遇了不少阻力。 首先&#xff0c;我的语文功底一向不行&#xff0c;当年高考前&#xff0c;语文分数在及格线上下跳动都是常事&#xff0c;现在却要通…

车载通信架构 —— 传统车内通信网络发展回顾

车载通信架构 —— 传统车内通信网络发展回顾 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何…

8.5 Windows驱动开发:内核注册表增删改查

注册表是Windows中的一个重要的数据库&#xff0c;用于存储系统和应用程序的设置信息&#xff0c;注册表是一个巨大的树形结构&#xff0c;无论在应用层还是内核层操作注册表都有独立的API函数可以使用&#xff0c;而在内核中读写注册表则需要使用内核装用API函数&#xff0c;如…

lambda表达式c++

介绍 可调用对象 对于一个表达式&#xff0c;如果可以对其使用调用运算符&#xff08;&#xff09;&#xff0c;则称它为可调用对象。如函数就是一个可调用对象&#xff0c;当我们定义了一个函数f(int)时&#xff0c;我们可以通过f(5)来调用它。 可调用对象有&#xff1a; …

数学建模-图与网络模型解题方法和代码实现

本文针对以下几个方面问题进行整理&#xff1a; 最短路问题 两个指定顶点之间的最短路径任意顶点之间的最短路径 2.最小生成树问题 求最小生成树 3.网络最大流问题 源点与汇点之间的最大流基于最大流的最小费用求解 4.旅行商问题 基于哈密顿(Hamilton)圈求解旅行商线性…

多功能神器,强劲升级,太极2.x你值得拥有!

嗨&#xff0c;大家好&#xff0c;今天给大家分享一个好用好玩的软件。那就是太极2.x软件&#xff0c;最近在1.0版本上进行了全新升级&#xff0c;升级后的功能更强更稳定&#xff0c;轻度用户使用基本功能就已经足够了&#xff0c;我们一起来看看吧&#xff01; 首页 首页左…

安卓中轻量级数据存储方案分析探讨

轻量级数据存储功能通常用于保存应用的一些常用配置信息&#xff0c;并不适合需要存储大量数据和频繁改变数据的场景。应用的数据保存在文件中&#xff0c;这些文件可以持久化地存储在设备上。需要注意的是&#xff0c;应用访问的实例包含文件所有数据&#xff0c;这些数据会一…

深入流行推荐引擎3:Spotify音乐推荐系统

深入流行推荐引擎3&#xff1a;Spotify音乐推荐系统 Spotify音乐推荐系统通过矩阵分解发现每周&#xff08;Discover Weekly via Matrix Factorization&#xff09;Discover Weekly 如何运作&#xff1f;&#xff08;How Discover Weekly Works?&#xff09;矩阵分解&#xff…