缩放操作"/>
图像旋转 裁剪 缩放操作
图像旋转 裁剪 缩放操作
- 1.旋转矩形
- 2.图像的裁剪:
- 3.图像缩放
- 最近邻算法
- Bilinear算法(双线性插值)
- Bicubic算法(双三次插值)
1.旋转矩形
首先建议阅读 图像旋转算法原理-旋转矩阵 ,这篇博客可以让你很好地理解图像中的每一个点是如何进行旋转操作的。其中涉及到了图像原点与笛卡尔坐标原点之间的相互转换以及点旋转的一些公式推导。
建议阅读该博客的朋友最好对插值、matlab编程、数字图像有一些了解,另外所有代码和测试图片都可以到GitHub去下载。
在一次数字图像处理课中,我接触到了图片旋转的一些原理,当时没完全想明白,课后通过一段时间的学习,终于完成了图片旋转的matlab程序。开始觉得应该挺简单的,但终究是纸上谈兵,在实现的过程中遇到很多问题。
1 旋转矩形首先建议阅读 图像旋转算法原理-旋转矩阵,这篇博客可以让你很好地理解图像中的每一个点是如何进行旋转操作的。其中涉及到了图像原点与笛卡尔坐标原点之间的相互转换以及点旋转的一些公式推导。
2.图像的裁剪:
程序设计思路:
这里不需要按像素遍历,因为目标图像的每行像素在原图像中是按相同顺序连续存放的,所以只需要遍历目标图像每行,将其在原图像中的对应内存数据复制过来即可。
3.图像缩放
图像缩放的基本原理就是根据原图像的像素值通过一定的规则计算得到目标图像的像素值。
图像缩放的两个关键问题是应该选取原图像中哪些像素值,以及如何确定选取的像素值的权重。
图像缩放的常见问题是产生锯齿(缩小)或者模糊(放大)。
缩放图像是二维的尺度伸缩变换,目标图像的像素值从原图像得到。
令h_step = H/h, w_step = W/w,目标图中相邻像素的距离就转换为了原图中的h_step和w_step(通常不是整数)。
此外,原图和目标图的第一个像素重合。
最近邻算法
在待求像素的(待插值图的)四邻像素中,将距离待求像素最近的邻像素灰度赋给待求像素。
见下图,设u为待求像素与四邻像素的左上点的水平坐标差,v为待求像素与四邻像素的左上点的垂直坐标差。将待求像素在待插值图中的坐标位置进行四舍五入处理,对应坐标的像素值即为待求像素的值。
优点:
最常见,最通用的算法之一,计算量很小,算法简单,因此运算速度较快。
缺点:
效果不好,放大图像时会出现严重的马赛克,缩小图像则会严重失真。它仅使用离待测采样点最近的像素的灰度值作为该采样点的灰度值,而没考虑其他相邻像素点的影响,因而重新采样后灰度值有明显的不连续性,图像质量损失较大,会产生明显的马赛克和锯齿现象。
Bilinear算法(双线性插值)
双线性插值即在两个方向分别进行一次线性插值,通过四个相邻像素插值得到待求像素。
见下图,已知Q11,Q12,Q21,Q22为原图中的四邻像素,P点为待求像素。
图中所示的双线性插值步骤:
(1)通过Q12,Q22线性插值得到R2,通过Q11,Q21线性插值得到R1;
(2)通过R1,R2线性插值得到P.
图中所示的双线性插值先进行了水平方向的插值,再进行垂直方向上的插值,也可以先垂直插值再水平插值。插值方向的顺序不影响最终的结果。
双线性插值的公式为:
f(x,y)=f(0,0)(1-x)(1-y)+f(1,0)x(1-y)+f(0,1)(1-x)y+f(1,1)xy
优点:
最常见,最通用的算法之一,效果比最近邻插值法好。计算量较小,运算速度较快。图像连续性较好。双线性插值法效果要好于最近邻插值,只是计算量稍大一些,算法复杂些,程序运行时间也稍长些,但缩放后图像质量高,基本克服了最近邻插值灰度值不连续的特点,因为它考虑了待测采样点周围四个直接邻点对该采样点的相关性影响。
缺点:
放大时图像较为模糊,细节损失较严重。它仅考虑待测样点周围四个直接邻点灰度值的影响, 而未考虑到各邻点间灰度值变化率的影响, 因此具有低通滤波器的性质, 从而导致缩放后图像的高频分量受到损失, 图像边缘在一定程度上变得较为模糊。用此方法缩放后的输出图像与输入图像相比, 存在由于插值函数设计考虑不周而产生的图像质量受损与计算精度不高的问题。
Bicubic算法(双三次插值)
在数值分析这个数学分支中,双三次插值(英语:Bicubic interpolation)是二维空间中最常用的插值方法。在这种方法中,函数f在点 (x,y) 的值可以通过矩形网格中最近的十六个采样点的加权平均得到,在这里需要使用两个多项式插值三次函数,每个方向使用一个。
通过双三次插值可以得到一个连续的插值函数,它的一阶偏导数连续,并且交叉导数处处连续。
双三次插值过程类似于双线性插值,分水平插值和垂直插值两个步骤,但双三次插值涉及的像素数更多(4x4)。
计算系数 的过程依赖于插值数据的特性。如果已知插值函数的导数,常用的方法就是使用四个顶点的高度以及每个顶点的三个导数。一阶导数h’x与h’y表示 x 与 y 方向的表面斜率,二阶相互导数h’’xy表示同时在 x 与 y 方向的斜率。这些值可以通过分别连续对 x 与 y 向量取微分得到。对于网格单元的每个顶点,将局部坐标(0,0, 1,0, 0,1 和 1,1) 带入这些方程,再解这 16 个方程。
更多推荐
图像旋转 裁剪 缩放操作
发布评论