OpenCV 图像上采样和降采样

简介: OpenCV 图像上采样和降采样

相关概念


图像金字塔


  1. 我们在图像处理中常常会调整图像大小,最常见的就是放大(zoom in)和缩小(zoom out),尽管几何变换也可以实现图像放大和缩小,但是这里我们介绍图像金字塔


  1. 一个图像金字塔式一系列的图像组成,最底下一张是图像尺寸最大,最上方的图像尺寸最小,从空间上从上向下看就想一个古代的金字塔。


现实中金字塔是这样的:



图像金字塔排列时候是这样的:



图像的金字塔变换我们可以理解为是一种图像的大小变换,是在保证图像的特征不变的情况下来进行图像大小的变换,图像处理中图像大小的变换中最常见的就是放大(zoom in)和缩小(zoom out),则对于图像金字塔来说从上向下变换就是放大,增大分辨率,从下向上变换就是缩小,减小分辨率。


高斯金字塔


高斯金字塔:用来对图像进行降采样。


高斯金字塔本质上为信号的多尺度表示法,亦即将同一信号或图片多次的进行高斯模糊,并且向下取样,藉以产生不同尺度下的多组信号或图片以进行后续的处理,例如在影像辨识上,可以借由比对不同尺度下的图片,以防止要寻找的内容可能在图片上有不同的大小。


高斯金字塔的理论基础为尺度空间理论,而后续也衍生出了多分辨率分析。



高斯金字塔的相关知识与概念我们可以总结为:高斯金字塔是从底向上,逐层降采样得到;


降采样后的图像是原图像(像素大小为X×Y)的X/2×Y/2,也就是对原图像删除偶数行与列(即得到降采样之后上一层的图片)。


高斯金字塔的生成过程


高斯金字塔的生成过程分为两部:


  1. 对当前层进行高斯模糊


  1. 对模糊后的图像删除当前层的偶数行与列,即可得到上一层的图像,这样子上一层与下一层图像相比都只有他的1/4大小



高斯不同(Difference of Gaussian-DOG):


定义:高斯不同就是把同一张图像在不同的参数下做高斯模糊之后的结果相减,得到的输出图像就成为高斯不同(DOG)


高斯不同是图像的内在特征,在灰度图像增强、角点检测中经常用到。


拉普拉斯金字塔


拉普拉斯金字塔:来重建一张图片根据他的上层降采样图片。


采样相关API


上采样(cv::pyrUp) – zoom in 放大


函数原型:


void cv::pyrUp( 
  InputArray _src, 
  OutputArray _dst, 
  const Size& _dsz = SIze(), 
  int borderType = BORDER_DEFAULT 
)


函数参数:


  • src,输入图像,Mat类对象即可;


  • dst,输出图像,和源图像有一样的尺寸和类型;


  • dstsize,输出图像的大小,有默认值Size(),即默认情况下,由Size(src.cols*2,src.rows*2)来计算,且需要满足以下条件


| dstsize.width-src.cols*2 | <= (dstsize.width mod 2)
| dstsize.height-src.rows*2 | <= (dstsize.height mod 2)


  • borderType,边界模式。


例如:生成的图像是原图在宽与高各放大两倍


pyrUp(Mat src, Mat dst, Size(src.cols*2, src.rows*2))


另:


pyrUp函数执行高斯金字塔的采样操作,其实也可用拉普拉斯金字塔的,步骤如下:


  • 它通过插入可为零的行与列,对源图像进行向上采样操作,


  • 将结果与pyrDown()乘以4的内核做卷积。


降采样 (cv::pyrDown) – zoom out 缩小


函数原型为:


CV_EXPORTS_W void pyrDown( 
  InputArray src, 
  OutputArray dst,
  const Size& dstsize = Size() 
);


参数为:


  • src,输入图像,Mat类对象即可;


  • dst,输出图像,和源图像有一样的尺寸和类型;


  • dstsize,输出图像的大小,有默认值Size(),即默认情况下,由


Size(src.cols2,src.rows2)来计算,且需要满足以下条件


| dstsize.width2 - src.cols | <= 2


| dstsize.height2 - src.rows | <= 2


  • borderType,边界模式。


该pyrDown()函数执行了高斯金字塔建筑,首先,它将源图像与如下内核做



接着,它便通过对图像的偶数行和列做插值来进行向下采样操作。


例如:生成的图像是原图在宽与高各缩小1/2


pyrDown(Mat src, Mat dst, Size(src.cols/2, src.rows/2))


代码案例



#include <iostream>
#include <math.h>
#include <opencv2/opencv.hpp>
#include<opencv2/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>  
using namespace cv;
using namespace std;
int main()
{
  Mat src, src_up, src_down, src_dog;
  src = imread("./test2.jpg");
  if (src.empty())
  {
    cout << "could not load the image" << endl;
    return -1;
  }
  imshow("orign_image", src);
  // UP 上采样
  pyrUp(src, src_up, Size(src.cols * 2, src.rows * 2));
  imshow("UP", src_up);
  // DOWN 下采样
  pyrDown(src, src_down, Size(src.cols / 2, src.rows / 2));
  imshow("DOWN", src_down);
  // DOG 高斯不同
  Mat src_gray, g1, g2, dst;
  cvtColor(src, src_gray, CV_BGR2GRAY);
  GaussianBlur(src_gray, g1, Size(7, 7), 0, 0);
  GaussianBlur(g1, g2, Size(7, 7), 0, 0);
  subtract(g1, g2, dst, Mat());
  normalize(dst, dst, 255, 0, NORM_MINMAX);
  imshow("DOG", dst);
  waitKey(0);
  destroyAllWindows();
  return 0;
}


相关文章
|
1月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
360 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
2月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
51 4
|
2月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
3月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
WK
|
3月前
|
编解码 计算机视觉 Python
如何在OpenCV中进行图像转换
在OpenCV中,图像转换涉及颜色空间变换、大小调整及类型转换等操作。常用函数如`cvtColor`可实现BGR到RGB、灰度图或HSV的转换;`resize`则用于调整图像分辨率。此外,通过`astype`或`convertScaleAbs`可改变图像数据类型。对于复杂的几何变换,如仿射或透视变换,则可利用`warpAffine`和`warpPerspective`函数实现。这些技术为图像处理提供了强大的工具。
WK
113 1
|
5月前
|
算法 计算机视觉
【Qt&OpenCV 图像的感兴趣区域ROI】
【Qt&OpenCV 图像的感兴趣区域ROI】
178 1
|
5月前
|
运维 算法 计算机视觉
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
82 1
|
5月前
|
存储 编解码 算法
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
96 0
|
4月前
|
机器学习/深度学习 XML 计算机视觉
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
|
5月前
|
计算机视觉
OpenCV中图像算术操作与逻辑操作
OpenCV中图像算术操作与逻辑操作
70 1
下一篇
无影云桌面