Python使用OpenCV对图像进行缩放功能

OpenCV:图片缩放和图像金字塔

对图像进行缩放的最简单方法当然是调用resize函数啦!

resize函数可以将源图像精确地转化为指定尺寸的目标图像。

要缩小图像,一般推荐使用CV_INETR_AREA来插值;若要放大图像,推荐使用CV_INTER_LINEAR。

现在说说调用方式

第一种,规定好你要图片的尺寸,就是你填入你要的图片的长和高。

#include<opencv2\opencv.hpp>
#include<opencv2\highgui\highgui.hpp>
using namespace std;
using namespace cv;

//图片的缩小与放大
int main()
{
    Mat img = imread("lol5.jpg");
    imshow("原始图", img);

    Mat dst = Mat::zeros(512, 512, CV_8UC3); //我要转化为512*512大小的
    resize(img, dst, dst.size());

    imshow("尺寸调整之后", dst);

    waitKey(0);

}

第二种,填入你要缩小或者放大的比率。

#include<opencv2\opencv.hpp>
#include<opencv2\highgui\highgui.hpp>

using namespace std;
using namespace cv;
//图片的缩小与放大
int main()
{
    Mat img = imread("lol5.jpg");
    imshow("原始图", img);
    Mat dst;
    resize(img, dst, Size(),0.5,0.5);//我长宽都变为原来的0.5倍
    imshow("尺寸调整之后", dst);
    waitKey(0);
}

接下来说说图像金字塔

说白了,图像金字塔就是用来进行图像缩放的,干的事情跟resize函数没两样,那我们还需要学它吗?我觉得有必要的额,因为在学习卷积神经网络中会遇到这个名词,所以都学一学吧,搞图形都绕不过他!

说说什么是图像金字塔。

其实非常好理解,如上图所示,我们将一层层的图像比喻为金字塔,层级越高,则图像尺寸越小,分辨率越低。

两种类型的金字塔:

  • 高斯金字塔:用于下采样,主要的图像金字塔;
  • 拉普拉斯金字塔:用于重建图像,也就是预测残差(我的理解是,因为小图像放大,必须插入一些像素值,那这些像素值是什么才合适呢,那就得进行根据周围像素进行预测),对图像进行最大程度的还原。比如一幅小图像重建为一幅大图像,

图像金字塔有两个高频出现的名词:上采样和下采样。现在说说他们俩。

  • 上采样:就是图片放大(所谓上嘛,就是变大),使用PryUp函数
  • 下采样:就是图片缩小(所谓下嘛,就是变小),使用PryDown函数

下采样将步骤:

对图像进行高斯内核卷积

将所有偶数行和列去除

下采样就是图像压缩,会丢失图像信息。

上采样步骤:

  • 将图像在每个方向放大为原来的两倍,新增的行和列用0填充;
  • 使用先前同样的内核(乘以4)与放大后的图像卷积,获得新增像素的近似值。

上、下采样都存在一个严重的问题,那就是图像变模糊了,因为缩放的过程中发生了信息丢失的问题。要解决这个问题,就得看拉普拉斯金字塔了。

下面给出OpenCV中pryUp和pryDown的用法。

#include<opencv2\opencv.hpp>
#include<opencv2\highgui\highgui.hpp>

using namespace std;
using namespace cv;
//图像金字塔
int main()
{
    Mat img = imread("lol8.jpg");
    imshow("原始图", img);
    Mat dst,dst2;
    pyrUp(img, dst, Size(img.cols*2, img.rows*2)); //放大一倍
    pyrDown(img, dst2, Size(img.cols * 0.5, img.rows * 0.5)); //缩小为原来的一半
    imshow("尺寸放大之后", dst);
    imshow("尺寸缩小之后", dst2);
    waitKey(0);
}

显然,无论是放大还是缩小,图像都变得模糊了,这就是他的致命缺点。

个人认为,要做缩放就用resize函数吧,毕竟方便太多而且图像不会变模糊!

