计算机视觉实验三 几何变换与变形

完整源码链接 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)
    
4、结果展示

在这里插入图片描述在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值