图像旋转

这个图像的旋转,即矩阵的操作,和左神讲的旋转打印矩阵及其改编题型很相似,异曲同工!

//题目描述
//
//有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),
//将图像顺时针旋转90度。
//给定一个NxN的矩阵,和矩阵的阶数N, 请返回旋转后的NxN矩阵, 保证N小于等于500,图像元素小于等于256。
//测试样例:
//[[1, 2, 3], [4, 5, 6], [7, 8, 9]], 3
//返回:[[7, 4, 1], [8, 5, 2], [9, 6, 3]]

#include<iostream>
using namespace std;
#include<vector>
class Transform {
public:
    vector<vector<int> > transformImage(vector<vector<int> > mat, int n) {
        // write code here
        //转置的实现
        /*for (size_t i = 0; i < mat.size(); i++)
        {
            for (size_t j = 0; j < n; j++)
            {
                int temp = mat[i][j];
                mat[i][j] = mat[j][i];
                mat[j][i] = temp;
            }
        }*/

        /* 思路:逐层旋转,最外层向内,其中layer表示当前所处理的层,每次都是n*n矩阵中可以形成方阵中的四个数进行旋转,
                 左->上,下->左,右->下,上->右的顺序,在第一步之前先存储“上”中的值*/
        //for (int layer = 0; layer < n / 2; layer++){
        //    int first = layer;
        //    int last = n - 1 - layer;
        //    for (int i = first; i < last; i++){    //每层内部的数据变换方法
        //        int offset = i - first;
        //        int top = mat[first][i];
        //        //left -> top
        //        mat[first][i] = mat[last - offset][first];
        //        //bottom -> left
        //        mat[last - offset][first] = mat[last][last - offset];
        //        //right -> bottom
        //        mat[last][last - offset] = mat[i][last];
        //        //top -> right
        //        mat[i][last] = top;
        //    }
        //}

        /*思路:和上面一样
            把矩阵想成一个洋葱,一圈包着一圈,外一圈每一条边比里一圈每一条边长度多2,每一条边只有边长度 - 1个元素需要覆盖另一条边的对应元素,
            因为每一条边与相邻两条边相交,一条边第一个元素旋转90度其实覆盖的是这一条边的最后一个元素,也是相邻边的第一个元素。*/
        /*int temp;
        for (int i = 0; i<n / 2; i++){   //分层
            for (int j = i; j<n - 1 - i; j++){
                temp = mat[i][j];
                mat[i][j] = mat[n - j - 1][i];
                mat[n - j - 1][i] = mat[n - i - 1][n - j - 1];
                mat[n - i - 1][n - j - 1] = mat[j][n - i - 1];
                mat[j][n - i - 1] = temp;
            }
        }*/

        //先列变换,在次对角线对称交换   或者 先次对角线交换,在行变换
        int i, j, temp = 0;
        //左右列交换
        for (i = 0; i<n; i++)
        {
            for (j = 0; j<n / 2; j++)
            {
                temp = mat[i][j];
                mat[i][j] = mat[i][n - 1 - j];
                mat[i][n - 1 - j] = temp;
            }
        }
        //每条对角线对称交互
        for (i = 0; i<n; i++)
        {
            for (j = 0; j<n - i; j++)
            {
                temp = mat[i][j];
                mat[i][j] = mat[n - 1 - j][n - 1 - i];
                mat[n - 1 - j][n - 1 - i] = temp;
            }
        }
        return mat;
    }
};
时间: 2024-10-11 21:10:09

图像旋转的相关文章

每日算法之三十七:Rotate Image (图像旋转)

