首页IT科技opencv图片显示不全(opencv+图像处理(GUI)1-0图像:创建加载显示保存关闭)

opencv图片显示不全(opencv+图像处理(GUI)1-0图像:创建加载显示保存关闭)

时间2025-05-02 13:43:45分类IT科技浏览3640
导读:本专栏代码地址https://github.com/xiawei20161308104/xv_opencv_tutorials 本节代码路径xv_opencv_tutorials/ImageProcessinginOpenCV/load_img.py...

本专栏代码地址https://github.com/xiawei20161308104/xv_opencv_tutorials 本节代码路径xv_opencv_tutorials/ImageProcessinginOpenCV/load_img.py

0.本节知识点

创建窗口namedWindow 从本地加载图像 imread 在窗口中展示图像imshow 将图像写入文件imwrite 关闭窗口destroyWindow destroyAllWindows

1.创建窗口

opencv提供cv.namedWindow函数实现创建一个窗口功能

import cv2 as cv # 参数一winname:string类型的窗口名称           ,参数二flags:窗口类型                 ,使用规定好的类型      ,默认WINDOW_AUTOSIZE cv.namedWindow(img, cv.WINDOW_AUTOSIZE) cv.waitKey(0)

flags窗口类型的可选参数 一般使用cv.WINDOW_NORMAL就可以啦

函数名称 应用 cv.WINDOW_NORMAL 可以用鼠标调整窗口大小           ,将全屏窗口切换正常大小 cv.WINDOW_AUTOSIZE 不能改变大小                 ,图像显示为其原始大小      ,但也受到屏幕分辨率的影响 cv.WINDOW_FULLSCREEN 全屏显示 cv.WINDOW_FREERATIO 调整图片大小的时候     ,不考虑原始比率 cv.WINDOW_KEEPRATIO 调整图片大小的时候                 ,保持原始比率不变 cv.WINDOW_OPENGL 支持opengl

注意

若填入的winname重复            ,则函数不执行     ,例如:

此时的img图像是第一个创建的img                ,第三个不执行            。

WINDOW_AUTOSIZE可能会出现适配不好的情况                 。左图img只显示了上半截            ,显示不完全,右图为原图     。

2.从本地加载图像

opencv提供cv.imread函数实现读取图像功能      。可以读取的类型有:

import cv2 as cv cv.namedWindow(img WINDOW_NORMAL, cv.WINDOW_NORMAL) # 读取图像 # 参数一filename:string类型的图片路径                ,参数二flags:读取方式                 ,比如读取哪个通道,哪些保留哪些丢弃等                 。使用规定好的类型           。 img = cv.imread("../imgs/opencv.png") cv.imshow(img WINDOW_NORMAL, img) cv.waitKey(0)

flags读取方式的可选参数

补充:

jpg: 格式是有损压缩            ,24 bit真彩色                 ,不支持动画           、不支持透明色      。在压缩过程中图像的品质会遭受破坏                 。一张图片多次上传下载后      ,图片逐渐会失真           。

PNG:格式是无损数据压缩           ,PNG格式有8位                 、24位      、32位三种形式                 ,其中8位PNG支持两种不同的透明形式(索引透明和alpha透明)      ,24位PNG不支持透明     ,32位PNG在24位基础上增加了8位透明通道(32-24=8)可展现256级透明程度。

imread函数默认不读取透明度                 ,所以若有一些的特殊格式的图像需要进行flag标记                 。 函数名称 应用 cv.IMREAD_UNCHANGED 读取原始图像不改变            ,可以读取到png的透明通道 cv.IMREAD_GRAYSCALE 用编码器内部转换为灰度图 cv.IMREAD_COLOR 默认配置     ,转为3通道BGR图像 cv.IMREAD_REDUCED_GRAYSCALE_2/ 转为灰度图                ,尺寸减小1/2 cv.IMREAD_REDUCED_GRAYSCALE_4/ 转为灰度图            ,尺寸减小1/4 cv.IMREAD_REDUCED_GRAYSCALE_8 转为灰度图,尺寸减小1/8 cv.IMREAD_REDUCED_COLOR_2 转为BGR彩图                ,尺寸减少1/2(还可以减小1/4                 ,1/8)

demo

import cv2 as cv cv.namedWindow(img IMREAD_GRAYSCALE, cv.WINDOW_NORMAL) cv.namedWindow(img1 original, cv.WINDOW_NORMAL) cv.namedWindow(img2 original had alpha, cv.WINDOW_NORMAL) # 读取图像 # 参数一filename:string类型的图片路径,参数二flags:读取方式           ,比如读取哪个通道                 ,哪些保留哪些丢弃等                。使用规定好的类型。 # 以灰度图形式读取 img = cv.imread("../imgs/opencv.png", cv.IMREAD_GRAYSCALE) print("灰度图大小为:", img.shape) # 以默认形式读取原图      ,没有透明度通道 img1 = cv.imread("../imgs/opencv.png") print("默认方式读取大小为:", img1.shape) # 以IMREAD_UNCHANGED形式读取原图           ,有透明度通道 img2 = cv.imread("../imgs/opencv.png", cv.IMREAD_UNCHANGED) print("不忽略透明度通道大小为:", img2.shape) # 展示图像 cv.imshow(img IMREAD_GRAYSCALE, img) cv.imshow(img1 original, img1) cv.imshow(img2 original had alpha, img2) # 窗口停留                 ,0代表无限时停留 cv.waitKey(0)