到此这篇关于Python使用OpenCV对图像进行缩放功能的文章就介绍到这了,更多相关OpenCV图像缩放内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解Python+OpenCV进行基础的图像操作

    目录 介绍 形态变换 腐蚀 膨胀 创建边框 强度变换 对数变换 线性变换 去噪彩色图像 使用直方图分析图像 介绍 众所周知,OpenCV是一个用于计算机视觉和图像操作的免费开源库. OpenCV 是用 C++ 编写的,并且有数千种优化的算法和函数用于各种图像操作.很多现实生活中的操作都可以使用 OpenCV 来解决.例如视频和图像分析.实时计算机视觉.对象检测.镜头分析等. 许多公司.研究人员和开发人员为 OpenCV 的创建做出了贡献.使用OpenCV 很简单,而且 OpenCV 配备了许多工

  • Python OpenCV机器学习之图像识别详解

    目录 背景 一.人脸识别 二.车牌识别 三.DNN图像分类 背景 OpenCV中也提供了一些机器学习的方法,例如DNN:本篇将简单介绍一下机器学习的一些应用,对比传统和前沿的算法,能从其中看出优劣: 一.人脸识别 主要有以下两种实现方法: 1.哈尔(Haar)级联法:专门解决人脸识别而推出的传统算法: 实现步骤: 创建Haar级联器: 导入图片并将其灰度化: 调用函数接口进行人脸识别: 函数原型: detectMultiScale(img,scaleFactor,minNeighbors) sc

  • Python OpenCV图像处理之图像滤波特效详解

    目录 1分类 2邻域滤波 2.1线性滤波 2.2非线性滤波 3频域滤波 3.1低通滤波 3.2高通滤波 1 分类 图像滤波按图像域可分为两种类型: 邻域滤波(Spatial Domain Filter),其本质是数字窗口上的数学运算.一般用于图像平滑.图像锐化.特征提取(如纹理测量.边缘检测)等,邻域滤波使用邻域算子——利用给定像素周围像素值以决定此像素最终输出的一种算子 频域滤波(Frequency Domain Filter),其本质是对像素频率的修改.一般用于降噪.重采样.图像压缩等. 按

  • 基于Python OpenCV实现图像的覆盖

    目录 前言 1.导入相关库 2.使用OpenCV读取和显示图像 3.从物体的图像中去除背景 4.添加对象到背景图像 5.结果展示 前言 在本文中,我将展示如何将对象从一个图像添加到另一个图像.为此,我们需要: 1.背景图像; 2.对象 3.对象的mask(mask为黑色,其他空间为白色). 在我们的例子中,背景是一张大海的照片,对象是一杯咖啡.在这里,他们是: 1.导入相关库 现在,使用jupiter notebook创建一个新文件.首先,我们需要导入必要的模块: import cv2 # Op

  • Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)

    前言 总结一下最近看的关于opencv图像几何变换的一些笔记. 这是原图: 1.平移 import cv2 import numpy as np img = cv2.imread("image0.jpg", 1) imgInfo = img.shape height = imgInfo[0] width = imgInfo[1] mode = imgInfo[2] dst = np.zeros(imgInfo, np.uint8) for i in range( height ): f

  • Python使用OpenCV对图像进行缩放功能

    OpenCV:图片缩放和图像金字塔 对图像进行缩放的最简单方法当然是调用resize函数啦! resize函数可以将源图像精确地转化为指定尺寸的目标图像. 要缩小图像,一般推荐使用CV_INETR_AREA来插值:若要放大图像,推荐使用CV_INTER_LINEAR. 现在说说调用方式 第一种,规定好你要图片的尺寸,就是你填入你要的图片的长和高. #include<opencv2\opencv.hpp> #include<opencv2\highgui\highgui.hpp> u

  • Python使用 OpenCV 进行图像投影变换

    目录 投影变换(仿射变换) 在数学中,线性变换是将一个向量空间映射到另一个向量空间的函数,通常由矩阵实现.如果映射保留向量加法和标量乘法,则映射被认为是线性变换. 要将线性变换应用于向量(即,一个点的坐标,在我们的例子中——像素的 x 和 y 值),需要将该向量乘以表示线性变换的矩阵.作为输出,你将获得一个坐标转换后的向量. 投影变换可以用以下矩阵表示: 其中: 是一个旋转矩阵.该矩阵定义了将要执行的变换类型:缩放.旋转等. 是平移向量.它只是移动点. 是投影向量.对于仿射变换,该向量的所有元素

  • Python在OpenCV里实现极坐标变换功能

    在中学里学习过直角坐标系,也叫做笛卡尔坐标系,它是正交坐标系,不过也学习过极坐标系,这种坐标系比较适合大炮发射的场合.极坐标系的定义如下: 在 平面内取一个定点O, 叫极点,引一条射线Ox,叫做极轴,再选定一个长度单位和角度的正方向(通常取逆时针方向).对于平面内任何一点M,用ρ表示线段OM的长度,θ表示从Ox到OM的角度,ρ叫做点M的极径,θ叫做点M的极角,有序数对 (ρ,θ)就叫点M的极坐标,这样建立的坐标系叫做极坐标系. 极坐标很方便应用到雷达上面,因为雷达不断地转动,反射回来的波计算出距

  • Python基于opencv实现的简单画板功能示例

    本文实例讲述了Python基于opencv实现的简单画板功能.分享给大家供大家参考,具体如下: import cv2 import numpy as np drawing = False # true if mouse is pressed ix,iy = -1,-1 def nothing(x): pass # mouse callback function def draw_circle(event,x,y,flags,param): global ix,iy,drawing g = par

  • Python基于opencv的图像压缩算法实例分析

    本文实例讲述了Python基于opencv的图像压缩算法.分享给大家供大家参考,具体如下: 插值方法: CV_INTER_NN - 最近邻插值, CV_INTER_LINEAR - 双线性插值 (缺省使用) CV_INTER_AREA - 使用象素关系重采样.当图像缩小时候,该方法可以避免波纹出现.当图像放大时,类似于 CV_INTER_NN 方法.. CV_INTER_CUBIC - 立方插值. 函数 cvResize 将图像 src 改变尺寸得到与 dst 同样大小.若设定 ROI,函数将按

  • python使用opencv resize图像不进行插值的操作

    如下所示: def resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None): 如果使用vanilla resize,不改变默认参数,就会对原图像进行插值操作.不关你是扩大还是缩小图片,都会通过插值产生新的像素值. 对于语义分割,target的处理,如果是对他进行resize操作的话.就希望不产生新的像素值,因为他的颜色信息,代表了像素的类别信息. 但是我们有时候希望resize之后不产生新的像素值,而是产生利用最近邻点

  • python 利用opencv实现图像网络传输

    本代码主要实现的是利用网络传输图片,用在我的树莓派项目之上.该项目在PC上运行服务端,树莓派上运行客户端,两者连接到同一局域网中,修改代码中的IP地址,就可以实现将树莓派采集到的图像数据实时传输到PC端.先运行服务端代码,然后运行客户端代码即可.树莓派摄像头使用的是普通的USB摄像头,并且在树莓派上安装了opencv,在树莓派上安装opencv的过程可以参考https://www.pyimagesearch.com/2017/09/04/raspbian-stretch-install-open

  • python 用opencv实现图像修复和图像金字塔

    我们将学习如何通过一种称为修复的方法去除旧照片中的小噪音,笔画等.基本思路很简单:用相邻像素替换那些坏标记,使其看起来像邻域. cv2.inpaint() cv2.INPAINT_TELEA cv2.INPAINT_NS import numpy as np import cv2 as cv img = cv.imread('messi_2.jpg') mask = cv.imread('mask2.png',0) dst = cv.inpaint(img,mask,3,cv.INPAINT_T

  • python 基于opencv 绘制图像轮廓

    图像轮廓概念 轮廓是一系列相连的点组成的曲线,代表了物体的基本外形. 谈起轮廓不免想到边缘,它们确实很像.简单的说,轮廓是连续的,边缘并不全都连续(下图).其实边缘主要是作为图像的特征使用,比如可以用边缘特征可以区分脸和手:而轮廓主要用来分析物体的形态,比如物体的周长和面积等,可以说边缘包括轮廓. 寻找轮廓的操作一般用于二值图像,所以通常会使用阈值分割或Canny边缘检测先得到二值图. 注意:寻找轮廓是针对白色物体的,一定要保证物体是白色,而背景是黑色,不然很多人在寻找轮廓时会找到图片最外面的一

  • python基于opencv 实现图像时钟

    解决方案详解 绘制表盘 表盘上只有60条分/秒刻线和12条小时刻线,当然还有表盘的外部轮廓圆,也就是重点在如何画72根线.先把简单的圆画出来: import cv2 as cv import math import datetime import numpy as np margin = 5 # 上下左右边距 radius = 220 # 圆的半径 center = (center_x, center_y) = (225, 225) # 圆心 # 1. 新建一个画板并填充成白色 img = np

随机推荐