【OpenCv 4 Python 3.7】图像加载、显示、保存

Python3+OpenCV学习笔记(一):图像加载、显示和保存 利用写博客笔记的方式来进行Python和OpenCV学习,记录学习过程、学习心得和遇到的问题。 阅读详情

在新版本的OpenCV4中,最简单的图像载入和显示只需要3句代码,非常便捷。这三句代码分别对应了三个函数,他们分别是:

imread( ), namedWindow( )以及imshow( )。我们依次来解析一下这三个函数。

1.imread函数

首先,我们看imread函数,可以在OpenCV官方文档中查到其原型如下:

Mat imread(const string& filename, intflags=1 );

■ 第一个参数,const string&类型的filename,填我们需要载入的图片路径名。

在Windows操作系统下,OpenCV的imread函数支持如下类型的图像载入:

Windows位图 - *.bmp, *.dib
JPEG文件 - *.jpeg, *.jpg, *.jpe
JPEG 2000文件- *.jp2
PNG图片 - *.png
便携文件格式- *.pbm, *.pgm, *.ppm
Sun rasters光栅文件 - *.sr, *.ras
TIFF 文件 - *.tiff, *.tif
■ 第二个参数,int类型的flags,为载入标识,它指定一个加载图像的颜色类型。可以看到它自带缺省值1.所以有时候这个参数在调用时我们可以忽略,在看了下面的讲解之后,我们就会发现,如果在调用时忽略这个参数,就表示载入三通道的彩色图像。

可以在OpenCV中标识图像格式的枚举体中取值。通过转到定义,我们可以在imgcodecs_c.h中发现这个枚举的定义是这样的:
CV_LOAD_IMAGE_ANYDEPTH ,如果取这个标识的话,若载入的图像的深度为16位或者32位,就返回对应深度的图像,否则,就转换为8位图像再返回。
CV_LOAD_IMAGE_COLOR ,如果取这个标识的话,总是转换图像到彩色一体
CV_LOAD_IMAGE_GRAYSCALE,如果取这个标识的话,始终将图像转换成灰度

如果输入有冲突的标志,将采用较小的数字值。比如CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYCOLOR 将载入3通道图。

如果想要载入最真实的图像,选择CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR。

因为flags是int型的变量,如果我们不在这个枚举体中取值的话,还可以这样来:

flags >0返回一个3通道的彩色图像。
flags =0返回灰度图像。
flags <0返回包含Alpha通道的加载的图像。
需要注意的点:输出的图像默认情况下是不载入Alpha通道进来的。如果我们需要载入Alpha通道的话呢,这里就需要取负值。

2.namedWindow函数

顾名思义,namedWindow函数,用于创建一个窗口。

函数原型是这样的:

void namedWindow(const string& winname,int flags=WINDOW_AUTOSIZE ); 

■ 第一个参数,const string&型的name,即填被用作窗口的标识符的窗口名称。

■ 第二个参数,int 类型的flags ,窗口的标识,可以填如下的值:

WINDOW_NORMAL设置了这个值,用户便可以改变窗口的大小(没有限制)
WINDOW_AUTOSIZE如果设置了这个值,窗口大小会自动调整以适应所显示的图像,并且不能手动改变窗口大小。
WINDOW_OPENGL 如果设置了这个值的话,窗口创建的时候便会支持OpenGL。
函数剖析:

首先需要注意的是,它有默认值WINDOW_AUTOSIZE,所以,一般情况下,这个函数我们填一个变量就行了。

namedWindow函数的作用是,通过指定的名字,创建一个可以作为图像和进度条的容器窗口。如果具有相同名称的窗口已经存在,则函数不做任何事情。

我们可以调用destroyWindow()或者destroyAllWindows()函数来关闭窗口,并取消之前分配的与窗口相关的所有内存空间。

但话是这样说,其实对于代码量不大的简单小程序来说,我们完全没有必要手动调用上述的destroyWindow()或者destroyAllWindows()函数,因为在退出时,所有的资源和应用程序的窗口会被操作系统会自动关闭。

3.imshow函数

在指定的窗口中显示一幅图像。

void imshow(const string& winname, InputArray mat);

■ 第一个参数,const string&类型的winname,填需要显示的窗口标识名称。

■ 第二个参数,InputArray 类型的mat,填需要显示的图像。

