计算机视觉(opencv-python)入门之图像的读取,显示,与保存

news/2025/2/26 12:59:04

        在计算机视觉领域,Python的cv2库是一个不可或缺的工具,它提供了丰富的图像处理功能。作为OpenCV的Python接口,cv2使得图像处理的实现变得简单而高效。

 示例图片

目录

opencv%E8%8E%B7%E5%8F%96%E6%96%B9%E5%BC%8F-toc" name="tableOfContents" style="margin-left:0px">opencv获取方式

图像基本知识

颜色空间

RGB

HSV

CV2常用图像处理方法

cv2.imread()-toc" name="tableOfContents" style="margin-left:80px">读取图像cv2.imread()

  imread各flags参数含义详解

读取结果说明

Ndarray说明

获取单通道颜色矩阵

显示图像

cv2.imshow()%E6%98%BE%E7%A4%BA%E5%9B%BE%E5%83%8F-toc" name="tableOfContents" style="margin-left:120px">使用cv2.imshow()显示图像

cv2.waitKey()-toc" name="tableOfContents" style="margin-left:160px">cv2.waitKey()

cv2.destroyAllWindows()-toc" name="tableOfContents" style="margin-left:160px">cv2.destroyAllWindows()

使用plt.imshow()显示图像

总结


opencv%E8%8E%B7%E5%8F%96%E6%96%B9%E5%BC%8F" name="opencv%E8%8E%B7%E5%8F%96%E6%96%B9%E5%BC%8F" style="margin-left:0.0001pt; margin-right:0px; text-align:justify">opencv获取方式

python">pip install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple opencv-python

图像基本知识

颜色空间

        颜色空间是一种用来表示颜色的数学模型,它描述了如何将颜色信息数字化,以便于计算机进行处理和分析。在计算机视觉和图像处理领域,常见的颜色空间包括RGB、HSV等。

RGB

        RGB颜色空间是最常用的颜色空间之一,它基于红(Red)、绿(Green)、蓝(Blue)三种基本颜色,通过调整这三种颜色的强度和组合,可以产生各种颜色。

        在RGB颜色空间中,每个颜色的强度值范围通常在0到255之间,分别代表红、绿、蓝三种颜色的亮度。通过调整这些亮度值,可以混合出各种颜色。例如,当RGB三个通道的强度值都为0时,表示黑色;当RGB三个通道的强度值都为255时,表示白色。

RGB颜色调色板 

        HEX是一种常用于网页设计和图像处理中的颜色表示方法,它通过六位十六进制数来表示RGB颜色空间中的颜色。在HEX表示法中,前两位代表红色强度,中间两位代表绿色强度,最后两位代表蓝色强度。 

        通过改变这三个值的不同组合,可以得到一个包含2^24=16777216种颜色的调色板,但是人眼可见的却远远少于这个数字。

        例如我们总是认为乌鸦是黑色的,但其实在不同的光照条件下,乌鸦的羽毛可能会呈现出彩色的光泽。这正是因为RGB颜色空间虽然能够表示大量的颜色,但人眼的颜色感知却受到环境、光照等多种因素的影响。

 乌鸦羽毛五彩斑斓的黑

HSV

        HSV(Hue, Saturation, Value)是根据颜色的直观特性 色调(Hue)、饱和度(Saturation)和明度(Value)三个参数。由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。

 HSV分量可以通过RGB各分量值转化得到,计算公式如下:

其中,R,G,B分别为RGB颜色空间中的3个分量。 


图像格式

常见的图像格式有BMP格式,TiIFF格式,GIF格式,JPEG格式,PNG格式等。

BMP格式

        BMP格式是windows环境中的一种标准(但很多microsoft应用程序不支持它),这种格式采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。

  TIFF格式

        TIFF格式是一种灵活的图像存储格式,广泛应用于印刷、出版和扫描领域。它支持多种色彩模式,包括灰度、RGB、CMYK等,并允许无损压缩,以在保证图像质量的同时减少文件大小。TIFF格式还支持多层图像和透明度,使其在处理复杂图像时具有显著优势。此外,TIFF格式具有良好的兼容性,能够被多种图像编辑和处理软件所支持。

GIF格式

        GIF格式是一种广泛用于网络传输的图像格式。GIF格式以其独特的无损压缩技术和支持透明背景的特性而著称,这使得GIF图像在保持高质量的同时,文件大小相对较小,非常适合在网络上快速加载和显示。此外,GIF格式还支持动画效果,能够创建简单的动态图像,这一特性使其在社交媒体和网页设计中备受欢迎。尽管GIF格式的色彩深度有限,通常只能显示256种颜色,但这并不妨碍它在特定应用场景下的广泛应用。