You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). Follow up: Could you do this in-place? 原地图像顺时针旋转90度.因为要求空间复杂度是常数,因此应该迭代旋转操作. class Solution { public: void rotate(vector<vector<int> > &mat

opencv-从图像旋转学习Mat数据访问

先看一个简单的例子 代码: // ConsoleApplication3_6_23.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include<opencv2/opencv.hpp> #include<iostream> #include<vector> using namespace std; using namespace c

使用OpenCL+OpenCV实现图像旋转(一)

[题外话]近期申请了一个微信公众号:平凡程式人生.有兴趣的朋友可以关注,那里将会涉及更多更新OpenCL+OpenCV以及图像处理方面的文章. 最近在学习<OPENCL异构计算>,其中有一个实例是使用OpenCL实现图像旋转.这个实例中并没有涉及读取.保存.显示图像等操作,其中也存在一些小bug.在学习OpenCL之初,完整地实现这个实例还是很有意义的事情. 1.图像旋转原理 所谓图像旋转是指图像以某一点为中心旋转一定的角度,形成一幅新的图像的过程.这个点通常就是图像的中心. 由于是按照中心旋

图像旋转的原理

图像旋转是指图像以某一点为中心旋转一定的角度,形成一幅新的图像的过程.当然这个点通常就是图像的中心.既然是按照中心旋转,自然会有这样一个属性:旋转前和旋转后的点离中心的位置不变. 根据这个属性,我们可以得到旋转后的点的坐标与原坐标的对应关系.由于原图像的坐标是以左上角为原点的,所以我们先把坐标转换为以图像中心为原点.假设原图像的宽为w,高为h,(x0,y0)为原坐标内的一点,转换坐标后的点为(x1,y1).那么不难得到: x1 = x0 - w/2; y1 = -y0 + h/2; 在新的坐标系

【OpenCV】图像旋转详解,边缘用黑色填充

项目要用到图像旋转,OpenCV里面居然没有专门封装好的函数,只好自己写了.根据<learnning OpenCV>发现效果不是很理想,旋转后图像大小不变,可是图像却被裁减了. 例子如下: int main( int argc, char** argv ) { IplImage* src=cvLoadImage("C:\\Users\\Liu\\Desktop\\bridge.bmp",1); IplImage* dst = cvCloneImage( src ); int

用OpenCV实现Photoshop算法(一): 图像旋转

最近学习了OpenCV,于是想用它实现Photoshop的主要功能,用于照片处理. 对于一张照片,PS的一般处理步骤包括: 1, 旋转图片,校正位置. 2,剪切,调整大小,重新构图. 3,调整色阶.曲线,使图片曝光正确.对比适中. 4,调整对比度.饱和度 5,印章去掉不想要的东西,液化调整形体线条 6,对于人像图片,美肤.美白 7, 用色彩平衡.可选颜色等调整色调,形成照片调性 8,加一些光效 9,锐化 以后的一系列博文将采用OpenCV逐一实现Photoshop的算法和功能, 并用计算机视觉人

图像旋转算法

图像旋转是指把定义的图像绕某一点以逆时针或顺时针方向旋转一定的角度,通常是指绕图像的中心以逆时针方向旋转. 假设图像的左上角为(left, top),右下角为(right, bottom),则图像上任意点(x0, y0)绕其中心(xcenter, ycenter)顺时针旋转θ角度后,新的坐标位置(x′, y′)的计算公式为: xcenter = (right - left + 1) / 2 + left;ycenter = (bottom - top + 1) / 2 + top;x′ = (x

C/C++ BMP(24位真彩色)图像处理(4)------图像の旋转

历经一个多月,CSDN貌似终于好像把文章列表阅读量信息归零BUG给修好了,于是乎放篇做期末大作业时写的文章上来测测效果,可别又像上次一样一发文章就又坑爹了啊! 本篇谈的是图像的旋转,不算是什么新鲜的题目了.但是现在由于很多工具如MATLAB.OPENCV等都把算法写好给用户调用,导致大多用户只知其然不知其所以然,所以回顾一下也是好的. 图像的旋转,说到底就是每个像素点绕着某个圆心旋转一定角度.如果是写代码的话,旋转的角度和圆心应该是已知的条件,我们第一个思路是根据已知条件求取出图像经过旋转后的新

图像旋转算法的实现

上一篇转载的文章(http://blog.csdn.net/carson2005/article/details/36900161)介绍了图像旋转的原理,这里给出代码实现,具体原理请参考上面的链接: 实现代码: void ImgRotate(cv::Mat imgIn, float theta, cv::Mat& imgOut) { int oldWidth = imgIn.cols; int oldHeight = imgIn.rows; // 源图四个角的坐标(以图像中心为坐标系原点) fl

百练-16年9月推免-C题-图像旋转

C:图像旋转 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 输入一个n行m列的黑白图像,将它顺时针旋转90度后输出. 输入 第一行包含两个整数n和m,表示图像包含像素点的行数和列数.1 <= n <= 100,1 <= m <= 100.接下来n行,每行m个整数,表示图像的每个像素点灰度.相邻两个整数之间用单个空格隔开,每个元素均在0~255之间. 输出 m行,每行n个整数,为顺时针旋转90度后的图像.相邻两个整数之间用单个空格隔开. 样