Opencv--图像金字塔

目标

理论

注意

下面的解释属于Bradski和Kaehler 的“ 学习OpenCV ”一书。

  • 通常我们需要将图像转换成与原始图像不同的大小。为此,有两个可能的选择:升高图像(放大)或缩小(缩小)。
  • 虽然有一个几何变换中的OpenCV函数-literally-调整图像大小(CV ::调整大小,我们将在以后的教程显示),在该部分中,我们分析第一使用图像金字塔,这是在广泛应用的视觉范围广泛的应用。

图像金字塔

  • 图像金字塔是由单个原始图像产生的图像的集合,它们被连续下采样,直到达到一些所需的停止点。
  • 有两种常见的图像金字塔:高斯金字塔:用于缩减图像拉普拉斯金字塔:用于从金字塔中较低的图像重建上采样图像(分辨率较低)
  • 在本教程中,我们将使用高斯金字塔。

高斯金字塔

  • 想象一下金字塔是一组层,层数越高,尺寸越小。

OpenCV图像金字塔

  • 每个层从底部到顶部编号,因此层(i+1)(表示为Gi+1)小于层i(Gi)。
  • 为了在高斯金字塔中产生层(i+1),我们做如下:

将Gi与高斯内核进行卷积:

OpenCV图像金字塔

删除每个偶数行和列。

  • 您可以轻松注意到,所得到的图像将是其前身的四分之一。在输入图像(原始图像)上迭代该过程产生整个金字塔。G0
  • 上面的过程对于缩小图像是有用的。如果我们想使它更大,怎么办?:填充零的列()0
  1. 首先,将图像大小增加到每个维度的两倍,即新的偶数行和
  2. 用与上述相同的内核(乘以4)执行卷积近似“丢失像素”的值
  • 这两个过程(如上所述的下采样和上采样)由OpenCV函数cv :: pyrUpcv :: pyrDown实现,我们将在下面的代码示例中看到:

注意

当我们减小图像的大小时,我们实际上丢失了图像的信息。

 

代码实现:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;

int main(int argc, char** argv) {
	Mat src,dst1,dst2;
	src = imread("C:/usr/opencv-test/Testpictures/sight.jpg");
	if (!src.data)
	{
		printf("load image failed!\n");
		return -1;
	}
	namedWindow("src image", CV_WINDOW_AUTOSIZE);
	imshow("src image", src);


	//上采样
	pyrUp(src, dst1, Size(src.cols * 2, src.rows * 2));
	imshow("dst1 image", dst1);

	//降采样
	pyrDown(src, dst2, Size(src.cols / 2, src.rows / 2));
	imshow("dst2 image", dst2);

	//DOG(高斯不同)
	Mat gray_src, g1, g2, dogImg;
	cvtColor(src, gray_src, CV_BGR2GRAY);
	GaussianBlur(gray_src, g1, Size(3, 3), 0, 0); //高斯模糊
	GaussianBlur(g1, g2, Size(3, 3), 0, 0);
	subtract(g1, g2, dogImg, Mat());

	//归一化显示
	normalize(dogImg, dogImg, 255, 0, NORM_MINMAX);
	imshow("DOG Image", dogImg);

	
	waitKey(0);
	return 0;
}

效果图:

image_pyramid
DOG(高斯不同)
​​​

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值