双线性插值算法与RGB空间下的像素突变以及缓存问题
参考文章:
一篇文章为你讲透双线性插值 - 知乎 (zhihu.com)
代码来自:无双软件学院
原理:
设计思想:
插值像素来自于指定坐标相邻两行像素;
注意问题:
缩小的情况:
可能某些行并不是当前所输出行所需要的行,这些是会被过滤掉的(需要设计电路来过滤);
放大的情况:
如果没有使用DDR3缓存,按需取数,而放大的情况;
输入了一定的数据的情况下,可能会覆盖已储存的行,所以要增加更多的BRAM来缓解这个问题,我目前采用四个ram存了四行数据;
我认为这应该存在某种比例关系,但是计算比较复杂。
细节解析:
已知插值像素来自于相邻两行像素,所以至少要存两行才能满足数据要求;
而我们也需要根据公式决定是否要支取行数据来完成工作;
运算步骤:
源坐标计算:
对于目标图像中的每个像素 (i, j),计算其在源图像中对应的浮点坐标 (src_xf, src_yf): src_yf = ((i-1) + 0.5) * sy - 0.5; src_xf = ((j-1) + 0.5) * sx - 0.5; 这里,(i-1) + 0.5 和 (j-1) + 0.5 将像素中心的坐标转换为从0开始的坐标系中的位置,乘以 sy 或 sx 是为了将目标图像坐标映射回源图像坐标。最后减去0.5是为了调整到源图像的坐标系。
相邻像素索引确定:
- 通过
floor
函数计算出浮点坐标最接近的整数坐标src_x0
,src_y0
,这两个坐标标记了目标像素对应的源图像像素的左上角:
src_xf = ((j-1) + 0.5) * sx - 0.5; if(src_xf<0) src_x0 = 0; else src_x0 = floor(src_xf);% 向下取整 end src_x1 = src_x0 + 1; if(src_yf<0) src_y0 = 0; else src_y0 = floor(src_yf); end src_y1 = src_y0 + 1;
插值系数计算:
- 计算插值系数
u
和v
,这些系数表示目标像素在源图像对应四个像素网格中的相对位置:
u = src_yf - src_y0; v = src_xf - src_x0; ru = 1 - u; rv = 1 - v;
双线性插值:
- 根据计算的系数,从四个邻近的源像素中获取像素值并进行加权平均:(这里要注意边界的处理)
if (src_y0 >= row - 1 && src_x0 >= col - 1) line_data(i,j) = src_data(src_y0+1,src_x0+1); elseif(src_y0 >= row - 1) line_data(i,j) = ru_rv * src_data(src_y0+1,src_x0+1) + ru_v * src_data(src_y0+1,src_x1+1); elseif(src_x0 >= col - 1) line_data(i,j) = ru_rv * src_data(src_y0+1,src_x0+1) + u_rv * src_data(src_y1+1,src_x0+1); else line_data(i,j) = ru_rv * src_data(src_y0+1,src_x0+1) + ru_v * src_data(src_y0+1,src_x1+1) + u_rv * src_data(src_y1+1,src_x0+1) + u_v * src_data(src_y1+1,src_x1+1); end
像素突变
在使用双线性插值算法对 RGB 图像的每个通道分别进行插值,然后将结果转换为 RGB565 格式时,可能出现像素突变。
可以选择在YCbCr空间完成ISP;
YCbCr色彩空间
- 优点:YCbCr 色彩空间将颜色信息分为亮度(Y)和色度(Cb和Cr)分量,这对于压缩和视频处理非常有用。在处理视频或需要进行色彩分量分离的应用中,对亮度分量进行高质量插值,而对色度分量使用较低质量的插值,可以有效地节约资源。
- 缺点:虽然 YCbCr 适用于压缩和传输,但它不一定提供与 Lab 相媲美的视觉均匀性。在从 YCbCr 转换回 RGB 或其他色彩空间时也可能引入误差。