JPEG格式

        JPEG格式源自对相对静止灰度或彩色图像的一种压缩标准,在使用有损压缩方法时可节省的空间是相当大的,目前数码相机中均使用这种格式。尽管JPEG格式采用有损压缩,可能会导致一定的图像质量损失,但通过调整压缩级别,用户可以在图像质量和文件大小之间找到理想的平衡点。这种灵活性使得JPEG格式成为存储和传输大量图片的优选方案,尤其是在存储空间有限或网络带宽受限的情况下。此外,JPEG格式还具有良好的跨平台兼容性,几乎可以被所有主流的图像查看器和编辑器所支持。

PNG格式

        PNG是一种无损压缩的图像格式,支持透明背景和Alpha通道,使得图像在保持高质量的同时,还能展现出更为丰富的层次感和细腻度。与GIF格式相比,PNG格式在色彩深度上不再受限,能够显示1600多万种颜色,这为图像的色彩表现提供了更广阔的空间。此外,PNG格式还支持多种图像编辑功能,如伽玛校正、文本注释等,进一步增强了其在图像处理和编辑领域的实用性。由于其无损压缩的特性,PNG格式在需要保持图像原始质量和细节的应用场景中,如网页设计中的图标、按钮等,具有不可替代的优势。


读取图像cv2.imread()

python">#cv2.imread读取图像
import cv2
image=cv2.imread(filename='test.jpg',flags=cv2.IMREAD_UNCHANGED)
#filename:图像文件的路径
#flags:
    #cv2.IMREAD_COLOR:BGR格式彩色图像 
    #cv2.IMREAD_GRAYSCALE:灰度图像,是单通道的 
    #cv2.IMREAD_UNCHANGED:包括alpha通道,即透明通道
    #cv2.IMREAD_COLOR_BGR,以BGR格式读取图像,彩色
    #cv2.IMREAD_COLOR_RGB,以RGB格式读取图像,彩色
    #cv2.IMREAD_ANYDEPTH:读取任意深度的图像
    #cv2.IMREAD_ANYCOLOR:读取任意颜色的图像
    #cv2.IMREAD_LOAD_GDAL:使用GDAL读取图像
    #cv2.IMREAD_REDUCED_COLOR_2:读取1/2的彩色图像
    #cv2.IMREAD_REDUCED_COLOR_4:读取1/4的彩色图像
    #cv2.IMREAD_REDUCED_COLOR_8:读取1/8的彩色图像
    #cv2.IMREAD_REDUCED_GRAYSCALE_2:读取1/2的灰度图像
    #cv2.IMREAD_REDUCED_GRAYSCALE_4:读取1/4的灰度图像
    #cv2.IMREAD_REDUCED_GRAYSCALE_8:读取1/8的灰度图像
    #cv2.IMREAD_IGNORE_ORIENTATION:忽略图像的方向信息
    #cv2.IMREAD_COLOR是默认值,读取的图像是彩色BGR格式相当与cv2.IMREAD_COLOR_BGR
print(image.shape)

  imread各flags参数含义详解

                cv2.imread()函数只有两个参数,filename与flages,filename指图像文件路径,flags是指定图像读取的方式。

以下是所有flags释义:
         

flags
cv2.IMREAD_COLOR读取彩色图像
cv2.IMREAD_GRAYSCALE读取单通道的灰度图像
cv2.IMREAD_UNCHANGED:按照图像原格式读取图像,若图像是png图像那么包括alpha通道,即透明通道,此时图像是四通道的,若图像不是png格式那么还是三通道。
 cv2.IMREAD_COLOR_BGR以BGR格式读取图像,彩色
 cv2.IMREAD_COLOR_RGB以RGB格式读取图像,彩色
cv2.IMREAD_ANYDEPTH读取任意深度的图像
 cv2.IMREAD_ANYCOLOR读取图像时自动检测并保留图像的原始颜色通道数。
cv2.IMREAD_LOAD_GDAL使用GDAL读取图像。GDAL 是专门用于处理地理空间数据格式的库,如 GeoTIFF、ENVI、HFA 等。
cv2.IMREAD_REDUCED_COLOR_2读取1/2的彩色图像
cv2.IMREAD_REDUCED_COLOR_4读取1/4的彩色图像
 cv2.IMREAD_REDUCED_COLOR_8:读取1/8的彩色图像
cv2.IMREAD_REDUCED_GRAYSCALE_2读取1/2的灰度图像
cv2.IMREAD_REDUCED_GRAYSCALE_4读取1/4的灰度图像
cv2.IMREAD_REDUCED_GRAYSCALE_8读取1/8的灰度图像
cv2.IMREAD_IGNORE_ORIENTATION忽略图像的方向信息

