opencv图片显示不全(opencv+图像处理(GUI)1-0图像:创建加载显示保存关闭)
0.本节知识点
创建窗口namedWindow 从本地加载图像 imread 在窗口中展示图像imshow 将图像写入文件imwrite 关闭窗口destroyWindow destroyAllWindows1.创建窗口
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版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!