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

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

实验内容

实验3-1:图像缩放
实验要求:
1)实现一个图像缩放函数,可以对输入图像进行任意倍数的缩放;
2)采用双线性插值进行重采样;
3)X,Y方向的缩放倍数参函数参数的形式传入;
4)可以只考虑输入图像为3通道,8位深度的情况;
5)不能调用图像处理库的缩放函数来完成;
参考函数:void Scale(const MyImage &input MyImage &output, double sx, double sy);

实验3-2:图像变形
实验要求:
记 为像素坐标的一个映射,实现 所表示的图像形变。 f的逆映射为:
在这里插入图片描述
其中:在这里插入图片描述
请先进行转换;中心归一化坐标:
在这里插入图片描述

实验过程:

3.1 双线性插值

双线性插值:对于 (i, j+v),f(i, j) 到 f(i, j+1) 的灰度变化为线性关系,则有:f(i, j+v) = [f(i, j+1) - f(i, j)] * v + f(i, j);同理对于 (i+1, j+v) 则有:f(i+1, j+v) = [f(i+1, j+1) - f(i+1, j)] * v + f(i+1, j);从f(i, j+v) 到 f(i+1, j+v) 的灰度变化也为线性关系,由此可推导出待求象素灰度的计算式如下:
f(i+u, j+v) = (1-u) * (1-v) * f(i, j) + (1-u) * v * f(i, j+1) + u * (1-v) * f(i+1, j) + u * v * f(i+1, j+1)
双线性内插法的计算比最邻近点法复杂,计算量较大,但没有灰度不连续的缺点,结果基本令人满意。它具有低通滤波性质,使高频分量受损,图像轮廓可能会有一点模糊。
代码如下:

def double_linear(input_signal, zoom_multiplesx,zoom_multiplesy):
    '''
    双线性插值
    :param input_signal: 输入图像
    :param zoom_multiplex: x方向放大倍数
    :param zoom_multipley: y方向放大倍数
    :return: 双线性插值后的图像
    '''
    input_signal_cp = np.copy(input_signal)   # 输入图像的副本
    input_row, input_col = input_signal_cp.shape # 输入图像的尺寸(行、列)
    # 输出图像的尺寸
    output_row = int(input_row * zoom_multiplesy)
    output_col = int(input_col * zoom_multiplesx)
    output_signal = np.zeros((output_row, output_col)) # 输出图片
    for i in range(output_row):
        for j in range(output_col):
            temp_x = (i / output_row) * input_row
            temp_y = (j / output_col) * input_col
            x1 = int(temp_x)
            y1 = int(temp_y)
            x2 = x1 
            y2 = y1 + 1
            x3 = x1 + 1
            y3 = y1
            x4 = x1 + 1
            y4 = y1 + 1
            u = temp_x - x1
            v = temp_y - y1
            # 防止越界
            if x4 >= input_row:
                x4 = input_row - 1
                x2 = x4
                x1 = x4 - 1
                x3 = x4 - 1
            if y4 >= input_col:
                y4 = input_col - 1
                y3 = y4
                y1 = y4 - 1
                y2 = y4 - 1
            # 插值
            output_signal[i, j] = (1-u)*(1-v)*int(input_signal_cp[x1, y1]) + (1-u)*v*int(input_signal_cp[x2, y2]) + u*(1-v)*int(input_signal_cp[x3, y3]) + u*v*int(input_signal_cp[x4, y4])
return output_signal

运行宽0.6倍、高1.3倍,左为效果图:
在这里插入图片描述

3.2 图像变形

实验3.2是做一个图像的变形,因为题目只给出了逆映射,刚开始审题不清楚,所以认为一定要把映射给求出来,花了很多工夫求出来后,写代码的时候没注意归一化得到下面这个诡异的图片:
在这里插入图片描述
后来才发觉根本不用求,直接对结果图像遍历即可,特别要注意的是坐标归一化和还原坐标时,float和int的处理,由于python真的是太智能了,所以经常使用强转习惯了,所以不禁感叹还是C++方便?。(后来有同学友情提示可以用‘//’除就不会出现这种情况了,还是基础不扎实呀,憨憨一个)下面是代码和结果(懒得复制粘贴了直接截图啦):
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值