当前位置: 首页 > news >正文

OpenCV 图像处理基础操作指南(一)

文章目录

  • 一、图像的读取与显示
  • 二、灰度图处理
  • 三、图像切片
  • 四、视频文件读取
  • 五、颜色通道操作
    • 1.提取 RGB 颜色通道
    • 2.合并 RGB 颜色通道
  • 六、图像修改
    • 1.图片打码
    • 2.图片组合
  • 七、图像缩放

OpenCV 是一个强大的计算机视觉库,在图像处理领域应用广泛。本文将基于实际代码示例,介绍 OpenCV 中一些常用的图像处理基础操作,包括图像读取与显示、灰度图处理、图像切片、视频读取、颜色通道操作、图像修改以及图像缩放等内容。


一、图像的读取与显示

在 OpenCV 中,我们可以使用 cv2.imread() 函数读取图像,该函数会返回一个 NumPy 数组,存储着图像的像素值。读取后,使用 cv2.imshow() 函数显示图像,cv2.waitKey() 控制图像显示时间,最后用 cv2.destroyAllWindows() 关闭所有窗口。

import cv2a = cv2.imread('img_1.jpg')  # 读取图片
cv2.imshow('tu', a)  # 显示图片,参数分别为窗口名称和图像数据
b = cv2.waitKey(0)  # 等待用户按键,0 表示无限等待
cv2.destroyAllWindows()  # 关闭所有窗口

我们还可以查看图像的一些属性:

print("图像形状(shape):", a.shape)  # 图像高、宽、通道数
print("图像数据类型(dtype):", a.dtype)  # 通常是无符号8位整数,像素值范围0-255
print("图像大小(size):", a.size)  # 总像素数,即高度×宽度×通道数

二、灰度图处理

读取灰度图可以通过在 cv2.imread() 函数中设置参数实现,参数 cv2.IMREAD_GRAYSCALE 或 0 都表示读取灰度图。读取后同样可以显示并查看其属性,也能使用 cv2.imwrite() 保存灰度图。

a = cv2.imread('img_1.jpg', 0)  # 读取灰度图
cv2.imshow('tu', a)
b = cv2.waitKey(10000)
cv2.destroyAllWindows()
print('图像形状(shape):', a.shape)
print('图像数据类型(dtype):', a.dtype)
print('图像大小(size):', a.size)
cv2.imwrite('img_1_gray.jpg', a)  # 保存灰度图

三、图像切片

图像切片就是截取图像的一部分,通过对图像数组进行切片操作即可实现。

a = cv2.imread('img_1.jpg')
b = a[0:500, 100:300]  # 截取图像的一部分
cv2.imshow('yuantu', a)
cv2.imshow('qiepian', b)
cv2.waitKey(0)
cv2.destroyAllWindows()

四、视频文件读取

使用 cv2.VideoCapture() 打开视频文件或摄像头,然后通过循环逐帧读取视频,对每一帧进行处理和显示,最后释放资源。

# 打开视频文件,若为摄像头则参数为 0
video_capture = cv2.VideoCapture('DSC01703.mp4')
# 检查视频是否成功打开
if not video_capture.isOpened():print("无法打开视频文件")exit()
# 循环读取视频帧
while True:ret, frame = video_capture.read()  # ret 表示是否成功读取帧,frame 是读取到的帧if not ret:break# 可在此添加对帧的处理,如转为灰度图# frame=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)cv2.imshow('Video', frame)# 按下 'esc' 键退出循环if cv2.waitKey(60) == 27:break
# 释放资源
video_capture.release()
cv2.destroyAllWindows()

五、颜色通道操作

1.提取 RGB 颜色通道

可以通过数组切片或 cv2.split() 函数提取图像的蓝色(B)、绿色(G)、红色(R)通道。

a = cv2.imread(r'img_1.jpg')
# 数组切片提取
a1 = a[:, :, 0]  # 蓝色通道
a2 = a[:, :, 1]  # 绿色通道
a3 = a[:, :, 2]  # 红色通道
# 或使用 cv2.split() 提取
b, g, r = cv2.split(a)
cv2.imshow('b', b)
cv2.imshow('g', g)
cv2.imshow('r', r)
cv2.waitKey(100000)
cv2.destroyAllWindows()

