图像插值算法

目录

1 插值算法简介

1.1 定义

1.2 作用

1.3 应用

2 常用图像插值算法

3. 基于OpenCV的代码实现

 

 

 


1 插值算法简介

1.1 定义

 图像插值就是利用已知邻近像素点的灰度值(或RGB图像中的三色值)来产生未知像素点的灰度值,以便由原始图像再生出具有更高分辨率的图像。

1.2 作用

插值是对原图像的像素重新分布,从而来改变像素数量的一种方法。
在图像放大过程中,像素也相应地增加,增加的过程就是“插值”发生作用的过程,“插值”算法选择信息较好的像素作为增加、弥补空白像素的空间,而并非只使用临近的像素,所以在放大图像时,图像看上去会比较平滑、干净。
不过需要说明的是插值并不能增加图像信息,尽管图像尺寸变大,但效果也相对要模糊些,过程可以理解为白酒掺水

1.3 应用

插值几乎应用于所有需要进行图像缩放功能的领域内,如数码相机、图像处理软件(如Photoshop)。


2 常用图像插值算法

图像处理之三种常见双立方插值算法

图像放缩之双立方插值

图像放缩之双线性内插值

图像处理之Lanczos采样放缩算法

 

 


3. 基于OpenCV的代码实现

函数原型:

void cv::resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )

 

src:输入图像
dst:输出图像
dsize:输出图像尺寸
fx、fy:x,y方向上的缩放因子
INTER_LINEAR:插值方法,总共五种
    1. INTER_NEAREST - 最近邻插值法
    2. INTER_LINEAR - 双线性插值法(默认)
    3. INTER_AREA - 基于局部像素的重采样
    4. INTER_CUBIC - 基于4x4像素邻域的3次插值法
    5. INTER_LANCZOS4 - 基于8x8像素邻域的Lanczos插值

代码实践:

int main(int argc, char* argv[])
{
	Mat src = imread("C:/test.jpg");
	if (src.empty())
	{
		cout << "could not load	image..." << endl;
		return -1;
	}
	int h = src.rows;
	int w = src.cols;
	float fx = 0.0, fy = 0.0;

	Mat dst = Mat::zeros(src.size(), src.type());

        // 原图
	imshow("original", src);

        // 最近邻插值法
	resize(src, dst, Size(w * 2, h * 2), fx=0, fy=0, INTER_NEAREST);
	imshow("INTER_NEAREST", dst);
        // 双线性插值法(默认)
	resize(src, dst, Size(w * 2, h * 2), fx = 0, fy = 0, INTER_LINEAR);
	imshow("INTER_LINEAR", dst);
        // 基于局部像素的重采样
	resize(src, dst, Size(w * 2, h * 2), fx = 0, fy = 0, INTER_CUBIC);
	imshow("INTER_CUBIC", dst);
        // INTER_LANCZOS4
	resize(src, dst, Size(w * 2, h * 2), fx = 0, fy = 0, INTER_LANCZOS4);
	imshow("INTER_LANCZOS4", dst);
	waitKey(0);

	return 0;
}

 

 

你可能感兴趣的:(数字图像处理)