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

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

基本思想:

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


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


转载请注明出处

相关文章
|
27天前
|
机器学习/深度学习 人工智能 算法
【CVPR2024】面向StableDiffusion的编辑算法FreePromptEditing,提升图像编辑效果
近日,阿里云人工智能平台PAI与华南理工大学贾奎教授团队合作在深度学习顶级会议 CVPR2024 上发表 FPE(Free-Prompt-Editing) 算法,这是一种面向StableDiffusion的图像编辑算法。在这篇论文中,StableDiffusion可用于实现图像编辑的本质被挖掘,解释证明了基于StableDiffusion编辑的算法本质,并基于此设计了新的图像编辑算法,大幅度提升了图像编辑的效率。
|
21天前
|
算法 计算机视觉
基于Chan-Vese算法的图像边缘提取matlab仿真
**算法预览展示了4幅图像,从边缘检测到最终分割,体现了在matlab2022a中应用的Chan-Vese水平集迭代过程。核心代码段用于更新水平集并显示迭代效果,最后生成分割结果及误差曲线。Chan-Vese模型(2001)是图像分割的经典方法,通过最小化能量函数自动检测平滑区域和清晰边界的图像分割,适用于复杂环境,广泛应用于医学影像和机器视觉。**
|
28天前
|
机器学习/深度学习 人工智能 自然语言处理
【CVPR2024】阿里云人工智能平台PAI图像编辑算法论文入选CVPR2024
近期,阿里云人工智能平台PAI发表的图像编辑算法论文在CVPR-2024上正式亮相发表。论文成果是阿里云与华南理工大学贾奎教授领衔的团队共同研发。此次入选标志着阿里云人工智能平台PAI自主研发的图像编辑算法达到了先进水平,赢得了国际学术界的认可。在阿里云人工智能平台PAI算法团队和华南理工大学的老师学生们一同的坚持和热情下,将阿里云在图像生成与编辑领域的先进理念得以通过学术论文和会议的形式,向业界传递和展现。
|
24天前
|
机器学习/深度学习 算法 数据挖掘
机器学习之聚类——MeanShift算法和图像矢量量化
机器学习之聚类——MeanShift算法和图像矢量量化
20 0
|
1月前
|
编解码 算法 PyTorch
超好用!图像去雾算法C2PNet介绍与使用指南
超好用!图像去雾算法C2PNet介绍与使用指南
|
1天前
|
算法 数据安全/隐私保护
基于GA遗传优化算法的Okumura-Hata信道参数估计算法matlab仿真
在MATLAB 2022a中应用遗传算法进行无线通信优化,无水印仿真展示了算法性能。遗传算法源于Holland的理论,用于全局优化,常见于参数估计,如Okumura-Hata模型的传播损耗参数。该模型适用于150 MHz至1500 MHz的频段。算法流程包括选择、交叉、变异等步骤。MATLAB代码执行迭代,计算目标值,更新种群,并计算均方根误差(RMSE)以评估拟合质量。最终结果比较了优化前后的RMSE并显示了SNR估计值。
15 7
|
4天前
|
算法 数据挖掘
MATLAB数据分析、从算法到实现
MATLAB数据分析、从算法到实现
|
10天前
|
机器学习/深度学习 算法 调度
Matlab|基于改进鲸鱼优化算法的微网系统能量优化管理matlab-源码
基于改进鲸鱼优化算法的微网系统能量管理源码实现,结合LSTM预测可再生能源和负荷,优化微网运行成本与固定成本。方法应用于冷热电联供微网,结果显示经济成本平均降低4.03%,提高经济效益。代码包括数据分段、LSTM网络定义及训练,最终展示了一系列运行结果图表。
|
10天前
|
算法
基于Dijkstra算法的最优行驶路线搜索matlab仿真,以实际城市复杂路线为例进行测试
使用MATLAB2022a实现的Dijkstra算法在城市地图上搜索最优行驶路线的仿真。用户通过鼠标点击设定起点和终点,算法规划路径并显示长度。测试显示,尽管在某些复杂情况下计算路径可能与实际有偏差,但多数场景下Dijkstra算法能找到接近最短路径。核心代码包括图的显示、用户交互及Dijkstra算法实现。算法基于图论,不断更新未访问节点的最短路径。测试结果证明其在简单路线及多数复杂城市路况下表现良好,但在交通拥堵等特殊情况下需结合其他数据提升准确性。
|
15天前
|
算法 安全 数据库
基于结点电压法的配电网状态估计算法matlab仿真
**摘要** 该程序实现了基于结点电压法的配电网状态估计算法,旨在提升数据的准确性和可靠性。在MATLAB2022a中运行,显示了状态估计过程中的电压和相位估计值,以及误差随迭代变化的图表。算法通过迭代计算雅可比矩阵,结合基尔霍夫定律解决线性方程组,估算网络节点电压。状态估计过程中应用了高斯-牛顿或莱文贝格-马夸尔特法,处理量测数据并考虑约束条件,以提高估计精度。程序结果以图形形式展示电压幅值和角度估计的比较,以及估计误差的演变,体现了算法在处理配电网状态估计问题的有效性。