当前位置: 首页 > 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.dtcms.com/a/318817.html

相关文章:

  • 基于人眼视觉特性的相关图像增强基础知识介绍
  • C++入门自学Day7-- String类的使用(续)
  • windows_exporter-0.13.0-amd64.exe 怎么安装?Windows服务安装与运行方法
  • 中国341个城市人力需求指数数据集
  • 【MATLAB】(十)符号运算
  • 一文读懂 C# 中的 Bitmap
  • 知识随记-----Qt 实用技巧:自定义倒计时按钮防止用户频繁点击
  • 3D 软件在游戏开发中的全链路应用:从原型到上线的实战解析
  • Docker Buildx最佳实践:多架构镜像构建指南
  • Mac/Windows跨平台PDF与AI高效解决方案
  • sigprocmask 函数深度解析
  • html页面使用jspdf预览及下载pdf模板
  • 使用驱动移除内核回调,
  • golang开源库之Syncthing
  • Unity URP渲染管线动态修改材质球状态
  • 基于 HT 引擎实现 3D 智慧物流转运中心一体化管控系统
  • 【CS创世SD NAND征文】小型夜灯为何需要存储芯片?从基础照明到智能存储的升级密码
  • 生成式AI时代,Data+AI下一代数智平台建设指南
  • EP04:【DL 第二弹】张量的线性代数运算
  • 内网穿透原理和部署教程
  • 京东关键字搜索商品列表接口开发实战:从参数优化到分布式调用
  • localforage的数据仓库、实例、storeName和name的概念和区别
  • VBA之Word应用第四章第一节:段落集合Paragraphs对象(一)
  • mysql全屏终端全量、部分备份、恢复脚本
  • 累加和校验原理与FPGA实现
  • 躺平发育小游戏微信抖音流量主小程序开源
  • 自建纯竞拍系统小程序需准备的事项
  • uniapp/uniappx实现图片或视频文件选择时同步告知权限申请目的解决华为等应用市场上架审核问题
  • TSMaster-C小程序使用
  • uni-app X能成为下一个Flutter吗?