图像几何变换笔记

news2024/12/22 4:17:57

图像缩放

        图像缩放是指对图像大小进行调整,对原图进行放大或缩小。图像缩放一般通过插值采样来实现。

        常见的插值方法:最近邻插值、双线性插值、双三次插值。

最近邻插值

        最近邻插值是最简单的一种插值方法,通过映射将原始图片中的像素值映射到放大(或者缩小)后的图片中的每一个位置上即可,而不需要通过计算来得到放大后图片中的每一个像素值。

        其原理很简单,看下面这张图应该就很清晰了。

         最近邻插值计算像素位置的方法如下:

        X_{src} = X_{dst}/ {(src_{width}/dst_{width})}

        Y_{src} = Y_{dst} / {(src_{height}/dst_{height})}        

        X_{src},Y_{src} : 原图的像素点坐标

        X_{dst},Y_{dst}: 缩放后的图中的像素点坐标

        最近邻插值比较简单,但缩放后的图片质量不高。

双线性插值

        双线性插值用原图像中4(2*2)个像素点计算新图像中的1个像素点,效果比双三次插值稍差,但性能比双三次插值要好,属于比较均衡的一种插值方法。

         如上图所示,P点是我们要计算像素值的点,双线性插值首先在水平方向上计算出R1和R2点的值,然后在垂直方向上根据R1,R2计算出P点的值。用数学表达式对应过程如下:

        f(R_1) = \frac{x_2 - x}{x2 - x1}f(Q_{11}) + \frac{x - x1}{x2 - x1}f(Q21)

        f(R_2) = \frac{x_2 - x}{x2 - x1}f(Q_{12}) + \frac{x - x1}{x2 - x1}f(Q22)

        f(P) = \frac{y_2 - y}{y2 - y1}f(R_{1}) + \frac{y - y_1}{y2 - y1}f(Q21)

        其中点P坐标为(x,y),Q11坐标为(x1,y1),Q12坐标为(x2,y1),Q21坐标为(x1,y2),Q22坐标为(x2,,y2)。从公式看计算过程很直白,可以理解为R1,R2的像素值是根据点P在水平方向上相对于左右两个点的水平距离为权计算出来的结果。然后再计算出P在垂直方向上相对于R1,R2两个点垂直距离为权计算出来的结果(距离越近权重越大)。

        综合上面几个式子,可以得出最后P点像素值为:

        f(P) = \frac{y_2 - y}{y2 - y1} *[ \frac{x_2 - x}{x2 - x1}f(Q_{11}) + \frac{x - x1}{x2 - x1}f(Q21)] + \frac{y - y_1}{y_2 - y_1}*[ \frac{x_2 - x}{x2 - x1}f(Q_{12}) + \frac{x - x1}{x2 - x1}f(Q22)]

        整理可得:

        f(P) = \frac{f(Q11)}{(x_2 - x_1)(y_2 - y_1)} * (x_2 - x)(y_2 - y) +\frac{f(Q21)}{(x_2 - x_1)(y_2 - y_1)} * (x - x_1)(y_2 - y) + \frac{f(Q12)}{(x_2 - x_1)(y_2 - y_1)} * (x_2 - x)(y - y_1) +\frac{f(Q22)}{(x_2 - x_1)(y_2 - y_1)} * (x - x_1)(y - y_1)

        在数字图像中,实际应用中取的点是四个相邻的点,因此x2 - x1 = 1, y2 - y1 = 1,因此上式的所有分母都是1。在opencv中,双线性插值实际做了一定调整,做了中心对齐:

        src_x=(dst_x+0.5)* (src_{width}/dst_{width}) -0.5

        src_y=(dst_y+0.5) * (src_{height}/dst_{height})-0.5

        想要详细了解为何这么做,可以参考这里:

双线性插值算法_ABC_Orange的博客-CSDN博客1、线性插值的解释单线性插值法双线性插值法2、另一位牛人讲的比较易懂1.双线性插值2.存在的问题3、又是另一位讲的通俗易懂1,原理2,计算方法3,加速以及优化策略3.1 源图像和目标图像几何中心的对齐  3.2 将浮点运算转换成整数运算4,代码1、线性插值的解释双线性插值,又称为双线性内插。在数学上,双线性插值是有两个变量的插值函数的线性插..._双线性插值https://blog.csdn.net/ABC_ORANGE/article/details/104124928

