关于双线性插值的学习资料汇总

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对比一下,这一部分暂时放一放,有时间再研究一下。



猜你喜欢

转载自blog.csdn.net/weixin_42142612/article/details/81062892