基本思想:
旋转矩阵在旋转角度较小的情况下可以通过两次错切变化得到旋转效果的图片,在旋
转角度较大的情况下可以通过三次错切得到等价旋转效果图像(较小角度小于15度,较
大角度在90度之内),对于旋转角度超过90度,首先旋转特殊角度90,180,270,然后
在旋转剩下的角度数。90,180,270是特殊角度,可以通过简单的矩阵变换得到。旋
转矩阵到三次等价错切矩阵等式如下:
一个更好的分解图如下:
程序关键代码解释:
错切变换是基本的图像几何变换,首先在X方向进行顺时针的错切变换,然后在Y方向
进行顺时针的错切变换,最后再到X方向进行顺时针错切变换,最终得到旋转角度以后
的图像数据。
X方向的错切变换的代码如下:
/**
* 水平方向错切变换
*
* @param input - 输入像素数据
* @param shear - 错切角度
* @param width - 图像像素数据宽度
* @param height - 图像像素数据高度
* @return
*/
public int[] xshear(int[] input, float shear, int width, int height) {
outw = (int)(Math.abs(shear) * height + width);
outh = height;
int[] output = new int[height * outw];
// initialization - 初始化计算变量
float skew = 0.0f;
float skewi = 0.0f;
float skewf = 0.0f;
int index = 0;
int outdex = 0;
float leftred = 0.0f, leftgreen = 0.0f, leftblue = 0.0f;
float oleftred = 0.0f, oleftgreen = 0.0f, oleftblue = 0.0f;
int ta = 0, tr=0, tg = 0, tb = 0;
// 执行对每个像素的错切变换
for(int row=0; row<height; row++) {
// skew = shear * (height-1-row + 0.5f); big issue!! very difficulty to find it
skew = shear * (row + 0.5f);
skewi = (float)Math.floor(skew);
skewf = skew - skewi;
for(int col=0; col<width; col++) {
index = row * width + col;
ta = (input[index] >> 24) & 0xff;
tr = (input[index] >> 16) & 0xff;
tg = (input[index] >> 8) & 0xff;
tb = input[index] & 0xff;
if(tr == tg && tg == tb && tb == 0) {
continue;
}
// calculate interpolation pixel value
leftred = (skewf * tr);
leftgreen = (skewf * tg);
leftblue = (skewf * tb);
// calculate the new pixel RGB value
tr = (int)(tr - leftred + oleftred);
tg = (int)(tg - leftgreen + oleftgreen);
tb = (int)(tb - leftblue + oleftblue);
// fix issue, need to check boundary
// computation the new pixel postion here!!
outdex = (int)(row * outw + col + skewi);
output[outdex] = (ta << 24) | (tr << 16) | (tg << 8) | tb;
// ready for next pixel.
oleftred = leftred;
oleftgreen = leftgreen;
oleftblue = leftblue;
}
}
return output;
}
Y方向的错切变换的代码如下:
public int[] yshear(int[] input, float shear, int width, int height) {
outh = (int)(shear * width + height);
outw = width;
int[] output = new int[outh * outw];
// initialization - 初始化计算变量
float skew = 0.0f;
float skewi = 0.0f;
float skewf = 0.0f;
int index = 0;
int outdex = 0;
float leftred = 0.0f, leftgreen = 0.0f, leftblue = 0.0f;
float oleftred = 0.0f, oleftgreen = 0.0f, oleftblue = 0.0f;
int ta = 0, tr=0, tg = 0, tb = 0;
for(int col = 0; col < width; col++) {
// the trick is here!!, you can control the
// anti-clockwise or clockwise
skew = shear * (width-1-col + 0.5f);
// skew = shear * (col + 0.5f);
skewi = (float)Math.floor(skew);
skewf = skew - skewi;
for(int row = 0; row < height; row++) {
index = row * width + col;
ta = (input[index] >> 24) & 0xff;
tr = (input[index] >> 16) & 0xff;
tg = (input[index] >> 8) & 0xff;
tb = input[index] & 0xff;
// calculate interpolation pixel value
leftred = (skewf * tr);
leftgreen = (skewf * tg);
leftblue = (skewf * tb);
// calculate the new pixel RGB value
tr = (int)(tr - leftred + oleftred);
tg = (int)(tg - leftgreen + oleftgreen);
tb = (int)(tb - leftblue + oleftblue);
// computation the new pixel postion here!!
// outdex = (int)((height-row + skewi) * outw + col);
outdex = (int)((row + skewi) * outw + col);
output[outdex] = (ta << 24) | (tr << 16) | (tg << 8) | tb;
// ready for next pixel.
oleftred = leftred;
oleftgreen = leftgreen;
oleftblue = leftblue;
}
}
return output;
}
原图如下:
第一次X shear与Y shear之后效果如下
第二次Xshear即图像旋转效果如下:
其他参数设置与线性插值旋转算法类似,角度,背景参数设置由用户
提供输入完成,关于线性插值旋转参见这里
http://blog.csdn.net/jia20003/article/details/8159587
说实话这个算法烦了我好久,今天我终于解脱了,想起一句电视剧台词,你应
该了解真相,真相让你自由好像是《X档案》
转载请注明出处
分享到:
相关推荐
数字图像处理图像旋转, 3图像旋转算法 ①读入图像文件并把图像转为灰度图像,显示图像,X轴标注为图(a); ②计算图像旋转θ角后的四个顶点坐标(以便确定旋转后的图像大小); ③根据四个顶点坐标,计算移动偏移...
该算法实现了针对图像进过小角度旋转的检测,利用叠加旋转图像每行的频谱来增强频谱峰值,通过检测归一化峰值频率来判断图像是否进过小角度旋转
Visual c++数字图像处理典型算法及实例源代码,内容包括: 源码目录结构图、256色转灰度图、Hough变换、Walsh变换、二值化变换、亮度增减、傅立叶变换、反色、取对数、取指数、图像平移、图像旋转、图像细化、图像...
介绍了各种图像处理的常用方法,包括图像平移、图像颠倒、图像镜像变换、图像旋转
常见的数字图像的几何变换包括平移、镜像、旋转、缩放和错切等,是图像处理软件必须具备的操作手段。本次实验的目的是要求掌握各种变换的基本原理和方法,能够运用Matlab编写程序,实现这些变换。其中,由于变化产生...
图像处理经典算法及OpenCV程序(基于opencv的use摄像头视频采集程序、基于opencv的use摄像头视频采集程序、基于opencv的两个摄像头数据采集、能激发你用代码做视频的冲动程序、图像反转(就是把黑的变白,白的变黑)...
Visual C++数字图像处理典型算法及实现中的图像旋转算法的源代码,旋转角度可以在程序中修改。
opencv图像处理 opencv图像处理_opencv图像处理算法之仿射变换_包括旋转+平移+缩放+组合变换
数字图像处理-matlab-各种大小计算、各种图像旋转、直方图,各种滤波
C#数字图像处理算法典型实例随书光盘 精选数字图像处理领域中的一些应用实例,以理论和实践相结合的方式,系统地介绍了如何使用C#进行数字图像处理。 C#数字图像处理算法典型实例共11章,分别讲述了图像的点运算、...
基于GPU并行处理的图像快速旋转算法.pdf
图像处理算法,包括图像的缩放,滤波,增强,锐化,旋转,反色等。c语言处理算法
遥感图像处理,希望对学习遥感的同学有帮助
1、图像平移:输入参数(float),使图像按参数完成平移。分别用零阶插值和一阶插值实现。 2、图像镜像:完成垂直镜像和水平镜像。 3、图像旋转:输入参数,使图像按参数完成旋转
本此实验内容包括:图像平移、图像镜像、图像缩放、图像旋转。
JAVA语言编写的小型数字图像处理程序,包含改变采样率、量化等级,显示直方图、直方图均衡、图像旋转、平滑等基本操作
Visual C++数字图像处理典型算法及实现中的图像缩放算法,缩放比例可以自己在程序中修改。
图像几何变换之图像位置变换之图像旋转,基于VS2010的多文档实现,可通过设置任意旋转角度进行图片的旋转