当前位置: 首页 > news >正文

open cv图像上采样与下采样

什么是上采样和下采样

从上向下 上采样 分辨率越高 2倍
从下向上 降采样 分辨率越低 2/1
图片采样越高 分辨率更密集清晰
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述

图像金字塔概念

1.我们在图像处理中常常会调整图像大小,最常见的就是放
大(zoom in)和缩小( zoom out) , 尽管几何变换也可以实
现图像放大和缩小,但图像金字塔可以保证每一层图像的特征不变

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

3.不同尺度空间寻找图片特征
在这里插入图片描述


图像金字塔的方法

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

拉普拉斯金字塔-用来重建一张图片根据它的上层降
采样图片


图像金字塔概念-高斯金字塔

高斯金子塔是从底向上, 逐层降采样得到

降采祥之后图像大小是原图像M(宽)xN(高)的 M/2 x N/2
,就是对原图像删除偶数行与列(缩减),即得到降采样
之后上一层的图片


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

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

2.删除当前层的偶数行与列即可得到
上一层的图像,这样上一层跟下一层
相比,都只有它的1/4大小


高斯不同(Difference of Gaussian-DOG)

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

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


采样相关API

●上采样(x:pyrUp) - zoom in放大

pyrUp(Mat src, dest, Size(src.cols2, src.rows2))
生成的每一层图像是上一层图的宽与高各放大两倍

●降采样 (x:pyrDown)- zoom out缩小

pyrDown( src,dest, Size(src.cols/2, src.rows/2))
生成的每一层图像是上一层图的宽与高各缩小2/1

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <iostream>
#include <math.h>

using namespace cv;
using namespace std;

Mat src, dst,dst1,dst2,dst3,dst4;

void pyrUPandDOWN(int, void*);

int main()
{

	src = imread("D:/实验台/机器视觉/测试图片/盖茨.jpg");
	if (src.empty())
	{
		cout << "无法打开" << endl;
		return -1;
	}
	imshow("原图",src);
	pyrUPandDOWN(0,0);

	waitKey(0);
	return 0;
}

void pyrUPandDOWN(int, void*)
{
	//上采样与下采样
	pyrUp(src, dst, Size(src.cols * 2, src.rows * 2));
	//imshow("上采样",dst);//图片变大4倍,分辨率不变
	pyrDown(src, dst1, Size(src.cols/2, src.rows/2));
	//imshow("降采样", dst1);//图片缩小为4/1,分辨率不变
    //上采样和下采样只能放大和缩小4倍 只能*2或/2

	//图像放大与缩小
	resize(src,dst2, Size(src.cols/2, src.rows/2));
	//imshow("放大",dst2);
	//可以放大和缩小任意的倍数



	printf("原图%d %d\n",src.cols,src.rows);
	printf("上采样%d %d\n", dst.cols, dst.rows);
	printf("下采样%d %d\n", dst1.cols, dst1.rows);
	printf("放大缩小%d %d\n", dst2.cols, dst2.rows);
	

基于图像金字塔的高斯不同(DOG)

	Mat  gary,g1, g2,dogimg;

	cvtColor(src, gary, CV_BGR2GRAY);//先转换为灰度图
	GaussianBlur(gary,g1,Size(5,5),1,1);//高斯模糊层次分明
	imshow("高斯模糊一", g1);
	GaussianBlur(g1, g2, Size(5,5),1,1);//卷积核越大越模糊 获得的层次线条越粗
	imshow("高斯模糊二",g2);

	//对每一层图像进行高斯模糊提取特征
	//与原图像图像特征相匹配 识别 
	
	subtract(g1,g2,dogimg, Mat());//Mat可以不要 关于像素操作的加减乘除运算 不论单通道灰度还是三通道彩图都是可以使用的
	imshow("减运算",dogimg);
	//减运算(,);
	//将两个图像g1、g2的像素值相减赋给图像dog
	//得到黑漆漆的图片
	//因为灰度值差值低 所以黑 轮廓不明显 差异不大 

	//归一化操作
	//可将图像像素值控制在某个范围之内。(用于扩大或缩小像素范围)
	normalize(dogimg,dogimg,255,0,NORM_MINMAX);//255-0时与0-255差异不大
	//将图片数组归一化 到0到255之间,dogimg为输入输出图像数组;
	//255为最大值;0为最小值;类型为NORM_MINMAX 
	// NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化
	//计算公式:最大值255 *(用图像中的每个像素值-最小像素值)/(图像中最大像素值-最小像素值)+ 最小值
	//图片变亮 轮廓明显 差异明显
	
	imshow("高斯不同",dogimg);
}

