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

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

基本思想:

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


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


转载请注明出处

相关文章
|
5天前
|
机器学习/深度学习 人工智能 自然语言处理
|
5天前
|
算法
基于粒子群优化的图像融合算法matlab仿真
这是一个基于粒子群优化(PSO)的图像融合算法,旨在将彩色模糊图像与清晰灰度图像融合成彩色清晰图像。在MATLAB2022a中测试,算法通过PSO求解最优融合权值参数,经过多次迭代更新粒子速度和位置,以优化融合效果。核心代码展示了PSO的迭代过程及融合策略。最终,使用加权平均法融合图像,其中权重由PSO计算得出。该算法体现了PSO在图像融合领域的高效性和融合质量。
|
1月前
|
机器学习/深度学习 人工智能 算法
【CVPR2024】面向StableDiffusion的编辑算法FreePromptEditing,提升图像编辑效果
近日,阿里云人工智能平台PAI与华南理工大学贾奎教授团队合作在深度学习顶级会议 CVPR2024 上发表 FPE(Free-Prompt-Editing) 算法,这是一种面向StableDiffusion的图像编辑算法。在这篇论文中,StableDiffusion可用于实现图像编辑的本质被挖掘,解释证明了基于StableDiffusion编辑的算法本质,并基于此设计了新的图像编辑算法,大幅度提升了图像编辑的效率。
|
27天前
|
算法 计算机视觉
基于Chan-Vese算法的图像边缘提取matlab仿真
**算法预览展示了4幅图像,从边缘检测到最终分割,体现了在matlab2022a中应用的Chan-Vese水平集迭代过程。核心代码段用于更新水平集并显示迭代效果,最后生成分割结果及误差曲线。Chan-Vese模型(2001)是图像分割的经典方法,通过最小化能量函数自动检测平滑区域和清晰边界的图像分割,适用于复杂环境,广泛应用于医学影像和机器视觉。**
|
1月前
|
机器学习/深度学习 算法 数据挖掘
机器学习之聚类——MeanShift算法和图像矢量量化
机器学习之聚类——MeanShift算法和图像矢量量化
22 0
|
4天前
|
传感器 算法
基于无线传感器网络的MCKP-MMF算法matlab仿真
MCKP-MMF算法是一种启发式流量估计方法,用于寻找无线传感器网络的局部最优解。它从最小配置开始,逐步优化部分解,调整访问点的状态。算法处理访问点的动态影响半径,根据带宽需求调整,以避免拥塞。在MATLAB 2022a中进行了仿真,显示了访问点半径请求变化和代价函数随时间的演变。算法分两阶段:慢启动阶段识别瓶颈并重设半径,随后进入周期性调整阶段,追求最大最小公平性。
基于无线传感器网络的MCKP-MMF算法matlab仿真
|
6天前
|
机器学习/深度学习 算法 数据挖掘
基于改进K-means的网络数据聚类算法matlab仿真
**摘要:** K-means聚类算法分析,利用MATLAB2022a进行实现。算法基于最小化误差平方和,优点在于简单快速,适合大数据集,但易受初始值影响。文中探讨了该依赖性并通过实验展示了随机初始值对结果的敏感性。针对传统算法的局限,提出改进版解决孤点影响和K值选择问题。代码中遍历不同K值,计算距离代价,寻找最优聚类数。最终应用改进后的K-means进行聚类分析。
|
8天前
|
算法 数据安全/隐私保护
基于GA遗传优化算法的Okumura-Hata信道参数估计算法matlab仿真
在MATLAB 2022a中应用遗传算法进行无线通信优化,无水印仿真展示了算法性能。遗传算法源于Holland的理论,用于全局优化,常见于参数估计,如Okumura-Hata模型的传播损耗参数。该模型适用于150 MHz至1500 MHz的频段。算法流程包括选择、交叉、变异等步骤。MATLAB代码执行迭代,计算目标值,更新种群,并计算均方根误差(RMSE)以评估拟合质量。最终结果比较了优化前后的RMSE并显示了SNR估计值。
21 7
|
5天前
|
传感器 算法 数据安全/隐私保护
基于鲸鱼优化的DSN弱栅栏覆盖算法matlab仿真
```markdown 探索MATLAB2022a中WOA与DSN弱栅栏覆盖的创新融合,模拟鲸鱼捕食策略解决传感器部署问题。算法结合“搜索”、“包围”、“泡沫网”策略,优化节点位置以最大化复杂环境下的区域覆盖。目标函数涉及能量效率、网络寿命、激活节点数、通信质量及覆盖率。覆盖评估基于覆盖半径比例,旨在最小化未覆盖区域。 ```
|
10天前
|
算法 数据挖掘
MATLAB数据分析、从算法到实现
MATLAB数据分析、从算法到实现