读取结果说明

Ndarray说明

          Ndarray的一般结构为:

[行数,列数,深度]

        其中行和列都是一维数组,我们知道行*列便可以构成矩阵,而深度则用来表示不同的行*列构成的矩阵的在最外层的数组中的索引。简而言之,ndarray就是数组内嵌套矩阵的格式,这样会十分方便理解。

          上述代码中的image为读取结果,由于我们的示例图片是.jpg格式没有alpha通道,所以flags使用cv2.IMREAD_UNCHANGED与cv2.IMREAD_COLOR并没有区别,通道数都为3。

 image的shape:(1161, 1080, 3)

        cv2.imread()函数的结果是ndarray,我们打印出其shape的结果中前两个参数是图像的宽与高,第三个参数是image的维度,这里的维度其实就是图像的RGB通道数。

获取单通道颜色矩阵

        倘若我们想要分别切片获取image的三个通道数对应的颜色矩阵那么我们可以这样写.

python">blue=image[:,:,0]
green=image[:,:,1]
red=image[:,:,2]
#或者
blue=image[0:1161,0:1080,0]
green=image[0:1161,0:1080,1]
red=image[0:1161,0:1080,2]

           在第一种写法中,这里要说明一下的是,ndarray的切片方法与python的list切片方法一致,切片时有一个特殊用法就是[:],它相当与[0:len(array)]用来直接获取整个数组所有值,倘若你要是不知道某一维这个数组的长度(比如上边我们读取的图像宽1161高宽1080,直接切片需[0:1161,0:1080]),又想获取整个数组的所有内容,可以使用这种方法。

        当然,为了方便,cv2已经内置了split函数替我们直接获取三个颜色通道的矩阵。

python">blue,green,red=cv2.split(image)

显示图像

cv2.imshow()%E6%98%BE%E7%A4%BA%E5%9B%BE%E5%83%8F" name="%E4%BD%BF%E7%94%A8cv2.imshow()%E6%98%BE%E7%A4%BA%E5%9B%BE%E5%83%8F">使用cv2.imshow()显示图像
python">import cv2#opencv读取的格式是BGR
image=cv2.imread('test.jpg')
image=cv2.resize(image,(500,500))#更改一下图像大小,为了方便显示
cv2.imshow('image',image)
cv2.waitKey(0)
cv2.destroyAllWindows()

        这里的image是一个shape为(500,500,3)的ndarray,表示这是一个500x500像素的彩色图像,具有红、绿、蓝三个颜色通道。每个颜色通道都是一个500x500的二维数组。

结果

cv2.waitKey()" name="cv2.waitKey()">cv2.waitKey()

        cv2.waitKey()是用来在OpenCV(cv2)库中暂停程序执行并等待用户按键的函数。这个函数通常在显示图像时使用,比如在一个窗口中显示图像后,我们希望程序在用户按下任意键后再继续执行后续操作,这时就可以使用cv2.waitKey()函数。该函数接受一个整数参数,表示等待的毫秒数。如果参数为0,则表示无限期等待,直到用户按下键盘上的任意键。在按下键后,cv2.waitKey()会返回按键的ASCII码值,我们可以根据这个返回值来判断用户按下了哪个键。需要注意的是,在使用cv2.waitKey()之前,必须已经创建了一个图像显示窗口,否则该函数将无法正常工作。

cv2.destroyAllWindows()" name="cv2.destroyAllWindows()" style="margin-left:0.0001pt; margin-right:0px; text-align:justify">cv2.destroyAllWindows()

      cv2.destroywindows()是用来关闭所有OpenCV创建过的窗口的,这些窗口实际是都是使用python内置库tkinter编写的,先前的tkinter窗口会阻塞主线程。所以,当我们完成图像处理或显示操作后,经常需要关闭这些窗口以释放资源。倘若不将他们关闭当前图像窗口可能无法显示。

使用plt.imshow()显示图像
python">import cv2#opencv读取的格式是BGR
import matplotlib.pyplot as plt#matplotlib读取的格式是RGB
image=cv2.imread('test.jpg')
image=cv2.resize(image,(500,500))
#使用plt.imshow(),需要先将BGR转化成RGB,这里使用cv2.cvtColor颜色通道转换函数完成
image=cv2.cvtColor(image,cv2.COLOR_RGB2BGR)
plt.axis('off')
plt.imshow(image)