双三次插值

        双三次(Bicubic)插值又称立方卷积插值,是一种更复杂的插值方法。该算法使用待采样点周围16个点的灰度值作三次插值。三次运算可以得到更接近高分辨率图像的放大效果,但运算量也急剧增加。

        双三次插值的像素值计算公式为:

        从公式可以看出,如果对应代码,上面的式子就相当于二重循环。双三次插值的“双”的意思是对一个4x4大小的像素格子在X和Y两个方向上进行采样。“三次”指的是计算权重的时候,所选用的公式是一个三次多项式。

        双三次插值的权重计算函数为:

                权重函数中:|x|表示的是目标像素点距离某个临近像素点的距离;a是一个经验值,一般取-0.5或-0.75。权重函数的图像大致如下:

        看下面这幅图:

         假设我们要放大原图,source image为原图,destination image为放大后的图。对于目标图中的某个像素点坐标,我们要计算它的像素值,首先就是先找到在原图中它所对应的参考像素点的位置。这里相当于是将目标图缩放到了原图的尺寸下,这样就确定了目标图中像素点计算的时候所对应的原图参考像素点的中心位置。这个步骤和双线性插值是类似的。

        接下来我们以找到的点的位置作为中心点,取出周围16个点的像素值进行插值计算。由于整个计算的重点是对于x和y方向上的权重计算,我们以下面两幅图细化来看权重值的计算:

         图中黄色点为中心点,蓝色点是举例用的两个像素点。上下两个图分别展示了两个不同的像素点(蓝色)的权重计算(对中心点像素值的贡献),其中a = -0.75。

        计算出权重后,我们就可以计算中心点的像素值了,参考下图:

        参考:

        插值算法 | 双三次插值算法_哔哩哔哩_bilibili

图像平移

        图像的平移原理很简单,计算公式如下:

        x' = x + x_0\ ,\ y' = y + y_0

        x'和y'是移动后的点的位置,x_0,y_0是移动的偏移量。在实际应用中,通常用一个矩阵来表示这种变换,通过矩阵和向量相乘得到目标位置向量(齐次坐标),矩阵为:

        在OpenCV中,平移的API所需要的平移矩阵参数是一个2*3的矩阵:

图像旋转

        图像旋转操作是通过一个旋转矩阵变换实现的。旋转矩阵定义(齐次坐标形式)为:

         对于这个矩阵的推导,网上有很多版本,在这里我也来尝试用极坐标推导一下(任意点P,非齐次坐标)。

         如上图,图中点P是没有旋转前的位置,P'是P点旋转角度\theta后的位置。P点的坐标(x0,y0)写成极坐标的形式为:

         (x_0,y_0) = (rcos\theta_0,rsin\theta_0)

        旋转\theta后的点P'极坐标为:

        (x_1,y_1) =(rcos(\theta_0 + \theta), rsin(\theta_0 + \theta))

        用三角函数的和角公式展开可得:

        x_1 = rcos\theta_0cos\theta - rsin\theta_0sin\theta = x_0cos\theta - y_0sin\theta

        y_1 = rsin\theta_0cos\theta + rcos\theta_0sin\theta = x_0sin\theta + y_0cos\theta

        这两个式子其实可以看做是两个变量的线性方程组:

        x_0cos\theta - y_0sin\theta = x_1

        x_0sin\theta + y_0cos\theta = y_1

        这两个线性方程组,写成矩阵方程的形式就是:

        \begin{bmatrix} cos\theta & -sin\theta\\ sin\theta & cos\theta \end{bmatrix} \begin{bmatrix} x_0\\ y_0 \end{bmatrix} = \begin{bmatrix} x_1\\ y_1 \end{bmatrix}

        由此我们可以得到2x2的旋转矩阵就是

        \begin{bmatrix} cos\theta & -sin\theta\\ sin\theta & cos\theta \end{bmatrix}

图像仿射变换

        图像仿射变换涉及图像的形状、位置、角度的变化,可以理解为图像缩放、旋转、翻转和平移等操作的组合。

        以下图为例:

         左图中的点1,2,3和右图中的点是一一对应的,经过映射后的点仍然构成三角形,但三角形的形状发生了较大的改变。这个映射就对应了仿射变换。

        OpenCV中,仿射变换是一个2*3的矩阵:

         

        A是线性变换矩阵,B是平移矩阵。对于任意一个点(x,y),仿射变换的计算方式为:

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

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

相关文章

【数据结构与算法】哈希表设计(C\C++)

实践要求 1. 问题描述 针对某个集体中人名设计一个哈希表,使得平均查找长度不超过R,并完成相应的建表和查找程序。 2. 基本要求 假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数用除留…

C++——string(2)

作者:几冬雪来 时间:2023年7月7日 内容:C——string内容讲解 目录 前言: 1.string: 1. reserve: 2.resize: 3.assign: 4.insert: 5.erase: 6.rep…

策略模式深度实践——通用的HTTP接口调用

个人主页:金鳞踏雨 个人简介:大家好,我是金鳞,一个初出茅庐的Java小白 目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作 我的博客&am…

【CSS卡片翻转特效】CSS3实现3D旋转动画卡片翻转效果(附源码)

文章目录 写在前面涉及知识点效果展示1、web页面的搭建1)创建dom节点2)DOM元素添加图片3)添加翻转后的文字 2、CSS效果的实现1)div本身翻转效果2)3D翻转效果完整CSS3实现翻转效果demo代码可以留言邮箱或者自己去百度网…

扒开 TCP 的外衣,看清 TCP 的本质

TCP 非常重要,它的内容很多,今天只能讲解其中的一部分,但足以让你超越 80 % 的编程开发人员对于 TCP 的认知。 本篇内容非常多,非常干,希望你花点时间仔细研究,我相信会对你有所帮助。 1. TCP 协议是什么…

