完整源码链接 https://github.com/LamyaLi/cvLab
计算机视觉实验三 几何变换与变形
一、图像缩放
1、题目要求
1)实现一个图像缩放函数,可以对输入图像进行任意倍数的缩放;
2)采用双线性插值进行重采样;
3)X,Y方向的缩放倍数参函数参数的形式传入;
4)可以只考虑输入图像为3通道,8位深度的情况;
5)不能调用图像处理库的缩放函数来完成;
2、题目分析
-
双线性插值比最邻近点插值效果更好,图像更连续
-
双线性插值依据最邻近四个点的值共同确定取值,计算方法如下:
3、实现步骤
-
根据缩放比例参数计算尺寸,初始化一个目标图片
def zoom_bilinear_interpolation(source,x_rate,y_rate): #rate 缩放比例,目标:原 #source是已经读取好的表示图像的三维数组 starttime = datetime.datetime.now() if x_rate==1 and y_rate==1: return source.copy() x,y=int(source.shape[0]*x_rate),int(source.shape[1]*y_rate) des=np.zeros((x,y,3), dtype=np.uint8)
-
两层循环,给目标图像的每个像素插值
for k in range(3): for i in range(x): for j in range(y): m = int(i/ x_rate) n =int(j / y_rate) xr = i/ x_rate - m yr = j / y_rate - n m1=min(m+1,source.shape[0]-1) n1=min(n+1,source.shape[1]-1) des[i,j,k] = source[m, n, k] * (1 - xr) * (1 - yr) + source[m1, n1, k] * xr * yr + source[m1, n, k] * xr * (1 - yr) + source[m, n1, k] * yr * (1 - xr)
注意用了min函数,保证边界不溢出
4、结果展示
测试比例为(1.5,2)
des=zoom_bilinear_interpolation(source,1.5,2)
二、图像变形
1、题目要求
2、题目分析
是目标图中的坐标,
是其对应在原图中的坐标
- 关键点是,求目标图坐标在原图中的对应坐标,如果这个对应坐标不是整数对,则插值求灰度
- 采用双线性插值法
3、实现步骤
-
初始化一个目标图片
def image_warping(source): # source是已经读取好的表示图像的三维数组 starttime = datetime.datetime.now() size_w,size_h=source.shape[0],source.shape[1] des=source.copy()
-
遍历目标图片,根据公式求其在原图对应坐标
先中心归一化坐标
for i in range(size_w): for j in range(size_h): i_n = (i-0.5*size_w)/(0.5*size_w) j_n = (j-0.5*size_h)/(0.5*size_h)
计算坐标向量的模,做出选择,求出对应坐标
r = (i_n**2+j_n**2)**0.5 if r >= 1.0: i_s=i j_s=j else: theta =(1-r)**2 i_n_s = math.cos(theta)*i_n-math.sin(theta)*j_n j_n_s = math.sin(theta)*i_n+math.cos(theta)*j_n i_s = i_n_s*0.5*size_w+0.5*size_w j_s = j_n_s*0.5*size_h+0.5*size_h
-
双线性插值计算该目标图坐标处的灰度值,min防止索引越界
m = int(i_s) n = int(j_s) xr = i_s - m yr = j_s - n m1 = min(m + 1, size_w - 1) n1 = min(n + 1, size_h - 1) des[i, j, :] = source[m, n, :] * (1 - xr) * (1 - yr) + source[m1, n1, :] * xr * yr + source[m1, n, :] * xr * (1 - yr) + source[m, n1, :] * yr * (1 - xr)