OpenCV 基础图像处理

news/2024/7/21 5:30:38 标签: opencv, 图像处理, 人工智能

1、生成图像

cv2.imread是OpenCV库中的一个函数,用于读取图像文件。它接受一个参数,即要读取的图像文件的路径,返回一个多维数组,
表示图像的像素值。该函数的常用参数包括:

    'flags':指定读取图像的方式,包括cv2.IMREAD_COLOR(读取彩色图像),cv2.IMREAD_GRAYSCALE(读取灰度图像)等。
    'encoding':指定图像的编码方式,默认为None。
    'decoder':指定解码器,默认为None。

 

import cv2

image = cv2.imread('images/lena.png')  
# imread函数读取了图像文件,并将其数据存储在变量'image'中

print(image)  
# 打印的结果是一个多维数组,表示图像的像素值

2、显示图像

cv2.waitKey()是OpenCV库中的一个函数,用于等待用户按键。
它接受一个参数,表示等待的时间(以毫秒为单位),如果没有按键按下,则返回-1。
如果参数为0,则无限期等待用户按键。

 

import cv2

image = cv2.imread('images/lena.png') 
# 读取图像文件,并将其数据存储在变量'image'中

cv2.imshow('lena', image)              
# 创建一个名为'lena'的窗口,并在该窗口中显示我们刚刚读取的图像

cv2.waitKey(0)                         
# 无限期地等待用户按键。参数0表示无限期等待。

cv2.destroyWindow('lena')              
# 关闭名为'lena'的窗口

3、保存图像

cv2.imwrite(filename, img[, params])


    filename:要写入的文件名,包括文件路径和文件扩展名。
    img:要写入的图像数据,可以是单通道灰度图像,也可以是三通道彩色图像。
    params:可选参数,包括一些写入图像的质量、压缩比等参数,如[int(IMWRITE_JPEG_QUALITY), int(IMWRITE_PNG_COMPRESSION)]。

 

import cv2

# 读取图像
img = cv2.imread('images/lena.png')

# 写入图像
# 将变量'img'中的图像数据写入到名为'result.bmp'的文件中
result = cv2.imwrite('result.bmp', img)  

4、读取视频

cv2.VideoCapture是OpenCV库中的一个函数,用于读取视频文件或摄像头的视频流。
它的主要作用是从本地或网络中读取视频帧,并将其预存储到内存中,以便进行后续的图片处理或特征提取等操作。

 

import cv2

video = cv2.VideoCapture('images/video.mp4') 
 # 创建VideoCapture对象 这个对象可以读取视频文件,这里读取的是位于'images/video.mp4'路径的视频文件

fps = video.get(cv2.CAP_PROP_FPS)  
# 读取视频的帧速率 帧率是指每秒显示的帧数

height = video.get(cv2.CAP_PROP_FRAME_HEIGHT)  
# 获取视频的高度
weight = video.get(cv2.CAP_PROP_FRAME_WIDTH)  
# 获取视频的宽度

print('FPS:', fps)  
# 打印视频的帧率

print('The video size: ', height, weight)  
# 打印视频的大小,即其帧的高度和宽度

FPS: 24.12565445026178
The video size:  860.0 540.0

5、读取并播放视频

import cv2

video = cv2.VideoCapture('images/video.mp4')  
# "创建一个VideoCapture对象,用于读取视频文件

while video.isOpened():  
    # 当视频文件成功打开时,进入循环。

    ret, frame = video.read()  
    # 使用read方法读取视频的一帧,ret为布尔值,表示是否读取成功,frame为读取到的一帧

    cv2.imshow('video', frame)  
    # 使用imshow方法显示视频,窗口的名称为'video',显示的内容为frame

    key = cv2.waitKey(30)  
    # 等待30毫秒,看用户是否有键盘输入

    # 按ESC键退出
    if key == 27:
        break    
        # 如果用户输入的是ESC键(ASCII值为27),则退出循环

video.release()  
# 释放VideoCapture对象

cv2.destroyAllWindows()  
# 关闭所有的OpenCV窗口

6、查看图像属性

import cv2

imageColor = cv2.imread('images/lena.png')
print('图像的大小和通道数:', imageColor.shape)  
# 在OpenCV中,一个彩色图像的形状是(高度, 宽度, 颜色通道),而颜色通道通常为3(RGB)

print('图像总的像素个数:', imageColor.size)   
# 可以通过.size属性得到图像的总像素数

print('图像的数据类型:', imageColor.dtype)   
# 图像的数据类型通常是'uint8',表示每个像素值的范围是0-255

图像的大小和通道数: (256, 256, 3)
图像总的像素个数: 196608
图像的数据类型: uint8

7、生成灰色图像

生成一个256x256的黑色图像,所有像素的值都被设置为0
np.zeros([256, 256], dtype=np.uint8)

 

import cv2

gray = np.random.randint(0, 256, size=[256, 256], dtype=np.uint8)
# 使用numpy的random.randint函数创建了一个256x256的二维数组,
# 数组中的每个值都是0到255之间的随机整数,数据类型为无符号8位整数(uint8)。
# 这个数组代表一张灰度图像,其中每个值表示一个像素的灰度值。
cv2.imshow('gray-image', gray)
# 用imshow函数显示上面创建的灰度图像。'gray-image'是窗口的名称,gray是要显示的图像
cv2.waitKey(0)  
cv2.destroyAllWindows()  

8、转换灰度图像

import cv2

