图像处理之图像快速旋转算法

简介: 基本思想: 旋转矩阵在旋转角度较小的情况下可以通过两次错切变化得到旋转效果的图片,在旋 转角度较大的情况下可以通过三次错切得到等价旋转效果图像(较小角度小于15度,较 大角度在90度之内),对于旋转角度超过90度,首先旋转特殊角度90,180,270,然后 在旋转剩下的角度数。

基本思想:

旋转矩阵在旋转角度较小的情况下可以通过两次错切变化得到旋转效果的图片,在旋

转角度较大的情况下可以通过三次错切得到等价旋转效果图像(较小角度小于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档案》

转载请注明出处

目录
相关文章
|
4天前
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
1月前
|
算法 数据安全/隐私保护 计算机视觉
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。
|
3月前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
141 63
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024
阿里云人工智能平台 PAI 团队发表的图像编辑算法论文在 MM2024 上正式亮相发表。ACM MM(ACM国际多媒体会议)是国际多媒体领域的顶级会议,旨在为研究人员、工程师和行业专家提供一个交流平台,以展示在多媒体领域的最新研究成果、技术进展和应用案例。其主题涵盖了图像处理、视频分析、音频处理、社交媒体和多媒体系统等广泛领域。此次入选标志着阿里云人工智能平台 PAI 在图像编辑算法方面的研究获得了学术界的充分认可。
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024
|
4月前
|
机器学习/深度学习 人工智能 算法
【MM2024】面向 StableDiffusion 的多目标图像编辑算法 VICTORIA
阿里云人工智能平台 PAI 团队与华南理工大学合作在国际多媒体顶级会议 ACM MM2024 上发表 VICTORIA 算法,这是一种面向 StableDiffusion 的多目标图像编辑算法。VICTORIA 通过文本依存关系来修正图像编辑过程中的交叉注意力图,从而确保关系对象的一致性,支持用户通过修改描述性提示一次性编辑多个目标。
|
4月前
|
算法 数据安全/隐私保护
织物图像的配准和拼接算法的MATLAB仿真,对比SIFT,SURF以及KAZE
本项目展示了织物瑕疵检测中的图像拼接技术,使用SIFT、SURF和KAZE三种算法。通过MATLAB2022a实现图像匹配、配准和拼接,最终检测并分类织物瑕疵。SIFT算法在不同尺度和旋转下保持不变性;SURF算法提高速度并保持鲁棒性;KAZE算法使用非线性扩散滤波器构建尺度空间,提供更先进的特征描述。展示视频无水印,代码含注释及操作步骤。
|
1月前
|
算法 数据可视化 安全
基于DWA优化算法的机器人路径规划matlab仿真
本项目基于DWA优化算法实现机器人路径规划的MATLAB仿真,适用于动态环境下的自主导航。使用MATLAB2022A版本运行,展示路径规划和预测结果。核心代码通过散点图和轨迹图可视化路径点及预测路径。DWA算法通过定义速度空间、采样候选动作并评估其优劣(目标方向性、障碍物距离、速度一致性),实时调整机器人运动参数,确保安全避障并接近目标。
148 68
|
3天前
|
算法
基于SOA海鸥优化算法的三维曲面最高点搜索matlab仿真
本程序基于海鸥优化算法(SOA)进行三维曲面最高点搜索的MATLAB仿真,输出收敛曲线和搜索结果。使用MATLAB2022A版本运行,核心代码实现种群初始化、适应度计算、交叉变异等操作。SOA模拟海鸥觅食行为,通过搜索飞行、跟随飞行和掠食飞行三种策略高效探索解空间,找到全局最优解。
|
1月前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。
|
1天前
|
传感器 算法
基于GA遗传算法的多机无源定位系统GDOP优化matlab仿真
本项目基于遗传算法(GA)优化多机无源定位系统的GDOP,使用MATLAB2022A进行仿真。通过遗传算法的选择、交叉和变异操作,迭代优化传感器配置,最小化GDOP值,提高定位精度。仿真输出包括GDOP优化结果、遗传算法收敛曲线及三维空间坐标点分布图。核心程序实现了染色体编码、适应度评估、遗传操作等关键步骤,最终展示优化后的传感器布局及其性能。

热门文章

最新文章