图像旋转的原理与实现

图像旋转的原理与实现

一般图像的旋转是以图像的中心为原点,旋转一定的角度,也就是将图像上的所有像素都旋转一个相同的角度。旋转后图像的的大小一般会改变,即可以把转出显示区域的图像截去,或者扩大图像范围来显示所有的图像。图像的旋转变换也可以用矩阵变换来表示。设点逆时针旋转角后的对应点为。那么,旋转前后点的坐标分别是:

                          (3-6)

  (3-7)

写成矩阵表达式为

            (3-8)

其逆运算为

            (3-9)

利用上述方法进行图像旋转时需要注意如下两点:

(1)图像旋转之前,为了避免信息的丢失,一定要有坐标平移。

(2)图像旋转之后,会出现许多空洞点。对这些空洞点必须进行填充处理,否则画面效果不好,一般也称这种操作为插值处理。

以上所讨论的旋转是绕坐标轴原点(0,0)进行的。如果图像旋转是绕一个指定点(a,b)旋转,则先要将坐标系平移到该点,再进行旋转,然后将旋转后的图象平移回原来的坐标原点,这实际上是图像的复合变换。如将一幅图像绕点(a,b)逆时针旋转度,首先将原点平移到(a,b),即

                        (3-10)

然后旋转

                 (3-11)

然后再平移回来

                        (3-12)

综上所述,变换矩阵为

附录:

B=imread(‘image1.bmp‘);

%读取原图像

[m,n]=size(B); %获取原图尺寸w

%参数设置

theta = pi/4;  %旋转角度

a = sin(theta);

b = cos(theta);

T = [cos(theta),sin(theta),;    %旋转矩阵

-sin(theta),cos(theta)];

%建立存储空间

row=m+round((m)/2);

col=n+round((n)/2);

rotateima = zeros(row, col);  %存储旋转后图像的矩阵

%图像旋转

for i=1:m

for j=1:n

x=ceil(abs((i-round(m/2))*b-(j-round(n/2))*a+round(row/2)));  %坐标平移至中心

y=ceil(abs((i-round(m/2))*a+(j-round(n/2))*b+round(col/2)));  %坐标平移至中心

rotateima(x,y)=B(i,j);                   %未插值的图像

end

end

nrotateima = uint8(rotateima);

imshow(nrotateima);

title(‘未插值的图像‘)

%图像插值(近邻插值法)

for i=1:row

for j=2:col-1

if(rotateima(i,j) == 0 && rotateima(i,j-1) ~= 0 && rotateima(i,j+1) ~= 0 )

rotateima(i,j) =rotateima(i,j-1) ;

end

end

end

%图像显示

figure(1);

imshow(B)

title(‘原始图像‘);

% figure(2);

% imshow(nrotateima);

% title(‘未插值的图像‘);

figure(3);

imshow(rotateima/256);

imwrite(rotateima/256, ‘旋转后图像.jpg‘, ‘jpg‘);

title(‘旋转图‘);

时间: 2024-10-10 07:24:06

图像旋转的原理与实现的相关文章

图像旋转的原理

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

图像旋转算法的实现

上一篇转载的文章(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

2维图像旋转(转)

图像旋转的原理与实现 一般图像的旋转是以图像的中心为原点,旋转一定的角度,也就是将图像上的所有像素都旋转一个相同的角度.旋转后图像的的大小一般会改变,即可以把转出显示区域的图像截去,或者扩大图像范围来显示所有的图像.图像的旋转变换也可以用矩阵变换来表示.设点逆时针旋转角后的对应点为.那么,旋转前后点.的坐标分别是:                           (3-6)   (3-7) 写成矩阵表达式为             (3-8) 其逆运算为             (3-9)

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

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

图像旋转后出现黑点 - (二) - 填坑

前接:图像旋转后出现黑点 - (一) - 入坑 这是填坑篇,之前写的图片旋转程序把图片变成了桌布,几个世纪后,在一个月黑风高的夜晚,我灵光乍现,何不试试双线性插值? 先上代码和效果图. 1 # !/usr/bin/env python3 2 # -*-coding:utf-8-*- 3 """ 4 双线性插值参考资料: 双线性插值原理及Python实现 - Jinglever https://www.jianshu.com/p/29e5c84ea539 5 6 如果出现错误:

每日算法之三十七: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

【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的算法和功能, 并用计算机视觉人