imageColor = cv2.imread('images/lena.png')
# imread函数读取了一个图像文件,文件路径是'images/lena.png',并将其保存到变量imageColor中。
# 这个函数会将图像读取为彩色图像,除非另外指定。
cv2.imshow('color', imageColor)
imageGrey = cv2.imread('images/lena.png', 0)
# 0是cv2.IMREAD_GRAYSCALE的别名,表示将图像读取为灰度图像
cv2.imshow('grey', imageGrey)
imageGrey2 = cv2.imread('images/lena.png', cv2.IMREAD_REDUCED_GRAYSCALE_2)
# cv2.IMREAD_REDUCED_GRAYSCALE_2表示将图像读取为灰度图像,并将颜色深度降低到2
cv2.imshow('grey2', imageGrey2)
img = cv2.imread('images/lena.png', cv2.IMREAD_REDUCED_COLOR_4)
# cv2.IMREAD_REDUCED_COLOR_4表示将图像读取为彩色图像,并将颜色深度降低到4
cv2.imshow('color2', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

9、通道拆分

"""读取一张图像,并分离出它的红、绿、蓝三个颜色通道"""
import cv2

image = cv2.imread('images/lena.png')
# 将图像的三个颜色通道(蓝、绿、红)分离出来。
# 在OpenCV中,图像的颜色通道顺序是BGR
b = image[:, :, 0]
g = image[:, :, 1]
r = image[:, :, 2]


# 使用imshow函数分别显示蓝、绿、红三个颜色通道。
cv2.imshow('B channel', b)
cv2.imshow('G channel', g)
cv2.imshow('R channel', r)

cv2.waitKey(0)
cv2.destroyAllWindows()

import cv2

image = cv2.imread('images/lena.png')

# 将图像分离成三个颜色通道,分别对应蓝色(B)、绿色(G)和红色(R)
b, g, r = cv2.split(image)
cv2.imshow('B channel', b)
cv2.imshow('G channel', g)
cv2.imshow('R channel', r)

cv2.waitKey(0)
cv2.destroyAllWindows()

10、通道合并

import cv2

image = cv2.imread('images/lena.png')

b, g, r = cv2.split(image)  
# 分割成三个通道,分别是蓝色通道(b)、绿色通道(g)和红色通道(r)

imageRGB = cv2.merge([r, g, b])  
# 红色、绿色和蓝色通道按照RGB顺序合并成一个新的图像

imageGRB = cv2.merge([g, r, b])  
# 绿色、红色和蓝色通道按照GRB顺序合并成一个新的图像

cv2.imshow('image', image)  
# 显示原始图像

cv2.imshow('imageRGB', imageRGB)  
# 显示RGB顺序的图像

cv2.imshow('imageGRB', imageGRB)  
# 显示GRB顺序的图像

cv2.waitKey(0)
cv2.destroyAllWindows()


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

相关文章

正点原子lwIP学习笔记——Socket接口UDP实验

1. Socket接口UDP连接配置 Socket接口的UDP配置流程如下: sin_family 设置为 AF_INET 表示 IPv4 网络协议;sin_port 为设置端口号, 可设置为 8080;sin_addr.s_addr 设置本地 IP 地址;调用函数 Socket 创建 Socket 连…

synchronized 和 ReentrantLock之间的区别

ReentrantLock为可重入互斥锁. 和 synchronized 定位类似 , 都是用来实现互斥效果 , 保证线程安全 . ReentrantLock的区别: 1)ReentrantLock的加锁和解锁是分开的,使用起来要手动释放锁,而sync不需要: Reentran…

12KM02E-V0002 3EGM030300R0002 模块化和加固的边缘计算加速

12KM02E-V0002 3EGM030300R0002 模块化和加固的边缘计算加速 随着边缘人工智能解决方案的兴起,对实时洞察和自主决策的需求显著增长。这也带来了对变革性技术的高度需求,这些技术可以在坚固的边缘支持和提供最佳性能。为了应对技术革命,Prem…

使用EPPlus实现C#控件Excel文件内容导入转换

使用EPPlus实现C#控件Excel文件内容导入转换 1.添加EPPlus库 在使用EPPlus库时,你需要确保在项目中添加了正确的引用。你可以通过以下方式添加引用: 打开你的项目。 在“解决方案资源管理器”中,右键单击“引用”并选择“管理NuGet程序包”…

自学Mysql调优笔记

Mysql性能调优学习 预计十天完成14/day 1. 存储引擎 存储引擎是基于表的,而不是基于库的 SHOW ENGINES --展示所有存储引擎1.1 InnoDB DML操作遵循ACID模型,支持事务。 行鸡锁,提供并发访问性能。 支持外键约束,保证数据完…

使用Webpack设置TS引用模块,解决Module not found: Error: Can‘t resolve ‘./m1‘ in ...问题

当我们把ts文件作为模块被引用的时候,我们使用Webpack打包代码会报错: Module not found: Error: Cant resolve ./m1 in ... 解决方法: 在webpack.config.js文件中配置如下代码: module.exports {// 设置引用模块resolve: {ext…

从0到一配置单节点zookeeper

我的软件: 链接:https://pan.baidu.com/s/1nImkjOgzPkgaFOuUPwd1Sg?pwd2wqo 提取码:2wqo 视频教程p1-zookeeper安装和配置以及启动服务和检测是否运行成功_哔哩哔哩_bilibili 一、安装zookeeper http://zookeeper.apache.org/releases.h…

项目进展(二)-配置MCT8316ZR芯片,主要学习如何根据数据手册配置外设等

近几天一直和师兄在配置驱动芯片,目前的进展是可以通过SPI配置、读取寄存器等,但是电机一直未被驱动起来(这个问题困扰了我们一两天了,希望有大佬可以帮忙解决一下)。 配置SPI要先根据数据手册的说明,确认好SPI如何配置&#xff0…