OpenCV几何图像变换(11)极坐标转换函数warpPolar()的使用

news2024/9/20 18:48:32
  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

函数将图像重映射到极坐标或半对数极坐标空间。

极坐标重映射参考
用以下转换来转换源图像:

d s t ( ρ , ϕ ) = s r c ( x , y ) dst(\rho , \phi ) = src(x,y) dst(ρ,ϕ)=src(x,y)
其中
I ⃗ = ( x − c e n t e r . x ,    y − c e n t e r . y ) ϕ = K a n g l e ⋅ angle ( I ⃗ ) ρ = { K l i n ⋅ magnitude ( I ⃗ ) 默认 K l o g ⋅ l o g e ( magnitude ( I ⃗ ) ) i f    半对数 \begin{array}{l} \vec{I} = (x - center.x, \;y - center.y) \\ \phi = Kangle \cdot \texttt{angle} (\vec{I}) \\ \rho = \left\{\begin{matrix} Klin \cdot \texttt{magnitude} (\vec{I}) & 默认 \\ Klog \cdot log_e(\texttt{magnitude} (\vec{I})) & if \; 半对数 \\ \end{matrix}\right. \end{array} I =(xcenter.x,ycenter.y)ϕ=Kangleangle(I )ρ={Klinmagnitude(I )Klogloge(magnitude(I ))默认if半对数
并且
K a n g l e = d s i z e . h e i g h t / 2 Π K l i n = d s i z e . w i d t h / m a x R a d i u s K l o g = d s i z e . w i d t h / l o g e ( m a x R a d i u s ) \begin{array}{l} Kangle = dsize.height / 2\Pi \\ Klin = dsize.width / maxRadius \\ Klog = dsize.width / log_e(maxRadius) \\ \end{array} Kangle=dsize.height/2ΠKlin=dsize.width/maxRadiusKlog=dsize.width/loge(maxRadius)

线性与半对数映射
极坐标映射可以是线性的或半对数的。向标志中添加一个 WarpPolarMode 来指定极坐标映射模式。
线性是默认模式。
半对数映射模拟人类“中央视觉”的特性,即视线中心的视觉敏锐度非常高,而周边视觉的敏锐度较低。

关于 dsize 的选项:

  • 如果 dsize 中的两个值都小于等于 0(默认),目标图像将具有(几乎)与源图像包围圆相同大小的面积:
    d s i z e . a r e a ← ( m a x R a d i u s 2 ⋅ Π ) d s i z e . w i d t h = cvRound ( m a x R a d i u s ) d s i z e . h e i g h t = cvRound ( m a x R a d i u s ⋅ Π ) \begin{array}{l} dsize.area \leftarrow (maxRadius^2 \cdot \Pi) \\ dsize.width = \texttt{cvRound}(maxRadius) \\ dsize.height = \texttt{cvRound}(maxRadius \cdot \Pi) \\ \end{array} dsize.area(maxRadius2Π)dsize.width=cvRound(maxRadius)dsize.height=cvRound(maxRadiusΠ)
  • 如果仅 dsize.height 小于等于 0,目标图像面积将与包围圆面积成比例,但按 Kx * Kx 缩放:
    d s i z e . h e i g h t = cvRound ( d s i z e . w i d t h ⋅ Π ) \begin{array}{l} dsize.height = \texttt{cvRound}(dsize.width \cdot \Pi) \\ \end{array} dsize.height=cvRound(dsize.widthΠ)
  • 如果 dsize 中的两个值都大于 0,目标图像将具有给定的大小,因此包围圆的面积将被缩放到 dsize 大小。

反向映射:
你可以通过向标志中添加 WARP_INVERSE_MAP 来获得反向映射。

 // direct transform
        warpPolar(src, lin_polar_img, Size(),center, maxRadius, flags);                     // linear Polar
        warpPolar(src, log_polar_img, Size(),center, maxRadius, flags + WARP_POLAR_LOG);    // semilog Polar
        // inverse transform
        warpPolar(lin_polar_img, recovered_lin_polar_img, src.size(), center, maxRadius, flags + WARP_INVERSE_MAP);
        warpPolar(log_polar_img, recovered_log_polar, src.size(), center, maxRadius, flags + WARP_POLAR_LOG + WARP_INVERSE_MAP);

另外,要从极坐标映射坐标 (rho, phi) 计算原始坐标 (x, y):

   double angleRad, magnitude;
        double Kangle = dst.rows / CV_2PI;
        angleRad = phi / Kangle;
        if (flags & WARP_POLAR_LOG)
        {
            double Klog = dst.cols / std::log(maxRadius);
            magnitude = std::exp(rho / Klog);
        }
        else
        {
            double Klin = dst.cols / maxRadius;
            magnitude = rho / Klin;
        }
        int x = cvRound(center.x + magnitude * cos(angleRad));
        int y = cvRound(center.y + magnitude * sin(angleRad));

在OpenCV中,warpPolar函数用于将图像从笛卡尔坐标系转换到极坐标系或从极坐标系转换回笛卡尔坐标系。这种变换对于进行圆形图像处理非常有用,例如检测圆环状特征或进行图像的径向滤波。

函数原型

void cv::warpPolar	
(
	InputArray 	src,
	OutputArray 	dst,
	Size 	dsize,
	Point2f 	center,
	double 	maxRadius,
	int 	flags 
)		

参数

  • 参数src 源图像。
  • 参数dst 目标图像。它将具有与 src 相同的类型。
  • 参数 dsize 目标图像的大小(参见描述中的有效选项)。
  • 参数center 转换的中心点。
  • 参数maxRadius 包围圆的半径来进行转换。它还确定了逆向的幅度比例参数。
  • flags: 插值方法的组合,InterpolationFlags + WarpPolarMode。
    • 添加 WARP_POLAR_LINEAR 来选择线性极坐标映射(默认)
    • 添加 WARP_POLAR_LOG 来选择半对数极坐标映射
    • 添加 WARP_INVERSE_MAP 来进行反向映射

注意事项
该函数不能原地操作。
为了计算幅度和角度(以度为单位),内部使用 cartToPolar 函数,因此角度范围是从 0 到 360 度,精度约为 0.3 度。
此函数使用 remap。由于当前实现的限制,输入和输出图像的大小应该小于 32767x32767。

代码示例


#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/opencv.hpp>

using namespace cv;

int main( int argc, char** argv )
{
    // 读取图像
    Mat image = imread( "/media/dingxin/data/study/OpenCV/sources/images/circle2.jpg", IMREAD_GRAYSCALE );

    if ( image.empty() )
    {
        std::cerr << "Error: Could not open or find the image." << std::endl;
        return -1;
    }

    // 设置极坐标变换的中心点
    Point2f center( image.cols / 2.0, image.rows / 2.0 );

    // 设置最大半径
    double maxRadius = std::min( image.cols, image.rows ) / 2.0;

    // 设置输出图像的大小
    Size dsize( 360, maxRadius );  // 360度,半径为最大半径

    // 创建输出图像
    Mat polarImage;

    // 应用极坐标变换
    warpPolar( image, polarImage, dsize, center, maxRadius, WARP_POLAR_LINEAR + INTER_LINEAR);

    // 显示结果
    namedWindow( "Original Image", WINDOW_NORMAL );
    imshow( "Original Image", image );

    namedWindow( "Polar Image", WINDOW_NORMAL );
    imshow( "Polar Image", polarImage );

    waitKey( 0 );

    return 0;
}

运行结果

在这里插入图片描述

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

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

相关文章

别着急面试㊙先背完答案✅offer接到手软

别着急面试㊙先背完答案✅offer接到手软 21/100 保存草稿 发布文章 2401_85378759 未选择任何文件 new 面试大模型岗的小伙伴们最近面试题背的怎么样啦 - 大模型&#xff08;LLM&#xff09;面试题是面试中比较常问到的&#xff0c;今天给大家整理了120个常见的大模型面试题✅…

【惠农网-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

图论:图的遍历(DFS vs. BFS)

文章目录 引言基本概念无向图示例绘制图形 深度优先搜索&#xff08;DFS&#xff09;基本概念可视化 DFS 过程深度优先搜索&#xff08;DFS&#xff09;DFS 应用场景 广度优先搜索&#xff08;BFS&#xff09;基本概念可视化 BFS 过程广度优先搜索&#xff08;BFS&#xff09;应…

有效三角形个数问题

目录 一题目简述&#xff1a; 二思路总结&#xff1a; 21不被认可的暴力破解思路&#xff1a; 22优化后的思路&#xff1a; 221优化后的判断三角形方法&#xff1a; 222 定一动二指针朝内筛选遍历&#xff1a; 三解答代码&#xff1a; 一题目简述&#xff1a; leetcode链…

500以内有好用的开放式耳机推荐吗?五款500以内开放式耳机推荐

作为一个几乎醒了就离不开耳机的人&#xff0c;我经常在思考什么样子的耳机才能做到佩戴无感、不塞耳、没有胀痛&#xff0c;还可以随时为我们提供高品质音乐呢&#xff1f;划拉来&#xff0c;划拉去还是觉得开放式耳机比较适合&#xff0c;它不入耳的设计能够让空气在耳朵流通…

基于大模型 + 知识库的 Code Review 实践

背景 &#x1f4a1; 想法源于在一次 Code Review 时&#xff0c;向 Claude 询问哪种写法代码更优雅得来。当时就想能不能让 AI 帮我们辅助做 Code Review&#xff1f; 痛点 信息安全合规问题&#xff1a;公司内代码直接调 ChatGPT / Claude 会有安全/合规问题&#xff0c;为了…

HR招聘,如何解决面试流程繁琐的问题

要解决面试流程繁琐的问题&#xff0c;就必须要精简和优化招聘流程。比如精简面试环节&#xff0c;制定标准化流程&#xff0c;完善信息管理&#xff0c;对面试环节进行细致梳理之后&#xff0c;尽快识别并去除那些不必要的步骤&#xff0c;这样就能够减少求职者的等待时间&…

零成本搭建个人 APP 和小程序后台

前言 前面也说了&#xff0c;通过 GitHub PagesGitHub Actions 只是解决了动态数据展示&#xff0c;但是要零成本得完成将用户信息存储下来&#xff0c;并实现数据交互呢&#xff1f; 我开始是想用云文档&#xff0c;种种原因&#xff0c;我还是希望有个自己能二次修改的后台…

动态网格交易、科创板做市、股票 CTA……DolphinDB 中高频策略回测实例之股票篇

股票中高频交易是量化交易的重要分支&#xff0c;其核心在于在极短时间内处理大量市场数据&#xff0c;执行多笔交易&#xff0c;从而捕捉细微的价格波动并获取利润。中高频交易策略的成功依赖于精准的算法设计、低延迟的交易系统以及交易程序强大的数据分析能力。作为实盘操作…

【系统架构设计】设计模式

【系统架构设计】设计模式 设计模式概述GoF设计模式Factory MethodAbstract Factory &#xff08;*&#xff09;BuilderPrototype(原型)Singleton&#xff08;*&#xff09;AdapterBridgeComposite(组合)Decorator(装饰)&#xff08;*&#xff09;Facade(外观)&#xff08;*&am…

恢复指定人微信聊天记录,看这里,4种方法帮您找回记录

微信在今天成为了我们日常生活中不可或缺的一部分&#xff0c;它承载着我们的社交、工作乃至生活的点点滴滴。然而&#xff0c;有时出于各种原因&#xff0c;我们可能会选择注销微信账号&#xff0c;但随后又可能因种种原因希望恢复其微信进行使用。那么&#xff0c;微信注销了…

CSS溢出——WEB开发系列20

在网页设计中&#xff0c;“溢出”是一个常见且重要的概念。它涉及到如何处理那些超出预定范围的内容&#xff0c;以确保网页的布局和视觉效果达到预期。 一、什么是溢出&#xff1f; 在 CSS 中&#xff0c;“溢出”&#xff08;overflow&#xff09;指的是内容超出其包含块的…

构建高效NLP管道:PydanticOutputParser与Langchain的结合

PydanticOutputParser 是一个用于解析语言模型输出的实用工具&#xff0c;它允许用户指定一个 Pydantic 模型&#xff0c;并查询语言模型以生成符合该模型的 JSON 输出。这个工具特别有用&#xff0c;因为它可以帮助开发者确保从语言模型获得的结构化数据符合预期的格式&#x…

全面解析:四大LLM模型——预训练与后训练的新范式

导读 最初&#xff0c;大语言模型LLM的训练过程只关注于预训练&#xff0c;但如今已经扩展到包含预训练和后训练两个阶段。后训练通常包括监督指令微调和对齐&#xff0c;这一方法在ChatGPT发布后广泛流行&#xff01; 翻译自:https://magazine.sebastianraschka.com/p/new-l…

NAT网关产品手册

产品用途 SG-NAT-410 网关支持 IP 地址跨网段和通讯端口的转换&#xff0c;为不方便修改参数的以太网通讯设备的信息化联网提供便捷的解决方案。网关有 1 个两口以太网交换机接口(LAN 口 ) 和 1 个单口以太网通讯接口 (WAN 口 ) 。不对原系统做任何硬件和软件修改&…

WAF一般是怎么防御SQL注入的

目录 参数化查询在防止SQL注入中起到什么作用&#xff1f; 为什么要限制数据库用户权限来预防SQL注入&#xff1f; WAF是如何检测SQL注入特征的&#xff1f; WAF防范SQL注入的主要策略包括&#xff1a; 参数化查询和预编译语句&#xff1a;使用参数化查询或预编译语句可以确…

虚拟试穿技术分享

虚拟试穿技术&#xff0c;通过计算机视觉和人工智能&#xff0c;允许用户在数字界面上试穿服装&#xff0c;无需实际穿戴。这项技术广泛应用于电子商务和时尚工业&#xff0c;使得消费者可以在购买前预览衣物在自己身上的样子。 基于扩散的方法&#xff1a;这种方法使用基于图像…

微波网络分析仪VNA原理详解:电磁波测量基础-测试狗科研测试

微波网络分析仪VNA原理详解&#xff1a;电磁波测量基础 微波网络分析仪&#xff08;Vector Network Analyzer&#xff0c;简称VNA&#xff09;是一种用于测试和测量微波频段元件和网络特性的电子测试设备。 一、电磁波 电磁波是由电场和磁场相互垂直并相互依赖振荡传播的波动现…

餐饮商标怎么注册自己的品牌!

餐饮行业是创业者选的比较多的行业&#xff0c;也有许多人从小做起&#xff0c;成为当地知名品牌&#xff0c;那企业或个体户如何注册餐饮行业的商标。 在餐饮行业首先是申请注册类别43类餐饮住宿&#xff0c;这个是餐饮的核心类别&#xff0c;开店、饭店都在这个类别&#xf…

学习之adb命令

adb命令作用&#xff1a; 用来操作手机系统的 类似于window的cmd,linux的bash 如果添加环境变量的adb不能识别设备通常是因为存在两个不同的版本 如下&#xff1a; adb devices 如果没有发现&#xff0c;可以尝试手动连接设备 需要先执行 adb kill-server adb start-server …