在开始程序编写前,先要理清楚下面几个概念:
1、OpenCV创建图像时,使用的CV_8UC1、CV_32FC3等参数的函数?
CV_[bit_depth] (S|U|F) C[number_of_channels]
(1) bit_depth --- 代表一个像素点在内存中所占的bit数
比如CV_8UC1就代表一个像素点在内存中所占的bit数是8,则像素值的取值范围为0~255
(2) S|U|F
S --- signed int
U --- unsigned int
F --- float
(3) C[number_of_channels] --- 代表图像的通道数
number_of_channels=1 ---> 单通道图像
number_of_channels=2 ---> 3通道图像
number_of_channels=3 ---> 带Alpha通道的rgb图像,是4通道图像
创建Mat对象:
Mat( int rows, int cols, type )
2、最邻近插值、双线性插值
假设源图像大小为m*n,目标图像大小为a*b。那么,两幅图像的边长比为m/a、n/b,注意:这个值通常不是整数,编程的时候要使用浮点型存储。目标图像的第(i, j)个像素点对应回源图像中的坐标为(i*m/a, j*n/b)。显然,这个坐标通常也不是整数,而非整数的坐标是无法在图像这种离散数据上使用的。这个时候有两种处理方法:
(1)最邻近插值
对计算得到的源图像中的坐标直接四舍五入得到距离它最近的点的坐标,比如说(0.75, 0.25)--->(1, 0),该坐标对应的像素值就是目标图像上用做映射的那个点的像素点。
最邻近插值是一种最基本、最简单的图像缩放算法。效果并不好,放大后的图像有很严重的马赛克,缩小后的图像有很严重的失真。
(2)双线性插值
假设目标图(x, y)映射到原图中是(X+u, Y+v),u,v为X+u, Y+v的小数部分。
我们取它附近的四个点为:(X, Y), (X, Y+1), (X+1, Y), (X+1, Y+1)
目标图(x, y)对应的像素值为:f(X, Y)(1-u)(1-v) + f(X, Y+1)(1-u)v + f(X+1, Y)u(1-v) + f(X+1, Y+1)uv
完整工程代码:
https://download.csdn.net/download/llfjcmx/10797231