Opencv图像处理——上采样、下采样、高斯金字塔、拉普拉斯金字塔

本文讲述基于图像上采样和降采样的图像金字塔和api使用


一、图像金字塔

1.1、图像金字塔的概念

      图像金字塔是 图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。
在这里插入图片描述

1.2、高斯金字塔

1.2.1、概念

       高斯金字塔是在图像处理、计算机视觉、信号处理上所使用的一项技术。高斯金字塔本质上为信号的多尺度表示法,亦即将同一信号或图片多次的进行高斯模糊,并且向下取样,藉以产生不同尺度下的多组信号或图片以进行后续的处理,例如在影像辨识上,可以借由比对不同尺度下的图片,以防止要寻找的内容可能在图片上有不同的大小。高斯金字塔的理论基础为尺度空间理论,而后续也衍生出了多分辨率分析。

1.2.2、生成过程

  • 对当前层进行高斯模糊GaussianBlur();
  • 删除当前层的偶数列和行,即得当前层的上一层图像。
    在这里插入图片描述

1.3、拉普拉斯金字塔

       拉普拉斯金字塔的构造用到高斯金字塔。拉普拉斯金字塔第i层的数学定义如下
在这里插入图片描述

       每一层的定义意思是拉普拉斯金字塔每一层的图像为同一层高斯金字塔的图像减去上一层的图像进行上采样并高斯模糊的结果。
       拉普拉斯金字塔是通过原图像减去一系列通过采样操作构成的

二、api图像采样

2.1、执行高斯金字塔构造的降采样:pyrDown();

       简而言之:会模糊图像并对其进行下采样

void pyrDown( InputArray src, OutputArray dst,const Size& dstsize = Size(), 
              int borderType = BORDER_DEFAULT );
/*@param src输入图像。
@param dst output image;它具有指定的大小和与src相同的类型。
@param dstsize输出图像的大小。
@param borderType像素外推方法*/

2.2、执行高斯金字塔构造的上采样:pyrUp();

       简而言之:向上采样图像,然后使其模糊

void pyrUp( InputArray src, OutputArray dst, const Size& dstsize = Size(), 
			int borderType = BORDER_DEFAULT );
/*
@param src输入图像。
@param dst输出图像。它具有指定的大小和与src相同的类型。
@param dstsize输出图像的大小。
@param borderType像素外推方法
*/

2.3、计算两个数组或数组与标量之间的每元素差:subtract();

       简而言之:计算两个数组或数组与标量之间的每元素差

void add(InputArray src1, InputArray src2, OutputArray dst,
         InputArray mask = noArray(), int dtype = -1);
/*
@param src1第一个输入数组或标量。
@param src2第二个输入数组或标量。
@param dst输出数组的大小和通道数与输入数组相同。
@param mask可选操作掩码;这是一个指定元素的8位单通道数组要更改的输出数组的。
@param dtype输出数组的可选深度
*/

2.4、归一化显示:normalize();

       简而言之:规范化数组的范数或值范围

void normalize( InputArray src, InputOutputArray dst, double alpha = 1, double beta = 0,
                int norm_type = NORM_L2, int dtype = -1, InputArray mask = noArray());
/*
@param src输入数组。
@与src大小相同的param dst输出数组。
@param alpha norm值,用于标准化到或范围较低的边界正常化。
@在范围标准化的情况下,param beta上限范围边界;它不用于范数正常化。
@param norm类型规范化类型(请参阅cv::NormTypes)。
@param dtype如果为负数,则输出数组的类型与src相同;否则,输出数组的类型与src相同
*/

三、高斯不同(Dog)

3.1、高斯差分函数

3.1.1、概念

       高斯差分函数,即高斯差(英语:Difference of Gaussians,简称“DOG”)是一种将一个原始灰度图像的模糊图像从另一幅灰度图像进行增强的算法,通过DOG以降低模糊图像的模糊度。这个模糊图像是通过将原始灰度图像经过带有不同标准差的高斯核进行卷积得到的。用高斯核进行高斯模糊只能压制高频信息。从一幅图像中减去另一幅可以保持在两幅图像中所保持的频带中含有的空间信息。这样的话,DOG就相当于一个能够去除除了那些在原始图像中被保留下来的频率之外的所有其他频率信息的带通滤波器

3.1.2、数学原理

       DOG是一个空总额的小波母函数,它从一个窄高斯减去一个宽高斯,是墨西哥帽小波的一个近似。一维情况下它的定义公式如下:
在这里插入图片描述

3.2、GOD定义

       把同一张图像在不同的参数下做高斯模糊之后的结果相减,得到的输出图像,成为高斯不同(DOG)。高斯不同是图像的内在特征,在灰度图像增强、角点检测中经常用到。

