图像缩放旋转平移原理
时间: 2025-01-07 13:11:34 浏览: 7
### 图像处理中的缩放、旋转和平移原理
#### 3.1 平移变换
在图像处理中,平移是指将图像上的每一个像素按照指定的方向和距离进行移动。对于二维空间内的任意一点 \((x,y)\),其经过平移到达新位置\((x',y')\) 的计算方式可以表示为:
\[ x' = x + t_x \\ y' = y + t_y \]
其中 \(t_x\) 和 \(t_y\) 是沿X轴和Y轴方向的偏移量[^1]。
为了方便使用矩阵运算,在实际编程实践中通常采用齐次坐标系下的形式表达上述关系:
\[ \begin{bmatrix} x'\\ y'\\ 1 \end{bmatrix}= \begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0& 0& 1 \end{bmatrix}\cdot \begin{bmatrix} x\\ y\\ 1 \end{bmatrix} \][^2]
```cpp
// C++ code snippet demonstrating translation transformation.
void translateImage(Mat& src, Mat& dst, int tx, int ty){
Point2f from[3];
Point2f to[3];
// Define three points used for computing the affine transform matrix
from[0] = Point(0,0);from[1]=Point(src.cols-1,0);
from[2]=Point(0,src.rows-1);
to[0] = Point(tx,ty);to[1]=Point(src.cols-1+tx,ty);
to[2]=Point(tx,src.rows-1+ty);
Mat transmtx=getAffineTransform(from,to);
warpAffine(src,dst,transmtx,cv::Size(src.cols,src.rows));
}
```
#### 3.2 缩放变换
当涉及到图像大小的变化时,则需要用到缩放操作。通过调整比例因子\(s_x,s_y\) 来控制水平和垂直两个维度的增长或缩小程度。如果仅考虑均匀缩放(即保持纵横比不变),那么只需要设置相同的尺度参数即可;而非均匀情况下则允许各自独立变化。
同样地,在应用到具体程序里也会借助于相应的转换矩阵完成此过程:
\[ S=\begin{pmatrix}s_{x}&0\\0&s_{y}\end{pmatrix},\quad P'=SP,\text {where }P=(x ,y)^T,P ' =(x ',y ') ^ T \]
这里给出一段简单的C语言代码片段用于展示如何执行这样的变换:
```c
#include<stdio.h>
#define WIDTH 800
#define HEIGHT 600
typedef struct {
unsigned char r,g,b;
} Pixel;
Pixel img_src[WIDTH*HEIGHT]; // source image array
Pixel img_dst[WIDTH*HEIGHT]; // destination image array after scaling
int scale_image(Pixel *img_in,int width_in,int height_in,float sx,float sy,
Pixel *img_out,int *width_out,int *height_out){
float new_width=width_in*sx,new_height=height_in*sy;
*width_out=new_width;*height_out=new_height;
for(int i=0;i<*height_out;i++)
for(int j=0;j<*width_out;j++){
int old_i=i/sy,old_j=j/sx;
if(old_i>=height_in||old_j>=width_in)continue;
img_out[i**width_out+j].r=img_in[old_i*width_in+old_j].r;
img_out[i**width_out+j].g=img_in[old_i*width_in+old_j].g;
img_out[i**width_out+j].b=img_in[old_i*width_in+old_j].b;
}
return 0;
}
```
#### 3.3 旋转变换
最后讨论的是围绕原点逆时针转动一定角度θ后的效果。此时对应的线性映射可写作:
\[ R(\theta)=\left[\begin{array}{cc}\cos (\theta)&-\sin (\theta)\\\sin (\theta)&\cos (\theta)\end{array}\right],\qquad(x',y')^{T}=R(\theta)(x,y)^{T}. \]
值得注意的是,由于大多数时候并不希望整个画面绕着屏幕中心自转,所以在真正实施之前往往还需要先做一次位移使得待旋转对象位于坐标系中央,之后再施加旋转并反向平移回原来的位置上去。
下面是一份Python版本的例子说明怎样利用OpenCV库来进行这项工作:
```python
import numpy as np
import cv2
def rotate_image(image, angle):
h,w=image.shape[:2]
center=(w/2,h/2)
rotation_matrix=cv2.getRotationMatrix2D(center=center,angle=-angle,scale=1.)
abs_cos=np.abs(rotation_matrix[0,0])
abs_sin=np.abs(rotation_matrix[0,1])
bound_w=int(h*abs_sin+w*abs_cos)
bound_h=int(h*abs_cos+w*abs_sin)
rotation_matrix[0,2]+=(bound_w-w)/2
rotation_matrix[1,2]+=(bound_h-h)/2
rotated=cv2.warpAffine(image,M=(rotation_matrix),dsize=(bound_w,bound_h))
return rotated
```
阅读全文