图像的缩放(scale),旋转(rotation),错切(shear)操作

接着上次的平移和镜像操作,这次是缩放、旋转和错切操作。

话说我还从来没在blog中放过图片 = =。这次顺便试一下。所以先放出程序处理后的效果图(顺便把前面的镜像操作的结果也放一下)。


首先是作为程序输入的input.bmp图像:


图像的缩放(scale),旋转(rotation),错切(shear)操作_第1张图片



然后是旋转45度的结果(程序中可任意选择旋转角度):





按X轴镜像后的结果(可选X或Y):




按X轴错切20度以后的结果(可选X或Y,可选角度0~45度):





然后是X方向放大两倍,Y方向不变的结果(可任意选择各个方向的缩放倍数,但偏差太大的话图像效果不好):





在这篇blog里面我就不放完整的代码了。。因为写的太丑。。这五个操作全放在一起写了500多行,太长了。

有需要源码的话可以到这里免费下载:http://download.csdn.net/detail/frozenshore/9351509



主要讲一下思路吧,前面也说过,平移和镜像操作比较简单,因为无需考虑插值(interpolation)。然而如果在缩放、旋转操作中不进行插值的话,那么图像就会出现许多空点,比如像是这样

图像的缩放(scale),旋转(rotation),错切(shear)操作_第2张图片



而计算插值有许多方法,比如最邻近插值、双线性插值、RBF插值等等。在这里我用的是双线性插值,因为效果尚可且操作简单。原理如下:

图像的缩放(scale),旋转(rotation),错切(shear)操作_第3张图片

也就是说,针对点P,寻找四周有值的四个点,然后计算他们的灰度值(在RGB中分别计算三通道),解方程即可。在实际操作中,可以先计算出水平方向的中间点(上图的R,Q点)再计算P点。


再说各个操作的原理。

图象变化其实都是对每个像素点进行变换。都可以用矩阵的形式来表达。设某个像素点转变前的坐标为(x, y),转变后的坐标为(x’, y’),那么对于translation来说,矩阵坐标变换是如下这样的:

图像的缩放(scale),旋转(rotation),错切(shear)操作_第4张图片


mirror操作的变换是这样的:

图像的缩放(scale),旋转(rotation),错切(shear)操作_第5张图片

其中,当sx=1,sy = -1的时候就是针对x轴做镜像变换,反之则是对Y轴做镜像变换


scale操作的变换是这样的:

图像的缩放(scale),旋转(rotation),错切(shear)操作_第6张图片

c, d两个值可任选,当然做完scale以后要记得interpolation


rotation:

图像的缩放(scale),旋转(rotation),错切(shear)操作_第7张图片

就是根据旋转角度进行三角变换,同样需要interpolation


而shear就是以某一系数对单方向的像素点进行变换,例如如果针对X轴做变换的话就是这样:

图像的缩放(scale),旋转(rotation),错切(shear)操作_第8张图片


你可能感兴趣的:(图像处理)