1.OpenCV ——双线性插值(Bilinear interpolation)
介绍了双线性插值的原理和计算方法,并且提到了两点优化,不过关于优化解释的不够详细
2.图像处理界双线性插值算法的优化
介绍了利用整数代替浮点数进行运算加速的优化
3.双线性插值算法及需要注意事项
介绍了源图像和目标图像几何中心的对齐
4.OpenCV中resize函数五种插值算法的实现过程
5.我的测试与理解
测试代码:
#include <opencv2\opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
//载入原图像
cv::Mat src = cv::imread("C:\\Users\\dell\\Desktop\\xin1.jpg", 1);
if (src.empty())
{
cout << "原图像载入失败!" << endl;
return -1;
}
cv::Mat dst;
cv::resize(src, dst, cv::Size(0.5 * src.cols, 0.5 * src.rows), 0, 0, INTER_LINEAR);
return 0;
}
分析一下目标图像(resize之后的图)右下角点的值,其坐标为(0769,0479),其BGR = 089|222|235
运用坐标换算公式计算出在原图中的坐标
src.x=(dst.x + 0.5) * src_width/dst_width - 0.5
src.y=(dst.y + 0.5) * src_height/dst_height - 0.5
将数据带入公式:
src.x = (769 + 0.5) * 1540 / 770 - 0.5 = 1538.5
src.y = (479 + 0.5)* 961 /480 - 0.5 ≈ 959.49896
取整得点(1538, 959)
取此点附近的四个点,其BGR分别为
左上点(1538,959) BGR = 89|222|236
右上点(1539,959) BGR = 89|222|236
左下点(1538,960) BGR = 89|223|235
右下点(1539,960) BGR = 89|223|235
带入公式f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1)分别计算BGR得:
B (1538.5, 959.49896)= (1 - 0.5)* (1 - 0.49896)* B(1538,959) + (1 - 0.5)* 0.49896 * B(1538,960)+ 0.5 * (1 - 0.49896)* B(1539,959)+ 0.5 * 0.49896 * B(1539,960)= 89
G(1538.5, 959.49896)= (1 - 0.5)* (1 - 0.49896)* G(1538,959) + (1 - 0.5)* 0.49896 * G(1538,960)+ 0.5 * (1 - 0.49896)* G(1539,959)+ 0.5 * 0.49896 * G(1539,960)= 222.49896
R(1538.5, 959.49896)= (1 - 0.5)* (1 - 0.49896)* R(1538,959) + (1 - 0.5)* 0.49896 * R(1538,960)+ 0.5 * (1 - 0.49896)* R(1539,959)+ 0.5 * 0.49896 * R(1539,960)= 235.48694
取整得点(1538.5, 959.49896)处BGR = 89|222|235,与目标图像中的值是一致的。(*^▽^*)
此处只是验证了OpenCV双线性插值的确采用了对齐处理,至于另一个优化,采用整数代替浮点数加速运算,在函数内部运行,
未能验证。其实要想验证,自己可以写一个正常计算和利用除2048以及>>22对比一下,这一部分暂时放一放,有时间再研究一下。