旋转图像(旋转矩阵)

这篇具有很好参考价值的文章主要介绍了旋转图像(旋转矩阵)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

声明

该系列文章仅仅展示个人的解题思路和分析过程,并非一定是优质题解,重要的是通过分析和解决问题能让我们逐渐熟练和成长,从新手到大佬离不开一个磨练的过程,加油!

原题链接

旋转图像备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/rotate-image/

算法分析

        若矩阵的行列数为N,设i表示行索引,i属于[1,N],按照题意旋转矩阵则可以理解为我们需要将第i行的所有元素转换为第N-i+1列,如示例1所示,第1行为[1,2,3],旋转后的第1行则变成了第3列,第2行与第3行同样如此。

旋转图像(旋转矩阵),算法探索,算法
图(1)
旋转图像(旋转矩阵),算法探索,算法
图(2)

        PS:经现有测试该方法适用于行列数相同的矩阵,但不确定是否适用于行列数不同的矩阵。

        如图(1)索引分别为(0,0),(0,1),(0,2),(0,3),(1,3),(2,3),(3,3),(3,2),(3,1),(3,0),(2,0),(1,0)的点围成了一个圈,假设我们称之为矩阵圈。那么由外向内我们依次称为第1层矩阵圈,第2层矩阵圈,……第n层矩阵圈。图(1)所示有两个矩阵圈,第1层矩阵圈的索引集合为[(0,0),(0,1),(0,2),(0,3),(1,3),(2,3),(3,3),(3,2),(3,1),(3,0),(2,0),(1,0)],第2层矩阵圈的索引集合为[(1,1),(1,2),(2,2),(2,1)]。

        如图(1)和图(2)我们可以发现通过对每个矩阵圈的旋转即可完成对整个矩阵的旋转,而对矩阵圈的旋转实际上就是对矩阵圈进行点交换。点交换的意思是交换矩阵圈四个边上的点,并且每个点是相互对应的。

        如图(3)所示,第一次交换索引为(0,0)和索引为(0,3)的点,第二次交换索引为(0,0)和索引为(3,3)的点,第三次交换索引为(0,0)和索引为(3,0)的点,我们把这称为矩阵圈的点交换。而这仅仅是矩阵圈的第一次点交换,假设该矩阵圈的行数和列数均为m,那么旋转该矩阵圈则需要(m-1)次点交换。

旋转图像(旋转矩阵),算法探索,算法
图(3)
旋转图像(旋转矩阵),算法探索,算法
图(4)
旋转图像(旋转矩阵),算法探索,算法
图(5)
旋转图像(旋转矩阵),算法探索,算法
图(6)

        图(3)(4)(5)(6)则为该矩阵圈的一次完整的90°旋转。

        为了从定量角度分析这个规律。首先我们可以定义四个变量rowA,rowB,colA,colB分别表示每一个矩阵圈的首行尾行以及首列尾列,并对它们进行初始化,rowA=0,rowB=m-1,colA=0,colB=m-1,rowA指向当前矩阵圈第一行,rowB指向最后一行,colA指向当前矩阵圈第一列,colB指向最后一列。其次我们再定义一个变量count,表示当前矩阵圈需要进行点交换的次数,count属于[1,m-1]。那么该矩阵圈进行点交换的四个点的索引分别为:

(rowA,colA+count-1),  (rowA+count-1,colB),

(rowB,colB-count+1),  (rowB-count+1,colA)

        我们只需要按照(rowA+count-1,colB),(rowB,colB-count+1),(rowB-count+1,colA)的索引顺序分别与索引为(rowA,colA+count-1)的点进行交换即可,每完成一次点交换则count进行+1操作,当count等于m-1时表示该矩阵圈的90°旋转完成。所以接下来需要收缩rowA,rowB,colA,colB四个变量,从而指向下一层矩阵圈,收缩操作即对rowA和colA进行+1操作,对rowB和colB进行-1操作,重复上述过程从外向内旋转矩阵圈直至rowA、rowB、colA、colB四个变量的值相等则表明整个矩阵完成了90°的旋转。