在这里插入图片描述

高斯金字塔的作用(为什么需要上采样,下采样,高斯模糊,减运算,高斯不同)

用于图像的重组重建 和 特征提取

整个高斯金字塔,或者说是差分高斯金字塔是我们确定SIFT特征的基础,
让我们首先想想高斯金字塔到底干了一件什么事情,他到底模仿的是什么?
答案很容易确定,高斯金字塔模仿的是图像的不同的尺度,尺度应该怎样理解?
对于一副图像,你近距离观察图像,与你在一米之外观察,看到的图像效果是不同的,
前者比较清晰,后者比较模糊,前者比较大,后者比较小,通过前者能看到图像的一些细节信息,
通过后者能看到图像的一些轮廓的信息,这就是图像的尺度,图像的尺度是自然存在的,
并不是人为创造的。好了,到这里我们明白了,其实以前对一幅图像的处理还是比较单调的,
因为我们的关注点只落在二维空间,并没有考虑到“图像的纵深”这样一个概念,
如果将这些内容考虑进去我们是不是会得到更多以前在二维空间中没有得到的信息呢?于是高斯金字塔横空出世了,它就是为了在二维图像的基础之上榨取出图像中自然存在的另一个维度:尺度。因为高斯核是唯一的线性核也就是说使用 高斯核对图像模糊不会引入其他噪声因此就选用了高斯核来构建图像的尺度

相关文章:

  • C#中的Main方法
  • open cv阈值的基本操作
  • GridView 点击子View时设置子View的背景色为透明
  • open cv常见算子与自定义线性滤波
  • open cv边缘的处理
  • open cvSobel算子与Scharr算子
  • 如何学习一个新的PHP框架
  • open cvLaplance算子
  • SINOCES 2012 消费电子
  • open cvCanny检测
  • Android布局之weight属性解析
  • open cv霍夫变换-直线检测
  • 初识C语言 数组名的函数传递与按键跳出
  • mysql + unidac 使用事务例子
  • poj1204
  • python3.6+scrapy+mysql 爬虫实战
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • export和import的用法总结
  • Github访问慢解决办法
  • Java IO学习笔记一
  • javascript从右向左截取指定位数字符的3种方法
  • JavaWeb(学习笔记二)
  • Linux中的硬链接与软链接
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Promise面试题2实现异步串行执行
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • vue--为什么data属性必须是一个函数
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 初识 webpack
  • 初探 Vue 生命周期和钩子函数
  • 小李飞刀:SQL题目刷起来!
  • 用Python写一份独特的元宵节祝福
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​决定德拉瓦州地区版图的关键历史事件
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (1)虚拟机的安装与使用,linux系统安装
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (ZT)出版业改革:该死的死,该生的生
  • (备忘)Java Map 遍历
  • (多级缓存)多级缓存
  • (五)网络优化与超参数选择--九五小庞
  • (一)UDP基本编程步骤
  • (译) 函数式 JS #1:简介
  • (转)ORM
  • .apk 成为历史!
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .Net Web项目创建比较不错的参考文章
  • .Net下的签名与混淆
  • .NET中winform传递参数至Url并获得返回值或文件
  • /3GB和/USERVA开关
  • @SpringBootApplication 包含的三个注解及其含义
  • [ C++ ] 继承
  • [\u4e00-\u9fa5] //匹配中文字符