双线性插值前后对比:
前:
后:
线性插值代码:
Eigen::Vector3f getBilinnerColor(float u, float v)
{
// 坐标限定
if (u < 0) u = 0;
if (u > 1) u = 1;
if (v < 0) v = 0;
if (v > 1) v = 1;
float u_img = u * width;
float v_img = (1 - v) * height;
// find center coordinates
int cx = u_img;
int cy = v_img;
cx = (u_img - cx) > 0.5 ? std::ceil(u_img) : std::floor(u_img);
cy = (v_img - cy) > 0.5 ? std::ceil(v_img) : std::floor(v_img);
// 注意 image_data 第一个坐标对应 v,参考getColor()
// 并且uv map和image的 v 是相反方向 !!
auto u00 = image_data.at<cv::Vec3b>(cy + 0.5, cx - 0.5);
auto u10 = image_data.at<cv::Vec3b>(cy + 0.5, cx + 0.5);
auto u01 = image_data.at<cv::Vec3b>(cy - 0.5, cx - 0.5);
auto u11 = image_data.at<cv::Vec3b>(cy - 0.5, cx + 0.5);
float s = u * width - (cx - 0.5);
float t = (1 - v) * height - (cy - 0.5);
auto u0 = (1 - s) * u00 + s * u10; // at the top
auto u1 = (1 - s) * u01 + s * u11; // at the bottom
auto res = (1 - t) * u1 + t * u0;
return Eigen::Vector3f(res[0], res[1], res[2]);
}
具体参考:Games101|作业3 + shading + 双线性插值 + 疑惑 - 知乎 (zhihu.com) |