本文主要是介绍手撕OpenCV源码之图像金字塔,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
图像金字塔
图像金字塔式多分辨率处理的一种方法,多分辨率处理理论有效的统一了多个学科的技术,多分辨率处理技术包括来自信号处理的子带编码,来自数字语音识别的正交滤波及金字塔图像处理。如其名称所示,多分辨率理论涉及多个分辨率下的信号(或图像)表示与分析。这种方法的优势很明显,,某种分辨率下无法检测的特性,可以在另外的分辨率下很容易检测。
我们观察图像时,看到的通常是由相似纹理和灰度级连成的区域,他们相结合形成了物体。如果物体的尺寸较小或者对比度较低,那么我们通常以较高分辨率来研究他们;如果物体的尺寸较大,或者对比度较高,则粗略的观察就已足够。如果较小物体和较大物体(对比度较低和较高的物体)同时存在,那么以不同分辨率来研究他们讲更具优势,当然这就是多分辨率处理的基本动机。
从数学角度来看,图像是具有局部变化统计特性灰度值的二维阵列,而这种统计特性是有类似边缘和对比同质区域突变特性的不同组合导致的。例如在同一幅图像的不同部分,局部直方图可能变化很明显,这就使得为整幅图建立统计模型非常困难,甚至不可能建立统计模型。
以多种分辨率来表示图像的一种结构就是图像金字塔,这种结构非常有效,且结构简单。图像金字塔最初用于机器视觉和图像压缩,是一系列以金字塔形状排列的、分辨率逐步降低的图像集合。本文将介绍opencv中金字塔函数的使用方法,以及代码实现细节。关于代码的实现,本次将结合opencv中opencl的实现进行分析。
1. 函数原型
pyrUp
void cv::pyrUp (InputArray src,OutputArray dst,const Size & dstsize = Size(),int borderType = BORDER_DEFAULT
)
该函数实现的功能是滤波放大,函数接口很好理解,简介如下:
- src,dst:输入输出图像
- size:这个参数默认值是dst的size,就是Size(src.cols*2, src.rows*2);如果用户自己设置输出的size,则需要满足如下条件:
|dstsize.width−src.cols∗2| ≤ (dstsize.widthmod2) |dstsize.height−src.rows∗2| ≤ (dstsize.heightmod2)
pyrDown
void cv::pyrDown(InputArray src,OutputArray dst,const Size& dstsize = Size(),int borderType = BORDER_DEFAULT
)
该函数实现的功能是滤波缩小,函数接口与pyrUp类似。只是size满足的条件相反:
|dstsize.width * 2 − src.cols| ≤ (dstsize.widthmod2) |dstsize.height * 2 − src.rows| ≤ (dstsize.heightmod2)
2. pyrUp 与 pyrDown 示例代码
#include "iostream"
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
using namespace std;
using namespace cv;
const char* window_name = "Pyramids Demo";
int main( int argc, char** argv )
{cout << "\n Zoom In-Out demo \n ""------------------ \n"" * [i] -> Zoom in \n"" * [o] -> Zoom out \n"" * [ESC] -> Close program \n"
这篇关于手撕OpenCV源码之图像金字塔的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!