3DLUT中四面体插值实现问题求助:效果不及三线性插值
3DLUT风格迁移中四面体插值色彩噪点问题排查
我在图像处理实践中,用3DLUT进行图像风格迁移,分别尝试了三线性插值与四面体插值。根据相关论文结论,使用171717规格的LUT表时,四面体插值的图像质量应更优,但实际生成的图像存在色彩噪点,效果反而不如三线性插值。我推测自己对四面体插值的理解或实现存在错误,现将实现步骤与代码整理如下,恳请图像处理专家帮忙检查问题所在。
我的四面体插值实现步骤
- 与三线性插值一致,计算
floor_R、floor_G、floor_B以及delta_R(fracR)、delta_G(fracG)、delta_B(fracB); - 将子立方体划分为6个四面体,通过
delta_R、delta_G、delta_B的大小排序判断目标点所属的四面体; - 获取对应四面体的4个顶点RGB值;
- 根据目标点到四面体4个顶点的欧氏距离计算权重;
- 结合权重与顶点RGB值计算目标点的RGB值。
实现代码
// get the R B G Floor and Fraction. Pixel* p = &pixels[i]; float r = p->r / 255.0f * (LUTSize - 1); float g = p->g / 255.0f * (LUTSize - 1); float b = p->b / 255.0f * (LUTSize - 1); int rFloor = (int)floor(r); int gFloor = (int)floor(g); int bFloor = (int)floor(b); float fracR = r - rFloor; float fracG = g - gFloor; float fracB = b - bFloor; //define a tetrahedral to get the 4 points RGB coordination int tetrahedral[4][3]; tetrahedral[0][0] = 0; tetrahedral[0][1] = 0; tetrahedral[0][2] = 0; tetrahedral[3][0] = 1; tetrahedral[3][1] = 1; tetrahedral[3][2] = 1; // choose a tetrahedral from six tetrahedrals in the cube if ((fracB > fracR) && (fracR > fracG)) // t1 { tetrahedral[1][0] = 0; tetrahedral[1][1] = 0; tetrahedral[1][2] = 1; tetrahedral[2][0] = 1; tetrahedral[2][1] = 0; tetrahedral[2][2] = 1; } else if ((fracB > fracG) && (fracG > fracR)) //t2 { ..... //similar code as above condition } else ... // until t6 G>R>B for (int i = 0; i < 4; i++) { distance[i] = calOuDistance(fracR, fracG, fracB, tetrahedral[i]); } for (int i = 0; i < 4; i++) { wight[i] = distance[i] / (distance[0] + distance[1] + distance[2] + distance[3]); } for (int i = 0; i < 4; i++) { newindexB = bFloor + tetrahedral[i][2]; newindexG = ...; newindexR = ...; newR += (float)lut_data[newindexB][newindexG][newindexR][0] * wight[i]; newG += ...; newB += ...; } // get new R G B newR = newR * 255.0f; newG = .. newB = ..
生成效果对比
- 原图:色彩正常的原始图像
- 四面体插值生成图:存在明显色彩噪点
- 三线性插值生成图:无明显色彩问题
内容的提问来源于stack exchange,提问作者charlie-xue
相关产品推荐
相关产品推荐

