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

简介: 图像处理之图像快速旋转算法

基本思想:

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


转角度较大的情况下可以通过三次错切得到等价旋转效果图像(较小角度小于15度,较


大角度在90度之内),对于旋转角度超过90度,首先旋转特殊角度90,180,270,然后


在旋转剩下的角度数。90,180,270是特殊角度,可以通过简单的矩阵变换得到。旋


转矩阵到三次等价错切矩阵等式如下:

1353773682_4508.png



一个更好的分解图如下:


1353773710_5309.png


程序关键代码解释:


错切变换是基本的图像几何变换,首先在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;
  }

原图如下:

1352293914_3836.jpg


第一次X shear与Y shear之后效果如下


1353775027_6572.png


第二次Xshear即图像旋转效果如下:


1353774103_7533.png


其他参数设置与线性插值旋转算法类似,角度,背景参数设置由用户


提供输入完成,关于线性插值旋转参见这里


http://blog.csdn.net/jia20003/article/details/8159587


说实话这个算法烦了我好久,今天我终于解脱了,想起一句电视剧台词,你应


该了解真相,真相让你自由好像是《X档案》


转载请注明出处

相关文章
|
3天前
|
算法 计算机视觉
基于Chan-Vese算法的图像边缘提取matlab仿真
**算法预览展示了4幅图像,从边缘检测到最终分割,体现了在matlab2022a中应用的Chan-Vese水平集迭代过程。核心代码段用于更新水平集并显示迭代效果,最后生成分割结果及误差曲线。Chan-Vese模型(2001)是图像分割的经典方法,通过最小化能量函数自动检测平滑区域和清晰边界的图像分割,适用于复杂环境,广泛应用于医学影像和机器视觉。**
|
10天前
|
机器学习/深度学习 人工智能 算法
【CVPR2024】面向StableDiffusion的编辑算法FreePromptEditing,提升图像编辑效果
近日,阿里云人工智能平台PAI与华南理工大学贾奎教授团队合作在深度学习顶级会议 CVPR2024 上发表 FPE(Free-Prompt-Editing) 算法,这是一种面向StableDiffusion的图像编辑算法。在这篇论文中,StableDiffusion可用于实现图像编辑的本质被挖掘,解释证明了基于StableDiffusion编辑的算法本质,并基于此设计了新的图像编辑算法,大幅度提升了图像编辑的效率。
|
11天前
|
机器学习/深度学习 人工智能 自然语言处理
【CVPR2024】阿里云人工智能平台PAI图像编辑算法论文入选CVPR2024
近期,阿里云人工智能平台PAI发表的图像编辑算法论文在CVPR-2024上正式亮相发表。论文成果是阿里云与华南理工大学贾奎教授领衔的团队共同研发。此次入选标志着阿里云人工智能平台PAI自主研发的图像编辑算法达到了先进水平,赢得了国际学术界的认可。在阿里云人工智能平台PAI算法团队和华南理工大学的老师学生们一同的坚持和热情下,将阿里云在图像生成与编辑领域的先进理念得以通过学术论文和会议的形式,向业界传递和展现。
|
7天前
|
机器学习/深度学习 算法 数据挖掘
机器学习之聚类——MeanShift算法和图像矢量量化
机器学习之聚类——MeanShift算法和图像矢量量化
9 0
|
14天前
|
编解码 算法 PyTorch
超好用!图像去雾算法C2PNet介绍与使用指南
超好用!图像去雾算法C2PNet介绍与使用指南
|
2天前
|
机器学习/深度学习 自然语言处理 算法
m基于深度学习的OFDM+QPSK链路信道估计和均衡算法误码率matlab仿真,对比LS,MMSE及LMMSE传统算法
**摘要:** 升级版MATLAB仿真对比了深度学习与LS、MMSE、LMMSE的OFDM信道估计算法,新增自动样本生成、复杂度分析及抗频偏性能评估。深度学习在无线通信中,尤其在OFDM的信道估计问题上展现潜力,解决了传统方法的局限。程序涉及信道估计器设计,深度学习模型通过学习导频信息估计信道响应,适应频域变化。核心代码展示了信号处理流程,包括编码、调制、信道模拟、降噪、信道估计和解调。
23 8
|
4天前
|
算法
基于GA遗传优化的混合发电系统优化配置算法matlab仿真
**摘要:** 该研究利用遗传算法(GA)对混合发电系统进行优化配置,旨在最小化风能、太阳能及电池储能的成本并提升系统性能。MATLAB 2022a用于实现这一算法。仿真结果展示了一系列图表,包括总成本随代数变化、最佳适应度随代数变化,以及不同数据的分布情况,如负荷、风速、太阳辐射、弃电、缺电和电池状态等。此外,代码示例展示了如何运用GA求解,并绘制了发电单元的功率输出和年变化。该系统原理基于GA的自然选择和遗传原理,通过染色体编码、初始种群生成、适应度函数、选择、交叉和变异操作来寻找最优容量配置,以平衡成本、效率和可靠性。
|
5天前
|
机器学习/深度学习 算法
基于鲸鱼优化的knn分类特征选择算法matlab仿真
**基于WOA的KNN特征选择算法摘要** 该研究提出了一种融合鲸鱼优化算法(WOA)与K近邻(KNN)分类器的特征选择方法,旨在提升KNN的分类精度。在MATLAB2022a中实现,WOA负责优化特征子集,通过模拟鲸鱼捕食行为的螺旋式和包围策略搜索最佳特征。KNN则用于评估特征子集的性能。算法流程包括WOA参数初始化、特征二进制编码、适应度函数定义(以分类准确率为基准)、WOA迭代搜索及最优解输出。该方法有效地结合了启发式搜索与机器学习,优化特征选择,提高分类性能。
|
5天前
|
机器学习/深度学习 算法 数据可视化
基于BP神经网络的64QAM解调算法matlab性能仿真
**算法预览图省略** MATLAB 2022A版中,运用BP神经网络进行64QAM解调。64QAM通过6比特映射至64复数符号,提高数据速率。BP网络作为非线性解调器,学习失真信号到比特的映射,对抗信道噪声和多径效应。网络在处理非线性失真和复杂情况时展现高适应性和鲁棒性。核心代码部分未显示。
|
8天前
|
机器学习/深度学习 算法 数据可视化
m基于PSO-LSTM粒子群优化长短记忆网络的电力负荷数据预测算法matlab仿真
在MATLAB 2022a中,应用PSO优化的LSTM模型提升了电力负荷预测效果。优化前预测波动大,优化后预测更稳定。PSO借鉴群体智能,寻找LSTM超参数(如学习率、隐藏层大小)的最优组合,以最小化误差。LSTM通过门控机制处理序列数据。代码显示了模型训练、预测及误差可视化过程。经过优化,模型性能得到改善。
28 6