网站首页 > 技术文章 正文
图像的读取 cv2.imread()
原型:cv2.imread(filename, flage)
参数:
- filename 图像文件名
- flage 加载标识
- cv2.IMREAD_COLOR : 默认使用该种标识。加载一张彩色图片,忽视它的透明度。
- cv2.IMREAD_GRAYSCALE : 加载一张灰度图。
- cv2.IMREAD_UNCHANGED : 加载图像,包括它的Alpha通道
同时,上面三个参数可以分别用1,0,-1代替。
灰度图的作用很大,在很多图像检测识别中,我们都需要将彩色图转换为灰度图,再进行相应的图像处理。
请注意,彩色图像的保存格式是RGB,而OPENCV读取是按照BGR得顺序读取的。
示例:
import cv2
import matplotlib.pyplot as plt
import numpy as np
### imread()读取图像 Opencv读取的格式是BGR
img = cv2.imread('C:\\Users\\xxx\\Downloads\\picture1.jpeg')
print(img.shape)
img = cv2.imread('C:\\Users\\xxx\\Downloads\\picture1.jpeg',0)
print(img.shape)
img = cv2.imread('C:\\Users\\xx\\Downloads\\picture1.jpeg',-1)
print(img.shape)
运行结果如下:
上述结果表明,指定图像是彩色图像,是一个三维矩阵,其高度为1728像素,宽度是792像素,没有透明度通道。
图像的显示
2.1 cv2.imshow() 在指定窗口显示图像
作用:该函数将图像在特定的窗口进行显示。如果该窗口是利用cv::WINDOW_AUTOSIZE标志创建的,则会使用图像的原始分辨率进行显示,然而会受限于屏幕的分辨率。也就是如果图像大于屏幕的分辨率,则无法完整的查看了。
原型:cv2.imshow(winname, mat)
参数:
- winname 窗口名。如果窗口名为winname的窗口不存在,则自动创建窗口
- mat 要显示的图像数据矩阵
2.2 cv2.moveWindow() 移动窗口
作用:该函数的作用是将窗口放到指定的位置去
原型:cv2.moveWindow(winname, x, y)
参数:
- winname 窗口名
- x、y 指窗口的左上角在屏幕的坐标
2.3 cv2.namedWindow() 命名窗口
作用:创建窗口。如果已经存在相同的窗口名称之后,该函数将会不做任何事情。
原型:cv2.namedWindow( winname[, flags])
参数:
- winname 窗口名
- flags 标志位
- cv2.WINDOW_NORMAL: 使得你能够改变窗口的尺寸
- cv2.WINDOW_AUTOSIZE: 会自适应图像的尺寸(默认)。
- 上面2个参数可以分别用0,1代替。
2.4 cv2.waitkey() 等待函数
原型:cv2.waitkey(delay)
参数:delay 延时的时间。单位ms。
返回值:若在给定延时内有按键触发,则返回键值。没有键盘输入,则返回-1.
作用:
- cv2.waitKey()是一个键盘绑定函数。它的时间量度是毫秒ms。函数会等待(delay)毫秒,看是否有键盘输入。若有键盘输入,则返回按键的ASCII值。没有键盘输入,则返回-1.一般设置为0,他将无线等待键盘的输入。
- 一般在 imshow() 的时候 , 如果设置 waitkey(0) , 代表按任意键继续。
- 显示视频时,延迟时间需要设置为 大于0的参数。delay > 0时 , 延迟 ”delay”ms , 在显示视频时这个函数是有用的 , 用于设置在显示完一帧图像后程序等待 ”delay”ms 再显示下一帧视频 ; 如果使用 waitkey(0) 则只会显示第一帧视频。
2.5 cv2.destroyAllWindows() 删除窗口
原型:cv2.destroyAllWindows([winname])
参数:winname窗口名。不指定任何参数,则删除所有窗口;指定参数,则删除特定的窗口winname。
示例:
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread('C:\\Users\\xxx\\Downloads\\lena.jpg') # 彩色图
img1 = cv2.imread('C:\\Users\\xxx\\Downloads\\lena.jpg',cv2.IMREAD_GRAYSCALE) #灰度图
cv2.namedWindow('picture1',0) #创建一个能改变大小的窗口
cv2.imshow('picture',img) #显示图像,窗口不存在,就自动创建
cv2.imshow('picture1',img1) #显示图像,在已存在的窗口
cv2.waitKey(0) #按任意键
cv2.moveWindow('picture',0,0) #将窗口移动至屏幕左上方
cv2.waitKey(0) #按任意键
cv2.destroyAllWindows() #删除所有窗口
2.6 图像深度:就是图像的数据类型
- 如果图像数据类型为8位无符号整数,即范围[0,255],则按原有数据显示;
- 如果数据类型为16位无符号整数或者32位有符号整数,则将数据除以256,映射到[0,255];
- 如果数据类型为32位或64位浮点数,则将数据乘以255,映射到[0,255]。
- 当cv2.imshow()处理图像深度为:CV_8U(默认范围为[0,255])时,按原数据显示;
- 当cv2.imshow()处理图像深度为CV_16U(默认范围为[0,65535])时,除以256,映射到[0,255];
- 当cv2.imshow()图像深度为CV_32F和CV_64F时(默认范围为[0,1]),乘以255映射到[0,255];当碰到负数时,首先取其绝对值,然后按照上述图像深度将超出数据范围的部分采取截断操作,最后映射到[0,255]显示图像
示例:
import numpy as np
import cv2
# 【图像深度为CV_8U,或者numpy数据类型为uint8】
# 新建numpy数组,注意np.zero()创建的数据类型为float64,所以先转化为uint8
type = ['uint8','uint16','float32','float64']
for dType in type:
# 新建numpy数组,注意np.zero()创建的数据类型为float64,所以先转化为对应的数据类型
img = np.zeros((500,500,3)).astype(dType)
# openCV显示图像为BGR格式,通过下列方式,我们绘制两条粗红线
if dType == 'uint8':
img[150:170,150:350]=[0,0,100]
img[350:370,150:350]=[0,0,255]
if dType == 'uint16':
img[150:170,150:350]=[0,0,25600]
img[350:370,150:350]=[0,0,65525]
if dType == 'float32' or dType == 'float64':
img[150:170,150:350]=[0,0,-8000]
img[250:270,150:350]=[0,0,8000]
img[350:370,150:350]=[0,0,0.34]
winName = 'Type: ' + dType
cv2.imshow(winName,img)
# 释放资源
cv2.waitKey()
cv2.destroyAllWindows()
执行结果如下:
cv2.imwrite() 图像的保存
原型:retval = cv2.imwrite(filename, image [, paras])
参数:
- filename:代表文件名的字符串。文件名必须包含图像格式,例如.jpg,.png等。
- image:图像数据矩阵
- paras: 不同编码格式的参数,可选项
- cv2.CV_IMWRITE_JPEG_QUALITY:设置 .jpeg/.jpg 格式的图片质量,取值为 0-100(默认值 95),数值越大则图片质量越高;
- cv2.CV_IMWRITE_WEBP_QUALITY:设置 .webp 格式的图片质量,取值为 0-100;
- cv2.CV_IMWRITE_PNG_COMPRESSION:设置 .png 格式图片的压缩比,取值为 0-9(默认值 3),数值越大则压缩比越大。
返回值:retval。返回值,保存成功返回 True,否则返回 False。
示例:将一个彩色图片读取为灰度图,并保存为PNG格式的图像
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread('C:\\Users\\xxx\\Downloads\\picture1.jpeg',cv2.IMREAD_GRAYSCALE) #灰度图
cv2.imwrite('picture1.png',img)
2.5 ROI 截取部分图像
ROI(Region Of Interest)感兴趣的图像区域,就是图像的一部分。
截取图像的原理就是,从图像矩阵中,选取部分元素。
以下的例子是将一张图片垂直方向、水平方向各等分为2份。
import cv2
img = cv2.imread('C:\\Users\\xxx\\Downloads\\picture1.jpeg')
shape=img.shape
# 将图像高等分成2份,将图像宽度等分为2份
hPoint = shape[0] // 2 #高度分割点,高度像素整除2
wPoint = shape[1] // 2 #宽度分割点,宽度像素整除2
imgLT = img[0:hPoint-1,0:wPoint-1,:] # 左上图像
imgLB = img[hPoint:shape[0],0:wPoint-1,:] # 左下图像
imgRT = img[0:hPoint-1,wPoint:shape[1],:] # 右上图像
imgRB = img[hPoint:shape[0],wPoint:shape[1],:] # 右下图像
#为了将窗口的边框遮挡,可以将分割后的图像,从下往上显示
cv2.imshow('LB',imgLB)
cv2.moveWindow('LB',0,hPoint)
cv2.imshow('LT',imgLT)
cv2.moveWindow('LT',0,0)
cv2.imshow('RB',imgRB)
cv2.moveWindow('RB',wPoint,hPoint)
cv2.imshow('RT',imgRT)
cv2.moveWindow('RT',wPoint,0)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭显示窗口
执行结果如下:
猜你喜欢
- 2024-12-09 基于DeepFace和opencv,识别并分析视频中人物的面部表情
- 2024-12-09 基于OpenCV的相机捕捉视频进行人脸检测--米尔NXP i.MX93开发板
- 2024-12-09 OpenCV之形态学操作(膨胀、腐蚀、开运算、闭运算、顶帽、黑帽)
- 2024-12-09 OpenCV入门第一课
- 2024-12-09 [常用工具] OpenCV获取网络摄像头实时视频流
- 2024-12-09 用 Python 和 OpenCV 创建视频编辑器
- 2024-12-09 半小时教你手搓AI视频通话,还有懒人版代码已开源
- 2024-12-09 C# 使用OpenCV库把多张图片合成视频
- 2024-12-09 OpenCV-Python实现绿幕图像抠图
- 2024-12-09 计算机视觉系列_2、OpenCV基础讲解
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)