1、resize()函数
最简单的图像变换就是调整图像大小。resize()函数用于调整图像的大小。根据输入的图像和尺寸,生成所需尺寸的新图像。
void cv::resize(
cv::InputArray src,
cv::OutputArray dst,
cv::Size dsize,
double fx = 0, e
double fy = 0,
int interpolation = CV::INTER_LINEAR
);
可以用两种方式指定输出图像的大小。一种方法是使用绝对尺寸; 在这种情况下,dsize参数直接设置结果图像dst的大小。另一种选择是使用相对大小; 在这种情况下,将dsize设置为Size(0,0),并将fx和fy分别设置为想要应用于x和y轴的比例因子。最后一个参数是插值方法,其默认为线性插值。其他可用选项如表1所示。
表1 cv::resize()插值选项
cv::INTER_NEAREST | cv::INTER_LINEAR | cv::INTER_AREA |
cv::INTER_CUBIC | cv::INTER_LANCZOS4 |
默认插值方法是双线性插值,但可以选择其他方法。最简单的方法是从源图像中最接近的像素处获取已调整大小的像素值; 这时选择插值INTER_NEAREST。或者,可以根据它们与目标像素的接近程度,对2×2邻域的源像素值进行线性加权,这就是INTER_LINEAR所做的。也可以将新的,重新调整大小的像素放置在旧像素上,然后对INTER_AREA中的像素值进行平均。对于更平滑的插值,可以选择在4×4 邻域源图像中的像素,然后从拟合样条中读出相应的目标值,这时选择INTER_CUBIC插值方法。Lanczos插值与INTER_CUBIC方法类似,但使用来自像素周围8×8邻域的信息。
2、 图像金字塔
图像金字塔广泛用于各种视觉应用。图像金字塔是图像的集合,全部来自单个原始图像被连续降采样,直到达到某个所需的停止点。(这个停止点可能是单像素图像!)在文献和应用中经常出现两种图像金字塔:Gaussian和Laplacian金字塔。高斯金字塔用于降采样图像,当想从金字塔中较低的图像重建上采样图像时,需要拉普拉斯金字塔。
通常,首先用高斯核对图像进行卷积,然后去除每一个偶数行和列,从金字塔的i层产生高斯金字塔中的(i + 1)层。当然,在这种情况下,每张图片的面积恰好是其原面积的四分之一。在输入图像上迭代这个过程会产生整个金字塔。OpenCV提供了一种生成每个金字塔阶段的方法:
void cv::pyrDown(
cv::InputArray src,
cv::OutputArray dst,
const cv::Size& dstsize = cv::Size()
);
如果将目标大小参数dstsize设置为cv :: Size()的默认值,那么cv :: pyrDown()方法输出图像的默认大小是((src.cols + 1)/ 2,(src.rows+ 1)/ 2)。也可以提供一个dstsize,它将指示希望输出图像的大小; 然而,dstsize必须遵守一些非常严格的限制。此限制意味着目标图像非常接近源图像大小的一半。dstsize参数仅用于处理有些特殊的情况,在这种情况下需要对如何构建金字塔进行严格的控制。
如果有一个图像,并希望构建一系列新的图像,每个图像都从他们的源图像缩小。函数cv :: buildPyramid()在一次调用中创建了这样一组图像。
void cv::buildPyramid(
cv::InputArray src,
cv::OutputArrayOfArrays dst,
int maxlevel
);
参数src是源图像。参数dst是一个OutputArrayOfArrays,可以把它看作是一个STL vector<>或OutputArray类型的对象。最常见的例子是vector 。参数maxlevel指出要构建多少金字塔等级。参数maxlevel是大于或等于0的任何整数,指示要生成的金字塔图像数量。当buildPyramid()运行时,它将返回一个长度为maxlevel + 1的dst中的向量。dst中的第一项将与src相同。第二个将是一半,就像调用pyrDown()一样。第三个将是第二个的一半。
可以通过pyrUp()操作将现有图像转换为每个方向两倍大的图像:
void cv::pyrUp(
cv::InputArray src,
cv::OutputArray dst,
const cv::Size& dstsize = cv::Size()
);
在这种情况下,图像首先在每个维度上升为原来的两倍,新行填充0。之后,用高斯滤波器进行卷积以估算“缺失”像素的值。
类似于PyrDown(),如果dstsize被设置为Size()的默认值,那么生成的图像的大小将是src的两倍。同样,可以提供一个dstsize来指示想要的输出图像的大小,但它必须再次遵守一些非常严格的约束条件。
注意, pyrUp()不是pyrDown()的逆函数。因为pyrDown()是一个丢失信息的操作符。为了恢复原始图像,需要访问下采样过程丢弃的信息。这些数据形成拉普拉斯金字塔。图像大小调整比较简单,这里只提供一个简单的示例程序。
例1 调整图像大小
#include#includeusingnamespace std;usingnamespace cv;int main(intargc, char** argv){ Mat src = imread("E:/ img1.bmp", 1); imshow("原始图像", src); Mat dst; resize(src, dst, Size(500, 500)); imshow("resize图像", dst); Mat pyrDownImg; pyrDown(src, pyrDownImg); imshow("下采样图像", pyrDownImg); waitKey(0); return 0;}