四、具体操做

4.1、上(降)采样

程序实现:

#include <opencv2/opencv.hpp>
#include <bits/stdc++.h>

int main() {
	cv::Mat src, dst;
	src = cv::imread("D:\\Myfile\\素材照片\\opencv素材照片\\4.jpg", cv::IMREAD_GRAYSCALE);
	if (src.empty()) {
		std::cout << "your image could not load!";
		return -1;
	}
	char init_name[] = "initial_iamge";
	cv::namedWindow(init_name, cv::WINDOW_AUTOSIZE);
	cv::imshow(init_name, src);
	//高斯金字塔
	cv::pyrUp(src, dst, cv::Size(src.cols * 2, src.rows * 2));//上采样
	//cv::pyrDown(src, dst, cv::Size(src.cols / 2, src.rows / 2));//降采样

	cv::imshow("out", dst);
	cv::waitKey(0);

	return 0;
}

运行结果:
在这里插入图片描述
在这里插入图片描述

4.2、高斯不同+归一化显示

程序实现:

#include <opencv2/opencv.hpp>
#include <bits/stdc++.h>

int main() {
	cv::Mat src, dst;
	src = cv::imread("D:\\Myfile\\素材照片\\opencv素材照片\\4.jpg", cv::IMREAD_GRAYSCALE);
	if (src.empty()) {
		std::cout << "your image could not load!";
		return -1;
	}
	char init_name[] = "initial_iamge";
	cv::namedWindow(init_name, cv::WINDOW_AUTOSIZE);
	cv::imshow(init_name, src);
	//高斯不同
	cv::Mat image1, image2;
	cv::GaussianBlur(src, image1, cv::Size(5, 5), 0, 0);
	cv::GaussianBlur(image1, image2, cv::Size(5, 5), 0, 0);
	cv::subtract(image1, image2, dst, cv::Mat());

	//归一化显示
	cv::normalize(dst, dst, 255, 0, cv::NORM_MINMAX);
	cv::namedWindow("out", cv::WINDOW_AUTOSIZE);
	cv::imshow("out", dst);
	cv::waitKey(0);

	return 0;
}

运行结果:
在这里插入图片描述


五、总结

本文讲述了图像金字塔,通过上下采样来操作图像,以高斯金字塔和拉普拉斯金字塔为例,同时也讲了其他API接口,拉普拉斯金字塔可在参考来源的第二个拉普拉斯金字塔中学习,讲的很全面。

六、参考来源

高斯差分函数链接
拉普拉斯金字塔链接

如有疑问,敬请留言!
如有错误,敬请指正!

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
高斯金字塔拉普拉斯金字塔图像处理中常用的两种金字塔结构。金字塔结构是一种多尺度表示方法,可以用于图像的分割、特征提取等任务。 高斯金字塔的构建原理是通过一系列的高斯滤波和下采样操作,逐层减小图像尺寸,同时保留图像的主要特征。具体步骤如下: 1. 对原始图像进行高斯滤波,得到一组不同尺度的图像; 2. 对每个尺度的图像进行采样,得到一组图像金字塔拉普拉斯金字塔的构建原理是通过高斯金字塔中相邻两层图像的差值,得到一组图像金字塔。具体步骤如下: 1. 对高斯金字塔中每一层图像进行上采样,得到与上一层图像相同尺寸的图像; 2. 将上一层图像减去上采样后的图像,得到当前层的拉普拉斯金字塔。 在Python中,可以使用OpenCV库来构建金字塔结构。具体代码如下: ```python import cv2 # 构建高斯金字塔 def build_gaussian_pyramid(img, levels): pyramid = [img] for i in range(levels): img = cv2.pyrDown(img) pyramid.append(img) return pyramid # 构建拉普拉斯金字塔 def build_laplacian_pyramid(img, levels): gaussian_pyramid = build_gaussian_pyramid(img, levels) pyramid = [] for i in range(levels, 0, -1): gaussian_expanded = cv2.pyrUp(gaussian_pyramid[i]) laplacian = cv2.subtract(gaussian_pyramid[i-1], gaussian_expanded) pyramid.append(laplacian) pyramid.append(gaussian_pyramid[0]) return pyramid # 使用金字塔重构图像 def reconstruct_image(pyramid): img = pyramid[-1] for i in range(len(pyramid)-2, -1, -1): img = cv2.pyrUp(img) img = cv2.add(img, pyramid[i]) return img ``` 其中,`cv2.pyrDown()`函数用于进行采样操作,`cv2.pyrUp()`函数用于进行上采样操作,`cv2.subtract()`函数用于进行差值操作,`cv2.add()`函数用于进行加法操作。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值