【tomcat】应用服务

准备环境 三台虚拟机 192.168.1.120 192.168.1.122 192.168.1.131 三台虚拟机关闭防火墙 、查看光盘 、检测yun创库 查看JDK是否安装 [rootlocalhost ~]# java -version openjdk version "1.8.0_161" //这是系统自带的rpm方式安装 OpenJDK Runtime Environment…

云端刺点难?这次看看云端地球怎么做

了解像控点与刺点 像控点是直接为摄影测量的控制点加密或测图需要而在实地布设并进行测定的控制点。 刺像控点是把外业采集的像控点的地理坐标与看到这个点的照片相关联的过程。在倾斜摄影建模中,使用像控点进行刺点可以大大提高建模精度。 为什么云端地球可以做…

青岛大学_王卓老师【数据结构与算法】Week04_02_带尾结点的循环链表合并_学习笔记

本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享,另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权,请留言作删文处理。 课程视频链接: 数据结构与算法基础–…

LLM搭建金融系统

背景: 这篇文章主要给大家介绍如何基于LLM模型配合各种pluging工具(这边主要是跟数据连接、检索的工具相关:知识图谱、向量库...)。在开始文章前先讲讲我的观点:大模型的颠覆性应用应该不在于AIGC,而在于数据驱动技术…

python验证公网ip与内网ip

公网IP和内网IP都是用于标识网络设备的地址,但它们有着不同的作用和特点。 公网IP是由互联网服务提供商(ISP)分配给用户设备的唯一标识符。它是全球范围内唯一的,并且可以被其他网络设备使用来寻找和连接特定的设备。公网IP通常用…

Linux操作系统中命令提示符最后的符号为“#”或“$”

07-Linux操作系统中命令提示符最后的符号为“#”或“$” 1、最后提示符“#”2、最后提示符“$”3、[lwhlocalhost~]中 “ ~” 1、最后提示符“#” 表示管理员身份2、最后提示符“$” 表示不同用户3、[lwhlocalhost~]中 “ ~” 表示当前用户的家目录

安装umi

安装umi 一、安装Node.js,通过node -v查看版本号 二、安装yarn,其中tyarn使用的是npm.taobao.org的源,速度要快一些(可以把yarn看做优化了的npm) 1. 安装tyarn npm i yarn tyarn -g1 -g:全局安装 2. …

【C++】用Ceres从三维点中拟合三维空间中的圆

任务描述 在三维空间中有N个点,需要得到过这N个点的最优圆,需要估计圆的圆心、半径和法向量,本文提供了一种方法和代码示例,利用Ceres进行非线性拟合,在cpp上开发。 圆心为三维,半径一维,法向…

深入刨析容器(四):深入理解容器镜像

容器通过Namespace和Cgroups将自己与宿主机隔离,那么容器里的进程看到文件系统又是什么样子的呢?容器里的程序应该看到完全独立的文件系统,这样它就可以在自己的容器目录(比如 /tmp)下进行操作,而完全不会受…

贝莱德CEO力挺比特币!币圈嘲讽:传统金融从嘲笑到开始入场了!

资产管理巨头贝莱德(BlackRock)首席执行官Larry Fink公开喊话,希望监管者以民主化方式,来看待现货ETF申请。将与监管积极配合,解除他们对现货比特币ETF的疑虑。 六月中旬,贝莱德向美国证券交易委员会&#…

vue3中Cron表达式的使用

效果&#xff1a; <a-form-item label"Cron表达式" name"cron" required><a-input v-show"false" v-model:value"setForm.cron"></a-input><a-button type"primary" size"small" click"…

使用NVCleanstall导致显卡功率被锁至115W问题解决

以拯救者Y9000K为例&#xff0c;显卡功耗最大可以达到165W&#xff0c;但最近更新至最新的显卡驱动后&#xff0c;发现显卡功率被限制到了115W。一度怀疑是老黄做了手脚。 经过一系列测试后发现&#xff0c;是自己操作姿势不对。 NVIDIA Platform Controllers and Framework这…

leetcode极速复习版-第四章字符串

目录 344. 反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.翻转字符串里的单词 剑指Offer58-II.左旋转字符串 28.实现 strStr() 459.重复的子字符串 字符串总结 344. 反转字符串 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 char…

JAVA jfreechart生成柱状图

JAVA jfreechart生成柱状图 在项目资源评估中&#xff0c;也就是生成word文档里需要根据数据生成柱状图&#xff0c;在网上找到了jfreechart工具包&#xff0c;来生成柱状图&#xff0c;当然他不仅仅只能生成柱状图&#xff0c;还支持折线图、饼状图等等… 过程 导入依赖 &l…

快速创建剪映草稿

实现原理 : JianYingPro 项目文件是 json 的形式存储的,只需要创建draft_content.json,draft_mate_info.json 打开软件后会自动补全。添加一个媒体到轨道顺序 草稿媒体库 -> 内容媒体库-> 轨道片段add_media_to_track 会识别媒体类型,加入到对应轨道。当没有视频轨道时…