这里的InputArray 我们讲一下吧,不然一直是个梗在这边。通过转到定义大法,我们可以在highgui.hpp中查到imshow的原型:

CV_EXPORTS_W void imshow(const string&winname, InputArray mat);
进一步对InputArray转到定义,在mat.hpp中查到一个typedef声明:

typedef const _InputArray& InputArray;
这其实一个类型声明引用,就是说_InputArray和InputArray是一个意思,既然他们是一个意思,我们就来做最后一步,对_InputArray进行转到定义,终于,我们在mat.hpp发现了InputArray的真身:
_InputArray类的里面首先定义了一个枚举,然后是各类的模板类型和一些方法。更复杂的我们暂且不挖深讲了,很多时候,遇到函数原型中的InputArray类型,我们把它简单地当做Mat类型就行了。

imshow 函数详解:

imshow 函数用于在指定的窗口中显示图像。如果窗口是用CV_WINDOW_AUTOSIZE(默认值)标志创建的,那么显示图像原始大小。否则,将图像进行缩放以适合窗口。而imshow 函数缩放图像,取决于图像的深度:

如果载入的图像是8位无符号类型(8-bit unsigned),就显示图像本来的样子。
如果图像是16位无符号类型(16-bit unsigned)或32位整型(32-bit integer),便用像素值除以256。也就是说,值的范围是[0,255 x 256]映射到[0,255]。
如果图像是32位浮点型(32-bit floating-point),像素值便要乘以255。也就是说,该值的范围是[0,1]映射到[0,255]。
还有一点,若窗口创建(namedWindow函数)的时候,如果设定了支持OpenGL(WINDOW_OPENGL ),那么imshow还支持ogl::Buffer ,ogl::Texture2D以及gpu::GpuMat作为输入。

四、输出图像到文件——imwrite函数

在OpenCV中,输出图像到文件,我们一般都用imwrite函数,它的声明如下:

bool imwrite(const string& filename,InputArray img, const vector& params=vector() );
■ 第一个参数,const string&类型的filename,填需要写入的文件名就行了,带上后缀,比如,“123.jpg”这样。

■ 第二个参数,InputArray类型的img,一般填一个Mat类型的图像数据就行了。

■ 第三个参数,const vector&类型的params,表示为特定格式保存的参数编码,它有默认值vector(),所以一般情况下不需要填写。而如果要填写的话,有下面这些需要了解的地方:

对于JPEG格式的图片,这个参数表示从0到100的图片质量(CV_IMWRITE_JPEG_QUALITY),默认值是95.
对于PNG格式的图片,这个参数表示压缩级别(CV_IMWRITE_PNG_COMPRESSION)从0到9。较高的值意味着更小的尺寸和更长的压缩时间,而默认值是3。
对于PPM,PGM,或PBM格式的图片,这个参数表示一个二进制格式标志(CV_IMWRITE_PXM_BINARY),取值为0或1,而默认值是1。
函数解析:

imwrite函数用于将图像保存到指定的文件。图像格式是基于文件扩展名的,可保存的扩展名和imread中可以读取的图像扩展名一样,为了方便查看,我们在这里再列一遍:

Windows位图 - *.bmp, *.dib
JPEG文件 - *.jpeg, *.jpg, *.jpe
JPEG 2000文件- *.jp2
PNG图片 - *.png
便携文件格式- *.pbm, *.pgm, *.ppm
Sun rasters光栅格式 - *.sr, *.ras
TIFF 文件 - *.tiff, *.tif

代码实现:

import cv2 as cv
import numpy as np


def video_demo():
    capture = cv.VideoCapture(0) #本机摄像头,也可以放置视频文件
    while(True):
        ret, frame = capture.read()  #返回值,每一帧
        frame = cv.flip(frame, 1)   #左右上下调换
        cv.imshow("video", frame)
        c = cv.waitKey(50)
        if c == 27:
            break


def get_image_info(image):
    print(type(image))
    print(image.shape)
    print(image.size)
    print(image.dtype)    #字节位数
    pixel_data = np.array(image)
    print(pixel_data)