结果

        这里需要注意的是opencv读取的图像时默认格式是BGR,而matplotlib读取的格式是RGB,如果我们在读取图像时不指定读取方式且不使用cv2.cvtColor()通道转换函数将颜色通道转换成RGB的话,那么显示出来的图像的颜色便会怪怪的。。。

        这是因为,matplotlib把原本是红色的通道误认为是蓝色通道,而原本是蓝色的通道则被认为是红色通道。这种颜色通道的错位就会导致图像颜色显示异常、

        但是,无论如何,cv2.imshow与plt.imshow这两个函数在显示图像时,需要传入的都是图像的ndarray数据。

保存图像cv2.imwrite()

python">#cv2.imwrite保存图像
import cv2
image=cv2.imread(filename='test.jpg',flags=cv2.IMREAD_UNCHANGED)
#图像经过某些变换或操作后需要保存
cv2.imwrite(filename='newImage.jpg',img=image,params=[int(cv2.IMWRITE_JPEG_QUALITY), 50])
#filename:保存图像文件名称
#img:图像颜色矩阵
#params:参数是一个可选的序列(通常是列表或元组),用于传递图像编码和压缩相关的参数。

总结

        本文主要介绍了opencv图像的读取与显示,后序还将分享更多相关图像处理技术,以及如何利用cv2进行图像特征提取和匹配。并且还会将所有内容合并到专栏中,免费订阅。

        通过本专栏的学习,读者将能够利用cv2库解决实际的图像处理问题,为计算机视觉项目打下坚实基础。


http://www.niftyadmin.cn/n/5868732.html

相关文章

Web自动化之Selenium控制已经打开的浏览器(Chrome,Edge)

在使用selenium进行web自动化或爬虫的时候,经常会面临登录的情况,对于这种情况,我们可以利用Selenium控制已经打开的浏览器,从而避免每次都需要重新打开浏览器并进行登录的繁琐步骤。 目录 说明 启动浏览器 注意 --user-data-dir说明 代码设定 代码 改进代…

每天一个Flutter开发小项目 (4) : 构建收藏地点应用 - 深入Flutter状态管理

引言 欢迎回到 每天一个Flutter开发小项目 系列博客!在前三篇博客中,我们从零开始构建了计数器应用、待办事项列表应用,以及简易天气应用。您不仅掌握了 Flutter 的基础组件和布局,还学习了网络请求、JSON 解析等实用技能,更重要的是,我们一起探讨了高效的 Flutter 学习…

Redis面试知识点总结

目录 1. Redis 基础知识2. 基本数据结构(底层实现)2.1 SDS2.2 链表2.3 字典2.4 跳跃表2.5 整数集合2.6 压缩列表 3. 对象3.1 字符串对象3.2 列表对象3.3 哈希对象3.4 集合对象 set3.5 有序集合对象 zset 4. 数据库4.1 RDB 持久化4.2 AOF 持久化4.3 数据淘…

力扣2454. 下一个更大元素 IV

力扣2454. 下一个更大元素 IV 题目 题目解析及思路 题目要求对于每个数&#xff0c;找到右边比它大的第二个数&#xff0c;并记录在ans数组中 如果是右边第一个大的&#xff0c;就用一个递减栈即可&#xff0c;栈顶元素如果<当前元素则弹出 第二个大数就要利用弹出的栈顶…

AI大模型(四)基于Deepseek本地部署实现模型定制与调教

AI大模型&#xff08;四&#xff09;基于Deepseek本地部署实现模型定制与调教 DeepSeek开源大模型在榜单上以黑马之姿横扫多项评测&#xff0c;其社区热度指数暴涨、一跃成为近期内影响力最高的话题&#xff0c;这个来自中国团队的模型向世界证明&#xff1a;让每个普通人都能…

leetcode_动态规划/递归 70. 爬楼梯

70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 思路&#xff1a; 考虑: 假设现在已经爬到了某一阶台阶&#xff0c;那是如何到达这里的呢&#xff1f;可能是从前一阶台阶爬上来的&am…

服务器硬件老化导致性能下降的排查与优化

当服务器硬件老化导致性能下降时&#xff0c;以下是一些排查和优化方法&#xff1a; ### 排查问题&#xff1a; 1. **性能监控&#xff1a;** - 使用监控工具&#xff08;如Prometheus、Grafana&#xff09;监视服务器性能指标&#xff0c;包括CPU利用率、内存使用、磁盘I…

使用python接入腾讯云DeepSeek

本文主要从提供SSE方式接入DeepSeek&#xff0c;并通过fastapi websocket对外提供接入方法。 参考文档&#xff1a; 腾讯云大模型&#xff1a;https://cloud.tencent.com/document/product/1759/109380 fastAPI官网&#xff1a;https://fastapi.tiangolo.com/ WebSocketManager…