实验内容
实验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++方便?。(后来有同学友情提示可以用‘//’除就不会出现这种情况了,还是基础不扎实呀,憨憨一个)下面是代码和结果(懒得复制粘贴了直接截图啦):