print("--------- Hello Python ---------")
src = cv.imread("E:/ji_qi_xue_xi/opencv_kejian/opencv_python_image/lena.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
get_image_info(src)
video_demo()
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
cv.imwrite("E:/ji_qi_xue_xi/opencv_kejian/opencv_python_image/result.png", gray)  #imwrite读取n维数组
cv.waitKey(0)

cv.destroyAllWindows() 
初识openCV--图像的读取,显示和保存 import cv2# 初始化摄像头print("无法打开摄像头!")exit()# 初始化参数brightness = 0 # 亮度contrast = 1.0 # 对比度rotation_angle = 0 # 旋转角度# 创建窗口# 创建按钮区域# 按钮位置和标签# 鼠标回调函数# 设置鼠标回调print("无法读取视频帧!")break# 调整亮度和对比度# 旋转图像# 绘制按钮# 显示图像# 按下 'Esc' 键退出break# 释放资源并关闭窗口。 阅读详情

相关推荐

『OpenCV-Python』安装以及图像的读取、显示、保存

OpenCV 是一个开源的计算机视觉库,广泛应用于图像处理、机器学习和实时计算机视觉应用。比如图像和视频的滤镜和降噪、物体检测、人脸识别、证件号识别、车牌识别等应用。当然,也有其他工具可以对这些领域做支持,但本专栏是介绍 OpenCV 的,所以只讲 OpenCV 的好话。OpenCV 对「数字图像」提供了很多种功能函数,图像是由像素组成,而每个像素包含了颜色、亮度、饱和度等信息,这些信息在计算机中都是以数据的方式保存(通常是各种类型的数字),OpenCV 很擅长操作和处理这些数据。

weixin_39415598的博客 1731

OpenGL像素操作

今天我们先简单介绍Windows中常用的BMP文件格式,然后讲OpenGL的像素操作。虽然看起来内容可能有点多,但实际只有少量几个知识点,如果读者对诸如“显示BMP图象”等内容比较感兴趣的话,可能不知不觉就看完了。像素操作可以很复杂,这里仅涉及了简单的部分,让大家对OpenGL像素操作有初步的印象。 学过多媒体技术的朋友可能知道,计算机保存图象的方法通常有两种:一是“矢量图”,一是“像素图”。矢...

weixin_34049948的博客 353

OpenCV之图像的读入、显示、保存——python/C++实现

注1:python3实现是基于OpenCV3.4.4      , C++实现是基于OpenCV2.4.9   一、Python实现 首选导入python接口的OpenCV模块: import cv2 读入图像:使用cv2.imread()函数读入图像,不支持中文读取路径 显示图像:使用cv2.imshow()函数显示图像 保存图像:使用cv2.imwrite()函数保存图像,不支持中...

鬼刀 1983

python opengl 截图_OpenCV Python OpenGL纹理

I want to overlay 3d objects on OpenCV feed. I found an example here That uses webcam video as texture in OpenGL. I changed some part so that it works with cv2. Now the output is something strangeCODE...

weixin_39616798的博客 248

python3中opencv图片读取与展示

图像入门 目标 在这里你将学会怎样读入一幅图像,怎样显示一幅图像,以及如何保存一幅图像 你将学习这些函数:cv2.imread(),cv2.imshow(),cv2.imwrite() 或者,您将学习如何使用Matplotlib显示图像 读入图像 使用函数cv2.imread()来读取图像。图像应该在工作目录中,或者应该给出图像的完整路径。 imread(filename[,...

hubing的博客 1万+

[Python从零到壹] 三十四.OpenCV入门详解——显示读取修改及保存图像

欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍。上一篇文章介绍了图像处理基础知识,这篇文章将详细讲解OpenCV入门知识,包括OpenCV常见数据类型、显示图像、读取像素、修改像素、创建图像、复制图像、保存图像等内容。希望文章对您有所帮助,如果有不足之处,还请海涵。接下来,让我们开启整个系列的学习吧!

杨秀璋的专栏 1万+

OpenCV4一部分函数目录

仅用于目前opencv我学到的需要使用的知识点基本简析和使用说明

一个程序猿的工作知识深化日常 4186

自然语言处理:稀疏向量表示

稀疏向量表示是指运用特定的方法和技术,将数据(如文本、图像、信号等)转化为向量形式,且该向量具有大部分元素值为零,仅少数元素值非零的特征,以此来实现对数据的高效存储、处理和分析。

老赵爱学习的博客 1444

OpenGL(十) 截屏并保存BMP文件

BMP文件格式 BMP图像又称为Bitmap(位图),是Windows系统中广泛采用的图像格式。BMP文件的数据按照从文件头开始的先后顺序分为四个部分: 我们一般见到的图像以24位图像为主,即R、G、B三种颜色各用8个bit来表示,这样的图像称为真彩色,这种格式不需要调色表,所以位图信息头后紧跟的、从文件头开始偏移54个字节就是位图数据了。 BMP图像...

weixin_30390075的博客 808

深入解析Gerber RS274X文件格式:从基础语法到实战应用

本文深入解析PCB制造的核心标准Gerber RS274X文件格式,详细介绍了其基础语法、坐标系统、功能码以及嵌入式光圈定义等关键特性。通过实战案例演示了如何解析和手写Gerber指令,并总结了常见错误与调试技巧,帮助PCB工程师掌握这一与制造工厂沟通的“通用语言”,确保设计准确无误地转化为实体电路板。

weixin_29252171的博客 96

【算法】图解A* 搜索算法

A* 算法是启发式搜索算法,是根据Dijkstra算法改进而来。 问题引入 如下图所示,S为起始(start)节点,G为目标(goal)节点。 节点之间连线是两点的路径长度,如A到E的路径长度c(A,E) = 9。 节点旁的h值时当前节点到达目标节点(G)的预估值,如h(A)=15, 表示从当前点A到达目标点G的估计路径长度为15,此处h(x)即为启发函数,启发函数的设计有很多方法,具体可......

zhuhua造轮子的博客 4万+

Python 中各种imread函数的区别与联系

Python 中各种imread函数的区别与联系最近一直在用python做图像处理相关的东西,被各种imread函数搞得很头疼,因此今天决定将这些imread总结一下,以免以后因此犯些愚蠢的错误。如果你正好也对此感到困惑可以看下这篇总结。当然,要了解具体的细节,还是应该 read the fuck code和API document,但貌似python的很多模块文档都不是很全,所以只能多看代码和注释

walter 的博客 5万+

【EtherCAT实践篇一】TwinCAT 3安装、使用

FULL(XAE)安装包:包含了XAR的功能,并能进行多种语言的编程和硬件组态,通常安装在编程电脑上;XAR安装包:包含了ADS的功能,是实时运行环境,对 TwinCAT 模块进行加载、执行、管理、实时运行与调用,通常安装在PLC中;RM安装包:在装了高版本的TwinCAT 3后,发现PLC中的TwinCAT版本较低,就需要安装相应低版本的RM安装包切换版本使用(注:4024无法使用RM安装包切换到低于4022的版本,如4020/4018/4016版本。

JXES智能生态系统 5128

OpenCV Python教程(1、图像的载入、显示和保存)

转载请详细注明原作者及出处,谢谢! 本文是OpenCV  2 Computer Vision Application Programming Cookbook读书笔记的第一篇。在笔记中将以Python语言改写每章的代码。 PythonOpenCV的配置这里就不介绍了。 注意,现在OpenCV for Python就是通过NumPy进行绑定的。所以在使用时必须掌握一些NumPy的相关知识!

sunny2038的专栏 49万+

Android BSP 开发深度解析:驱动开发、系统定制与调试实战

本文系统介绍了Android BSP开发的核心技术要点,重点探讨了外设驱动开发与调试方法。文章首先解析了Android系统分层架构和BSP的关键作用,详细阐述了Linux内核驱动开发基础,包括字符设备、平台设备和输入子系统驱动的实现方法。随后针对触摸屏、WIFI、蓝牙、USB、摄像头和屏幕等常见外设,深入分析了驱动开发要点和调试技巧。此外,还梳理了Android系统启动流程,介绍了常用调试工具和方法论,并提供了面试常见问题及参考答案。全文内容全面实用,为Android底层开发人员提供了系统的技术指南。

郑伟强dev的专栏 293

基于ESP32和OV5640的目标检测系统

本文详细介绍了基于ESP32-S3和OV5640摄像头构建目标检测系统的完整方案。系统采用YOLOv8-Nano轻量级模型,通过INT8量化实现边缘部署,在UXGA分辨率下达到25fps帧率。文章从硬件选型、图像采集优化、模型量化部署、实时推理流水线构建等维度展开,重点解决了内存管理、电源稳定性和异常处理等嵌入式系统关键问题。该方案在资源受限条件下实现了150ms以内的端到端延迟,为物联网视觉应用提供了低成本、低功耗的解决方案,适用于智能家居、工业检测等多个场景。

reset2021的博客 329

OpenCV——图片的加载、显示、保存(python)

OpenCV-Python——图片的加载、显示、保存本小节,我们将学习在Python语言中利用OpenCV库来实现图片的读取、显示、保存,所有的这些图片都是一个numpy.ndarray,这三种操作都过cv2.imread()、cv2.imshow()、cv2.imwrite()三个函数来实现,同时在文末,简要介绍了使用Matplotlib来显示图片。本文所使用opencv为opencv3.2版本,

u014630987的博客 13万+

基于A*算法的二维栅格地图路径规划与避障MATLAB仿真

本文将介绍如何使用MATLAB编写基于A*算法的二维栅格地图路径规划与避障的仿真程序。我们可以使用二维数组表示地图,其中每个元素表示一个栅格的状态,例如1表示障碍物,0表示可行走区域。接下来,我们需要定义A*算法的节点类。G值表示从起始节点到当前节点的代价,H值是启发式函数估计的从当前节点到目标节点的代价。算法,我们可以有效地找到起始点到目标点的最短路径,并在仿真中进行可视化展示。算法的基本思路是从起始节点开始,按照一定的启发式函数选择下一个节点,直到找到目标节点或者遍历完所有可行走区域。

ByteWhizX的博客 1273

OpenCV python(一):安装 && 获取、显示、保存图像

本篇文章内容包括安装opencv-python,可复制的初始获取图像程序框架;以及使用opencv-python获取图像、显示图像、保存图像、即一些摄像头判断、键操作等。

xztli的博客 1万+

Open3D——点云构建Delaunay三角网【2026最新版】

点云构建Delaunay三角网

点云侠的博客 8371

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

OpenCV图像的加载、显示与保存

笔记主要来自王刚老师和<<OpenCV-Python-Tutorial-中文版>>,所以这篇博客可能不会开源,仅私密为个人使用 OpenCV学习手札1.学习环境一级目录一级目录一级目录二级目录三级目录 1.学习环境 Win 10 + Python 3.7 + OpenCV 4.2 一级目录 一级目录 一级目录 二级目录 三级目录 ...

郑德帅 1692

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Opencv-Python:图像尺寸、图像的读取、显示、保存与复制

在使用opencv的方法时,首先必须导入opencv包。新的opencv导入cv2,这里也和cv做了一个对比 import cv2 一、图像尺寸 图像的大小可以通过其shape属性来获取,shape返回的是一个tuple元组,第一个元素表示图像的高度,第二个表示图像的宽度,第三个表示像素的通道数。 示例: if __name__ == '__main__': dirfile

Daisy_HJL的博客 14万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Opencv-Python(4):OpenCV图像读取/显示/保存

win7 64位系统 python版本:3.6.8 (x64) opencv版本:3.2.0.8 IDE:pycharm2017(Ananconda 3.5.2) 代码: import cv2 # 读入图像,两种路径格式 # img_path = 'C:/Course/images/trex.png' img_path =r'C:\Course\images\trex....

图灵追幕者博客录 2642

【OpenCV】Python OpenCV的基本图像处理操作:读取、显示、保存、获取属性

Python OpenCV的基本图像处理操作包括读取图像、显示图像、保存图像、获取图像属性等。 一、读取图像 实例1.1读取当前项目目录下的 二、显示图像 实例1.2显示图像1.6.3 三、保存图像 实例1.3按照指定路径保存图像1.6.4 四、获取图像属性 实例1.4分别获取彩色图像和灰度… ...

量化Mike 6418

OpenCV笔记之三——图像的加载、显示及保存

三、图像的加载、显示及保存 1、源代码展现 load_display_save.py from __future__ import print_function import argparse import cv2 # Construct the argument parser and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", required = True, help = "Pa

东寻的博客 777

python opencv保存图片到指定路径_基于python-opencv3的图像显示和保存操作

import cv2 as cvimport numpy as np#导入库print("-------------------------------")image = cv.imread("D:/1.jpeg") #写入图像cv.imshow("image",image) #显示cv.waitKey()...

weixin_39767386的博客 6377
上一篇: 【OpenCv 4 Python 3.7】数字验证码识别
下一篇: 【OpenCv 4 Python 3.7】Numpy数组操作
YL_python_C++_java
博客等级 码龄7年 1392粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值