Opencv——图像金字塔与图像尺寸缩放
程序员文章站
2022-07-14 11:33:56
...
主要讲解
1、resize()函数调用
函数定义:
调用方式:
resize(srcImage, dstImage, Size(64, 128)); //对图片进行修改
resize(srcImage, dstImage, Size(), 0.5, 0.5);
第6个参数的含义:
INTER_NEAREST:最邻近插值 (放大好用)
INTER_AREA:区域插值(利用像素区域关系的重采样插值) (缩小好用)
INTER_CUBIC:三次样条插值(超过4x4像素邻域内的双三次插值)
INTER_LANCZOS4:Lanczos插值(超过8x8像素邻域的Lanczos插值)
效果展示
将图像用4种方法先缩小6倍再放大6倍得到的效果:
代码展示
#include <opencv2/opencv.hpp>
#include <iostream>
#include "windows.h"
#include <stdio.h>
#include "My_ImageProssing_base.h"
using namespace cv;
using namespace std;
/************修改图片大小示例**********************/
int main()
{
Mat srcImage = imread("D:\\opencv_picture_test\\趣图景图\\test12.jpg");//打开原图
Mat dstImage1, dstImage2, dstImage3, dstImage4; //目标图
Mat tmpImage = srcImage.clone(); //深复制
imshow("未矫正过的图像", srcImage);//显示未矫正的原图
//由于指定缩放的比例,Size()直接给,后面就分别是x、y方向的缩放比例
resize(tmpImage, dstImage1, Size(), 0.5, 0.5, INTER_NEAREST);
resize(tmpImage, dstImage2, Size(), 0.5, 0.5, INTER_AREA);
resize(tmpImage, dstImage3, Size(), 0.5, 0.5, INTER_CUBIC);
resize(tmpImage, dstImage4, Size(), 0.5, 0.5, INTER_LANCZOS4);
for (int i = 0;i < 5;i++)
{
resize(dstImage1,dstImage1, Size(), 0.5, 0.5, INTER_NEAREST);
resize(dstImage2, dstImage2, Size(), 0.5, 0.5, INTER_AREA);
resize(dstImage3, dstImage3, Size(), 0.5, 0.5, INTER_CUBIC);
resize(dstImage4, dstImage4, Size(), 0.5, 0.5, INTER_LANCZOS4);
}
for (int i = 0;i < 5;i++)
{
resize(dstImage1, dstImage1, Size(), 2, 2, INTER_NEAREST);
resize(dstImage2, dstImage2, Size(), 2, 2, INTER_AREA);
resize(dstImage3, dstImage3, Size(), 2, 2, INTER_CUBIC);
resize(dstImage4, dstImage4, Size(), 2, 2, INTER_LANCZOS4);
}
resize(dstImage1, dstImage1, Size(), 2, 2, INTER_NEAREST);
resize(dstImage2, dstImage2, Size(), 2, 2, INTER_AREA);
resize(dstImage3, dstImage3, Size(), 2, 2, INTER_CUBIC);
resize(dstImage4, dstImage4, Size(), 2, 2, INTER_LANCZOS4);
//resize(srcImage, dstImage, Size(64, 128)); //对图片进行修改
//resize(input,output,dSize( , ),fx,fy,插值方式);
//INTER_NEAREST:最邻近插值 (放大好用)
//INTER_AREA:区域插值(利用像素区域关系的重采样插值) (缩小好用)
//INTER_CUBIC:三次样条插值(超过4x4像素邻域内的双三次插值)
//INTER_LANCZOS4:Lanczos插值(超过8x8像素邻域的Lanczos插值)
imshow("最邻近插值", dstImage1);
imshow("区域插值", dstImage2);
imshow("三次样条插值", dstImage3);
imshow("Lanczos插值", dstImage4);
waitKey(0);
return 0;
}
2、pyrUp()、pyrDown()函数调用
pyrUp()(放大)
函数定义:
第4个参数不用管它。
调用方式:
pyrUp(srcImage,dstImage, Size(srcImage.cols * 2, srcImage.rows * 2));
pyrDown()(缩小)
函数定义:
第4个参数不用管它。
调用方式:
pyrDown(srcImage,dstImage, Size(srcImage.cols / 2, srcImage.rows / 2));
原理讲解
1、高斯金字塔
在缩放的过程中难免会造成信息的丢失,为了弥补信息的丢失,产生了拉普拉斯金字塔
2、拉普拉斯金字塔
(G:Gauss L:Laplace)
运算过程图解:
离散化的5*5高斯内核:
上一篇: OpenCV图像金字塔
下一篇: SDL2在VS2015下的安装
推荐阅读
-
荐 opencv进阶学习笔记2:numpy操作图像,色彩空间,查找指定颜色范围,通道分离与合并
-
OpenCV——直方图均衡化equalize_hist与直方图比较(衡量图像相似——明暗角度)
-
OpenCV与图像处理学习二——图像基础知识(下)
-
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
-
opencv图像缩放与图像翻转实例
-
python opencv 图像尺寸变换方法
-
OpenCV图像处理与图像基本操作
-
opencv——分水岭图像分割算法demo思路与应用
-
基于OpenCv与JVM实现加载保存图像功能(JAVA 图像处理)
-
OpenCV-Python 中文教程14——图像金字塔