opencv-python图像读写模块示例详解

 更新时间:2023年07月06日 08:40:49   作者:寒水浮云  
这篇文章主要介绍了opencv-python图像读写模块,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

这个分类记录自己学习opencv的随笔文档,方便以后查询和复习。python-opencv环境配置网上教程很多,此处就不做赘述了,该文档记录opencv最基础的图像读写和显示,以及图像编码解码,工具是jupyter notebook。

1 opencv中,图像读取函数是 imread(filename, flags=None)

参数说明:

filename:读取图像的路径,通常支持jpg、png、bmp、tiff等格式文件。

flags:图片读入的模式,模式定义在cv::ImreadModels中,默认值为IMREAD_COLOR。还有一个常用的模式是:IMREAD_GRAYSCALE,对应值为 0,以灰度图方式读取图片。

注意:imread函数返回一个BGR形式的图像对象,其类型为一个numpy数组。

2 显示图像的函数是 imshow(window_name, image)

参数说明:window_name是一个字符串,代表要在其中显示图像的窗口的名称。image是它是要显示的图像。

可以用 namedWindow(window_name, flag)来定义一个窗口,如果没有定义会根据 imshow 的参数自动生成一个窗口。已经定义的窗口可以用 resizeWindow(window_name,width,height) 来改变窗口大小。

import cv2  
import numpy as np
img=cv2.imread('C:/Users/86188/Desktop/test/python/cat.jpg',cv2.IMREAD_COLOR)  #读取图片<br>
cv2.imshow('showimg',img) #显示图片
cv2.waitKey(0)           #等待用户操作
cv2.destroyWindow('window') #销毁窗口

3 除了直接用opencv的imshow来显示图片,也可以用matplotlib来显示图片

注意需要在显示的时候进行图片通道翻转(直接用::-1,也可以用cvtColor()函数进行颜色通道翻转),否则显示的图片颜色会异常,因为正常图片的格式是RGB,但是opencv读取进来的格式是BGR。

用opencv来显示图像通常需要好几行代码,可以自己封装成函数,需要的时候直接调用:

4 opencv中图像的属性

在OpenCV中,图像是一个NumPy数组,我们可以使用numpy数组的属性来访问图像属性:

  • 图像类型- 图像的数据结构。OpenCV中的图像是numpy.ndarray,我们可以将其访问为type(img)。
  • 图像形状- 它是以[H, W, C]格式表示的形状。其中H,W和C分别是图像的高度,宽度和通道数 ,我们可以将其访问为img.shape。
  • 图像大小- 它是图像中像素的总数。它也是数组中元素的总数。我们可以将其访问为img.size。
  • 数据类型- 它是图像数组元素的dtype。我们可以将其访问为img.dtype。

5 图片保存 imwrite(filename,img)

参数说明: filename 表示保存的文件名称,img 是需要保存的图像对象。

创建窗口,读取显示和保存图像的实例如下:

import cv2
#创建窗口
cv2.namedWindow('img',cv2.WINDOW_NORMAL)
cv2.resizeWindow('img',640,480)
#读取图片
img = cv2.imread('./cat.jpg')
while True:
    cv2.imshow('img',img)
    key = cv2.waitKey(0)  #该函数的返回值为ASCII码,参数0表示:等待 0 毫秒后,用户可以通过按键盘上的任意键来销毁所有窗口。
    if key == ord('q'): #如果键盘输入q,退出
        break
    elif key == ord('s'):  #如果键盘输入s,保存图片到 当前文件夹下, ord()是把输入的字符转换为对应的ASCII码。
        cv2.imwrite('./mycat.png',img)
    else:
        print(key)
cv2.destroyAllWindows()  #销毁当前所有窗口

 此外,opencv中也可以进行多幅图像的读取,函数是 imreadmulti(filename) 参数filename是待读取的图像文件路径,返回的结果是tuple类型,包含两个值,第一个为bool类型,表示是否读取成功;第二个参数是list类型,保存读取的图像结果。多幅图像保存可以用imwritemulti(filename,img) .参数filename表示保存的图像文件名称,img是图像数据。

6 图像编码 imencode(ext,img)

参数说明:ext: 文件扩展名,用来决定输出格式。img: 待编码图像数据。

图像编码后保存在文件中,这里涉及到文件的读写操作,Python内置了读写文件的函数 with open语句。常用的读写操作如下:

