双线性插值算法
一、插值说明1.插值指利用已知的点来“猜”未知的点2.最近邻插值是只需要找点后直接赋值不需要计算的3.双线性插值是需要找点后然后还要做运算4.最近邻插值是找最近的一个点双线性插值是找最近的四个点二、双线性插值的基本步骤如下1.将目标图像的像素位置映射到原始图像的浮点坐标位置。2.找到该浮点坐标周围的四个最近邻像素点Q11、Q12、Q21、Q22。3.在水平方向上对这四个点进行两次线性插值得到两个中间值R1 和 R2。4.在垂直方向上对 R1 和 R2 再次进行线性插值得到目标像素的最终值。三、双线性插值算法代码实现import cv2import numpy as npdef bilinear_resize(image, new_width, new_height):src_height, src_width, channels image.shaperesized_image np.zeros((new_height, new_width, channels), dtypenp.uint8)scale_x src_width / new_widthscale_y src_height / new_heightfor i in range(new_height):for j in range(new_width):src_x (j 0.5) * scale_x - 0.5src_y (i 0.5) * scale_y - 0.5x1 int(np.floor(src_x))y1 int(np.floor(src_y))x2 min(x1 1, src_width - 1)y2 min(y1 1, src_height - 1)dx src_x - x1dy src_y - y1for c in range(channels):fQ11 image[y1, x1, c]fQ21 image[y1, x2, c]fQ12 image[y2, x1, c]fQ22 image[y2, x2, c]fR1 (1 - dx) * fQ11 dx * fQ21fR2 (1 - dx) * fQ12 dx * fQ22resized_image[i, j, c] int((1 - dy) * fR1 dy * fR2)return resized_image# 示例读取图像并进行双线性插值缩放image cv2.imread(example.jpg)resized bilinear_resize(image, 200, 200)cv2.imshow(Resized Image, resized)cv2.waitKey(0)cv2.destroyAllWindows()三、图像的二阶偏导和一阶偏导1.一阶偏导回答“灰度变化有多快”变化速度直接用于找出边缘。2.二阶偏导回答“灰度的变化本身变化有多快”变化加速度能精确锁定边缘的中心并判断边缘的过渡类型。四、关于坐标之0.5的重要性五、各种算法图形