OpenCV-图像处理(13、图像上采样和降采样)

版权声明:本文由 Micheal 超 博客 创作,转载请附带链接,有问题欢迎交流。 https://blog.csdn.net/qq_42887760/article/details/86190793

图像金字塔概念

  1. 我们在图像处理中常常会调整图像大小,最常见的就是放大(zoom in)和缩小(zoom out),尽管几何变换也可以实现图像放大和缩小,但是这里我们介绍图像金字塔
  2. 一个图像金字塔式一系列的图像组成,最底下一张是图像尺寸最大,最上方的图像尺寸最小,从空间上从上向下看就想一个古代的金字塔。
    在这里插入图片描述
  • 高斯金子塔 – 用来对图像进行降采样
  • 拉普拉斯金字塔 – 用来重建一张图片根据它的上层降采样图片(分辨率较低)

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

  • 高斯金子塔是从底向上,逐层降采样得到。
  • 降采样之后图像大小是原图像MxN的M/2 x N/2 ,就是对原图像删除偶数行与列,即得到降采样之后上一层的图片。
  • 高斯金子塔的生成过程分为两步:
    • 1.对当前层进行高斯模糊
    • 2.删除当前层的偶数行与列
      即可得到上一层的图像,这样上一层跟下一层相比,都只有它的1/4大小。
      在这里插入图片描述

高斯不同(Difference of Gaussian-DOG)

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

采样相关API

  • 上采样(cv::pyrUp) – zoom in 放大
    pyrUp(Mat src, Mat dst, Size(src.cols2, src.rows2))
    生成的图像是原图在宽与高各放大两倍

  • 降采样 (cv::pyrDown) – zoom out 缩小
    pyrDown(Mat src, Mat dst, Size(src.cols/2, src.rows/2))
    生成的图像是原图在宽与高各缩小1/2

代码案例:

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

using namespace cv;

int main(){
	//1. 加载图像和显示原图
	Mat src=imread("E:/Experiment/OpenCV/Pictures/dog2.jpg");
	if(src.empty()){
		printf("could not load image...");
		return -1;
	}
	namedWindow("input_windows",CV_WINDOW_AUTOSIZE);
	imshow("input_windows",src);//显示图片

	//2. 创建两个Mat对象来存储操作的结果,并执行采样操作
	Mat dst1,dst2;
	//2.1. 上采样
	pyrUp(src, dst1, Size(src.cols * 2, src.rows * 2));//上采样,生成的图像是原图在宽与高各放大两倍
    imshow("pyrUp", dst1);
	//2.2. 下采样
    pyrDown(src, dst2, Size(src.cols / 2, src.rows / 2));//降采样,生成的图像是原图在宽与高各缩小1/2
    imshow("pyrDown", dst2);


	//高斯不同
	Mat gray_src,gblur1,gblur2,gblur3,dogImg,dogImg2,dogImg3;
	cvtColor(src, gray_src, COLOR_BGR2GRAY);

	GaussianBlur(gray_src, gblur1, Size(3, 3), 0, 0);
    GaussianBlur(gblur1, gblur2, Size(3, 3), 0, 0);//方式一
    subtract(gblur1, gblur2, dogImg, Mat());//获取 DOG ,应该要低的gblur1减高的gblur2
    //将灰度图的0-255空间,转换到0-1空间(二值空间),让原本淡淡的图像变得清楚了
    normalize(dogImg, dogImg, 255, 0, NORM_MINMAX);//参数:255最大值,0最小值,NORM_MINMAX 最大最小化
    imshow("dogImg", dogImg);//能看到淡淡的猫的眼睛的轮廓
	GaussianBlur(gray_src, gblur3, Size(5, 5), 0, 0);
    subtract(gblur1, gblur3, dogImg2, Mat());//方式二
    normalize(dogImg2, dogImg2, 255, 0, NORM_MINMAX);
    imshow("dogImg2", dogImg2);//也能看到淡淡的猫的眼睛的轮廓

    subtract(gblur2, gblur1, dogImg3, Mat());//高减低的
    normalize(dogImg3, dogImg3, 255, 0, NORM_MINMAX);
    imshow("dogImg3", dogImg3);

	waitKey(0);
	return 0;
}

运行截图:

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

小案例:

1. 加载图片
2. 进行上采样(按’u’后):
3. 执行下采样(按’d’后):
4. 退出程序(按’Esc’后):

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

using namespace cv;


int main(){
	//1. 加载图像和显示原图
	Mat src=imread("E:/Experiment/OpenCV/Pictures/dog2.jpg");
	if(src.empty()){
		printf("could not load image...");
		return -1;
	}
	namedWindow("input_windows",CV_WINDOW_AUTOSIZE);
	imshow("input_windows",src);//显示图片
	
	Mat temp,dst;
	temp=src;
	dst=temp;
	while(true){
		int c;
		c = waitKey(10);
		if( (char)c == 27 ){//Esc键
			break;
		}
		else if( (char)c == 'u' ){ 
			pyrUp( temp, dst, Size( temp.cols*2, temp.rows*2 ) );
			printf( "** Zoom In: Image x 2 \n" );
		}
		else if( (char)c == 'd' )
		{ 
			pyrDown( temp, dst, Size( temp.cols/2, temp.rows/2 ) );
			printf( "** Zoom Out: Image / 2 \n" );
		}
		imshow( "output_windows", dst );
		temp = dst;
	}

	waitKey(0);
	return 0;
}

推荐博客

  1. https://blog.csdn.net/LYKymy/article/details/83153927
  2. https://blog.csdn.net/huanghuangjin/article/details/80958983

猜你喜欢

转载自blog.csdn.net/qq_42887760/article/details/86190793