with open('filename.txt', 'r') as f:
   content = f.read(f)  #文件的读操作<br>
with open('data.txt', 'w') as f:
   f.write('hello world')  #文件的写操作

下面将读取的图像进行编码,然后保存到txt文件中(编码后要把数据转换为二进制)。

import cv2   #图像编码为数据流,方便网络传输
import numpy as np
img = cv2.imread('cat.jpg')
ret,img_encode = cv2.imencode(' .jpg',img) #图像编码,返回值ret为bool类型,img_encode为返回的数据流,ndarray格式
print(type(img_encode)) 
bytes_encode = img_encode.tobytes() #把编码的数据类型转换为bytes二进制
print(type(bytes_encode))
with open("imencode.txt","wb") as f: #以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    f.write(bytes_encode)            # 把数据存储到文本中

执行完成后,会在当前路径下生成imencode.txt文件,其中保存着编码后的图像数据。但是文本打开没法正常显示二进制,会乱码。

7 图像解码 imdecode(buf, flags)

参数说明:buf: bytes类型的输入数据流,flags: 解码标志,由ImreadModes定义,常用的有IMREAD_GRAYSCALE, IMREAD_COLOR 。

下面从刚才保存的txt文件中读取图像数据流,然后将数据流解码为图像显示(要把读取的数据流转换为ndarray格式再进行解码)。

import cv2       #图像解码
import numpy as np
with open('imencode.txt','rb') as f: #以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
    data_encode = f.read()            #从文件中读取图像数据
img_array = np.frombuffer(data_encode,dtype=np.uint8)  # 把读取的数据流转换为ndarray(数组)格式
img_decode = cv2.imdecode(img_array,cv2.IMREAD_COLOR) #图像解码
cv2.imshow('img_decode',img_decode)
cv2.waitKey(0)
cv2.destroyAllWindows()

到此这篇关于opencv-python图像读写模块的文章就介绍到这了,更多相关opencv-python图像读写内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 利用python实现微信头像加红色数字功能

    利用python实现微信头像加红色数字功能

    通过Python实现将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果。下面通过本文给大家分享python实现微信头像加红色数字功能,感兴趣的朋友一起看看吧
    2018-03-03
  • OpenCV绘制圆端矩形的示例代码

    OpenCV绘制圆端矩形的示例代码

    本文主要介绍了OpenCV绘制圆端矩形的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • tensorflow 获取所有variable或tensor的name示例

    tensorflow 获取所有variable或tensor的name示例

    今天小编就为大家分享一篇tensorflow 获取所有variable或tensor的name示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • Python数据可视化之简单折线图的绘制

    Python数据可视化之简单折线图的绘制

    这篇文章主要为大家详细介绍了Python数据可视化之绘制简单折线图的相关资料,文中的示例代码简洁易懂,感兴趣的小伙伴可以了解一下
    2022-10-10
  • python实操案例练习(八)

    python实操案例练习(八)

    这篇文章主要介绍了python实操案例练习,本篇文章主要分享的案例内容有记录用户登录日志、模拟淘宝客服自动回复,下面详细的内容,需要的小伙伴可以参考一下。希望对你有所帮助
    2022-02-02
  • 基于python绘制科赫雪花

    基于python绘制科赫雪花

    这篇文章主要为大家详细介绍了基于python绘制科赫雪花,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • python利用7z批量解压rar的实现

    python利用7z批量解压rar的实现

    这篇文章主要介绍了python利用7z批量解压rar的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Python Pygame实战之欢乐打地鼠游戏

    Python Pygame实战之欢乐打地鼠游戏

    打地鼠是一款比较经典的敏捷类游戏,我们可以在许多商场门口看到这类游戏机,在电脑和手机上也有许多类似的游戏。本文将用Python中的Pygame库实现这一游戏,需要的可以参考一下
    2022-02-02
  • python3学习之Splash的安装与实例教程

    python3学习之Splash的安装与实例教程

    splash 是一个python语言编写的用于配合scrapy解析js的库,下面这篇文章主要给大家介绍了关于python3学习之Splash的安装与使用的一些相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-07-07
  • pandas实现将日期转换成timestamp

    pandas实现将日期转换成timestamp

    今天小编就为大家分享一篇pandas实现将日期转换成timestamp,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12

最新评论