需要注意的是,单个颜色通道图像显示为灰色,若要显示单通道彩色效果,可将其他通道设为 0。

a = cv2.imread(r'img_1.jpg')
a_new = a.copy()
a_new[:, :, 1] = 0  # 绿色通道设为0
a_new[:, :, 2] = 0  # 红色通道设为0
cv2.imshow('result', a_new)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.合并 RGB 颜色通道

使用 cv2.merge() 函数可以将分离的颜色通道合并成完整图像。

a = cv2.imread(r'img_1.jpg')
b, g, r = cv2.split(a)
img = cv2.merge((b, g, r))
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

六、图像修改

1.图片打码

通过对图像的特定区域赋值随机像素值实现打码效果,注意赋值的矩阵大小要与目标区域一致。

import numpy as npa = cv2.imread('img_1.jpg')
a[100:200, 200:300] = np.random.randint(0, 256, (100, 100, 3))  # 打码操作
cv2.imshow('masaike', a)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.图片组合

将一张图像的部分区域复制到另一张图像的对应区域,需保证两块区域大小一致。

a = cv2.imread('img_1.jpg')
b = cv2.imread('img_2.jpg')
b[20:50, 100:150] = a[50:80, 100:150]  # 图像组合
cv2.imshow('b', b)
cv2.imshow('a', a)
cv2.waitKey(0)
cv2.destroyAllWindows()

七、图像缩放

使用 cv2.resize() 函数调整图像大小,可通过指定输出大小或缩放系数来实现。

a = cv2.imread('img_1.jpg')
# 方法一:指定输出大小(宽、高)
# a_new = cv2.resize(a, dsize=(200, 600))
# 方法二:指定缩放系数
a_new = cv2.resize(a, None, fx=2, fy=2)
cv2.imshow('a', a)
cv2.imshow('a_new', a_new)
cv2.waitKey(0)
cv2.destroyAllWindows()

以上就是 OpenCV 中一些基础的图像处理操作,这些操作是进行更复杂图像处理和计算机视觉任务的基础,希望能对大家有所帮助。

http://www.lryc.cn/news/613170.html

相关文章:

  • 非化学冷却塔水处理解决方案:绿色工业时代的革新引擎
  • Android视图状态以及重绘
  • 如何将服务器中的Docker镜像批量导出?
  • uat是什么
  • SIP - Centos 7 搭建freeswitch服务器
  • Linux第一阶段练习
  • Microsoft Office PowerPoint 制作简单的游戏素材
  • Sklearn 机器学习 数据降维PCA 自己实现PCA降维算法
  • 智能升级革命:Deepoc具身模型开发板如何让传统除草机器人拥有“认知大脑”
  • 【智能协同云图库】第六期:基于 百度API 和 Jsoup 爬虫实现以图搜图
  • RabbitMQ面试精讲 Day 15:RabbitMQ故障转移与数据恢复
  • 【数据结构】排序(sort) -- 交换排序(冒泡快排)
  • 大数据杀熟:技术阴影下的消费陷阱与破局之道
  • Dokcer创建中间件环境
  • RabbitMQ面试精讲 Day 13:HAProxy与负载均衡配置
  • 【Day 18】Linux-DNS解析
  • 香港网站服务器被占用的资源怎么释放?
  • 股指期货合约是个啥?怎么玩?
  • JVM 终止机制详解:用户线程与守护线程
  • WD6208资料和引脚图
  • MCU中的晶振(Crystal Oscillator)
  • 时间戳表示
  • 汽车娱乐信息系统域控制器的网络安全开发方案
  • 基于Ruby的IP池系统构建分布式爬虫架构
  • 基于 MATLAB 的 QPSK 调制、解调、通过高斯信道的误码率计算,并绘制误码率图和眼图、星座图
  • SurgRIPE 挑战赛:手术机器人器械位姿估计基准测试|文献速递-医学影像算法文献分享
  • 【源码】AndroidPlayer
  • 智能升级新纪元:基于Deepoc具身模型外拓开发板的除草机器人认知进化
  • 【图文教程】三步用Cpolar+JuiceSSH实现手机远程连接内网Linux虚拟机
  • Web开发模式 前端渲染 后端渲染 身份认证