控制台输出:

灰度图大小为: (610, 570)

默认方式读取大小为: (610, 570, 3)

不忽略透明度通道大小为: (610, 570, 4) 看!有一个透明通道吧

注意:

文件丢失           、权限不正确                 、格式不受支持或无效等情况      ,会返回空矩阵 按照BGR通道读取 读取类型为IMREAD_GRAYSCALE时候     ,和cvtColor()转灰度图的结果可能不同 根据图片本身内容决定类型                 ,而不是根据文件的扩展名 标志位为IMREAD_UNCHANGED是原始的不会改变的读取方式 默认情况下            ,像素数必须小于2^30            。可以使用系统变量OPENCV_IO_MAX_IMAGE_PIXELS设置限制

3.在窗口中展示图像

opencv提供imshow()函数     ,来在指定窗口加载图像

cv.namedWindow(img IMREAD_GRAYSCALE, cv.WINDOW_NORMAL) # 参数一winname:string类型的窗口名称                ,参数二mat:图像                。配合cv.namedWindow使用     。 # 展示效果受到图像本身和namedWindow的类型影响            。WINDOW_NORMAL能显示大于屏幕分辨率的图像                 。 cv.imshow(img IMREAD_GRAYSCALE, img)

注意

当图像大小不是255的时候            ,一般采取除法或者乘法转为0-255显示

如果图像像素大小为8bit,也就是2的8次方=256像素的                ,直接显示     。 如果图像是16bit的                 ,也就是2的16次方=256*256=25536像素的,会映射为0-255大小显示      。 如果是浮点数0-1的           ,会映射为0-255大小显示

4.将图像写入文件

保存图像有两种方法

按下Ctrl+S将显示本地对话框自行选择保存图像                 。按下Ctrl+C会复制图像到剪切板

结合waitKey用代码控制

# waitKey(0)将无限显示窗口                 ,直到按下任何键为止,适用于想显示图像的时候           。 # waitKey(25)将显示一帧并等待大约25ms的按键      ,适用于逐帧显示视频的时候      。 k=cv.waitKey(0) # 在无限显示窗口的时候           ,按下s                 ,则保存到本地路径 #imwrite参数一filename:保存的路径      ,参数二img要保存的图像     ,参数三params可选                 ,对特定格式进行编码 if k == ord("s"): cv.imwrite("opencv1.png", img)

注意

保存的时候可以决定图像的保存形式                 。

只有8bit的单通道或者BGR三通道能用这个函数直接保存            ,其他的需要特定格式或者特殊处理     ,例如16bit需要特定保存为PNG, JPEG 2000, 和TIFF 形式           。

5.关闭窗口

程序最后加cv.destroyAllWindows()就好啦                ,释放一下资源。其实在简单程序中            ,加不加都行,关闭程序就自动释放了                 。

6.整合代码

以上所有知识点的整合                ,通常图片读取步骤                 ,按需取用                。

文件结构:

完整代码: import cv2 as cv import sys # 创建窗口 # 参数一winname:string类型的窗口名称,参数二flags:窗口类型           ,使用规定好的类型                 ,默认WINDOW_AUTOSIZE cv.namedWindow(img IMREAD_GRAYSCALE, cv.WINDOW_NORMAL) cv.namedWindow(img1 original, cv.WINDOW_NORMAL) cv.namedWindow(img2 original had alpha, cv.WINDOW_NORMAL) # 读取图像 # 参数一filename:string类型的图片路径      ,参数二flags:读取方式           ,比如读取哪个通道                 ,哪些保留哪些丢弃等。使用规定好的类型            。 # 以灰度图形式读取 img = cv.imread("../imgs/opencv.png", cv.IMREAD_GRAYSCALE) # 因为imread读取不到的时候不会报错      ,所有这里需要判空 if img is None: sys.exit("Could not read the image.") print("灰度图大小为:", img.shape) # 以默认形式读取原图     ,没有透明度通道 img1 = cv.imread("../imgs/opencv.png") print("默认方式读取大小为:", img1.shape) # 以IMREAD_UNCHANGED形式读取原图                 ,有透明度通道 img2 = cv.imread("../imgs/opencv.png", cv.IMREAD_UNCHANGED) print("不忽略透明度通道大小为:", img2.shape) # 展示图像 # 参数一winname:string类型的窗口名称            ,参数二mat:图像                。配合cv.namedWindow使用     。 cv.imshow(img IMREAD_GRAYSCALE, img) cv.imshow(img1 original, img1) cv.imshow(img2 original had alpha, img2) # waitKey(0)将无限显示窗口     ,直到按下任何键为止,适用于想显示图像的时候            。 # waitKey(25)将显示一帧并等待大约25ms的按键                ,适用于逐帧显示视频的时候                 。 k = cv.waitKey(0) if k == ord("s"): cv.imwrite("../imgs/opencv1.png", img) cv.destroyAllWindows()
声明:本站所有文章            ,如无特殊说明或标注,均为本站原创发布     。任何个人或组织                ,在未征得本站同意时                 ,禁止复制      、盗用     、采集                 、发布本站内容到任何网站            、书籍等各类媒体平台      。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理                 。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
如何在苹果电脑上使用淘宝旺旺购买商品功能(如何在苹果电脑上使用淘宝旺旺购买商品) wordpress插件加密(WordPress插件购买指南:让您的网站功能更强大)