代码示例(C#) 
public void Rotate(int[][] matrix)
{
    //定义变量
    int rowA = 0, rowB = matrix.Length - 1, colA = 0, colB = matrix[0].Length - 1, count = 1;
    //逻辑主体
    while (count <= colB - colA)
    {
        //矩阵点交换
        (matrix[rowA][colA + count - 1], matrix[rowA + count - 1][colB]) = (matrix[rowA + count - 1][colB], matrix[rowA][colA + count - 1]);
        (matrix[rowA][colA + count - 1], matrix[rowB][colB - count + 1]) = (matrix[rowB][colB - count + 1], matrix[rowA][colA + count - 1]);
        (matrix[rowA][colA + count - 1], matrix[rowB - count + 1][colA]) = (matrix[rowB - count + 1][colA], matrix[rowA][colA + count - 1]);
        //矩阵圈收缩
        if (count == colB - colA)
        {
            colA++;
            colB--;
            rowA++;
            rowB--;
            count = 1;
        }
        else count++;
    }
}
算法解说 

        结合算法分析过程,我们将矩阵的旋转转换为矩阵圈的旋转,然后将矩阵圈的旋转转换为矩阵点的交换,也就是说矩阵旋转的本质就是矩阵中各个元素的交换,实际上我们从图(1)和图(2)就可以发现,转换前的矩阵的第一行变成了转换后的矩阵的最后一列,但是本文的解题思路并未采取这种方式。

       由于每个矩阵圈都有四条边,所以旋转矩阵圈就是在交换四个边上指定的元素,具体的思路算法分析中已经描述得比较详尽,对于如何将分析过程转换为代码,对于多数算法题来说本质上都是明确两个重点,一个是变量,一个是逻辑主体。本题中所用到的变量包括用于明确当前矩阵圈的四个指针,还有一个用于记录当前矩阵圈进行点交换的次数。而逻辑主体则包括矩阵点交换和矩阵圈收缩,同时需要明确逻辑主体退出的条件。文章来源地址https://www.toymoban.com/news/detail-645849.html

到了这里,关于旋转图像(旋转矩阵)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Halcon用矩阵实现图像变换(平移,旋转,缩放,镜像等)

    目录 图像变换介绍  用Halcon自带的算子实现图像变换 使用矩阵来实现相关算子的功能 一、平移 二、旋转 三、缩放 四、镜像 完整代码         在halcon中经常会用到图像变换的操作,然后这次作业是用矩阵来实现相关算子的功能,学到了挺多的所以就记录下来方便复习。

    2024年04月17日
    浏览(42)
  • LeetCode in Python 48. Rotate Image/Matrix (旋转图像/矩阵)

    旋转图像/矩阵的重点是寻找旋转前后对应位置的坐标关系。 示例: 图1 旋转图像/矩阵的输入输出示意图  代码:  解释: 1)外层循环控制需要转的大圈圈数,内层循环控制每一圈需要转的小圈圈数,大小圈数的解释见图2,例如n=4,需要循环n // 2 = 2大圈,其中黄色循环箭头

    2024年04月27日
    浏览(62)
  • LeetCode 热题 100(四):48. 旋转图像、240. 搜索二维矩阵 II、234. 回文链表

    题目要求:就是一个顺时针的旋转过程。  思路:观察矩阵,得出翻转前第i行的第J个元素  等于  翻转后倒数第i列的第J个元素,举例说明,第1行第2个元素为“2”,翻转后到了 倒数第1列的第2个元素。说白了只需要针对翻转前的第i行和翻转后的倒数第i列 代码: 题目要求

    2024年02月11日
    浏览(36)
  • 【算法Hot100系列】旋转图像

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年01月18日
    浏览(42)
  • 图像处理:手写实现图像增广算法(旋转、亮度调整、裁剪与拼接)

    目录 前言 算法理论 基础实现 a.旋转 b.亮度调整 c.裁剪及拼接 随机调整参数 d.随机翻转算法 e.随机颜色明暗调整算法 f.随机裁剪算法 实验分析 本章小结 参考文章 图像增广算法在计算机视觉领域扮演着至关重要的角色。随着深度学习的兴起,大规模数据集的需求变得更加迫

    2024年02月05日
    浏览(58)
  • 算法leetcode|48. 旋转图像(rust重拳出击)

    给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。 请不要 使用另一个矩阵来旋转图像。 n == matrix.length == matrix[i].length 1 = n = 20 -1000 = matrix[i][j] = 1000 面对这道算法题目,二当家

    2024年02月01日
    浏览(95)
  • 【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值

    《博主简介》 小伙伴们好,我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌ 更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍 感谢小伙伴 们点赞、关注! class   Solution :      def   mySqrt ( self ,  x :   int )   -   int :       

    2024年02月04日
    浏览(65)
  • 计算机视觉 | 基于二值图像数字矩阵的距离变换算法

    Hi,大家好,我是半亩花海。 本实验基于 OpenCV 实现了二值图像数字矩阵的距离变换算法。首先生成一个 480x480 的黑色背景图像(定义黑色为0,白色为1),在其中随机选择了三个白色像素点作为距离变换的原点,利用 OpenCV 中 distanceTransform 等相关函数计算并输出这些原点到其

    2024年04月11日
    浏览(45)
  • 图像加密——matlab实现Arnold置乱算法及矩阵幂的求解

    xn,yn表示像素在原图像中的坐标,xn+1,yn+1表示变换后的像素坐标,a,b为参数,均为正整数且都小于N,变换矩阵行列式满足∣A∣=1,则 可逆 。因此如下为逆置乱公式: 由此可以看到,只要知道参数ab且知道变换次数的情况下,才能让置乱后的图像复原。 逆置乱可以让图像复原

    2023年04月08日
    浏览(50)
  • [七]【开源】基于PyQt的图像算法开发软件——手动图像配准[通过可交互的四个点构建仿射矩阵]

    [一] 【开源】基于PyQt的图像算法开发软件——如何让你开发效率翻倍 [二] 【开源】基于PyQt的图像算法开发软件——输入来源[如何导入视频进行目标检测] [三] 【开源】基于PyQt的图像算法开发软件——步骤列表[低代码实现图像算法开发] [四] 【开源】基于PyQt的图像算法开发

    2024年02月22日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包