计算机系统应用教程网站

网站首页 > 技术文章 正文

OPENCV(1): 图像的读取、显示与保存

btikc 2024-12-09 10:55:38 技术文章 18 ℃ 0 评论

图像的读取 cv2.imread()

原型:cv2.imread(filename, flage)

参数:

  • filename 图像文件名
  • flage 加载标识
  1. cv2.IMREAD_COLOR : 默认使用该种标识。加载一张彩色图片,忽视它的透明度。
  2. cv2.IMREAD_GRAYSCALE : 加载一张灰度图。
  3. 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 标志位
  1. cv2.WINDOW_NORMAL: 使得你能够改变窗口的尺寸
  2. cv2.WINDOW_AUTOSIZE: 会自适应图像的尺寸(默认)。
  3. 上面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]。
  1. 当cv2.imshow()处理图像深度为:CV_8U(默认范围为[0,255])时,按原数据显示;
  2. 当cv2.imshow()处理图像深度为CV_16U(默认范围为[0,65535])时,除以256,映射到[0,255];
  3. 当cv2.imshow()图像深度为CV_32FCV_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: 不同编码格式的参数,可选项
  1. cv2.CV_IMWRITE_JPEG_QUALITY:设置 .jpeg/.jpg 格式的图片质量,取值为 0-100(默认值 95),数值越大则图片质量越高;
  2. cv2.CV_IMWRITE_WEBP_QUALITY:设置 .webp 格式的图片质量,取值为 0-100;
  3. 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()  # 关闭显示窗口

执行结果如下:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表