news 2026/8/1 4:38:44

OpenCV从零入门:图像读取、ROI裁剪、马赛克与视频处理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenCV从零入门:图像读取、ROI裁剪、马赛克与视频处理

文章目录

  • 前言
  • 1. 环境准备
    • 1.1 安装OpenCV
    • 1.2 安装NumPy
    • 1.3 导入习惯
  • 2. 图像的基础读写与显示
    • 2.1 读取、显示、保存
    • 2.2 图像属性(shape, dtype, size)
    • 2.3 灰度图读取
  • 3. ROI(感兴趣区域)操作
  • 4. BGR颜色通道的分离与合并
  • 5. 图像修改实战
    • 5.1 随机噪声马赛克打码
    • 5.2 图像组合(粘贴ROI)
    • 5.3 图像缩放(resize)
  • 6. 视频文件的读取与摄像头调用
  • 7. 综合作业全流程拆解
    • 7.1 作业需求
    • 7.2 分步实现
  • 总结

前言

OpenCV 是一个强大的开源计算机视觉库,为图像处理和机器学习提供了丰富的算法。本文是一份面向初学者的 OpenCV 入门指南,涵盖从环境搭建到实战应用的核心内容。:

  1. 搭建 OpenCV 开发环境。
  2. 掌握图像的读取、显示、保存等基础操作。
  3. 理解并实践 ROI 操作、BGR 通道分离与合并。
  4. 动手进行图像修改(马赛克、组合、缩放)。
  5. 学习视频读取与摄像头调用。
  6. 通过综合作业整合所学知识。

让我们开始 OpenCV 的学习之旅。


1. 环境准备

1.1 安装OpenCV

pip install opencv-python== 3.4.18.65 -i https://pypi.tuna.tsinghua.edu.cn/simple pip install opencv-contrib-python==3.4.18.65 -i https://pypi.tuna.tsinghua.edu.cn/simple

1.2 安装NumPy

pip install numpy

1.3 导入习惯

import cv2(BGR格式)、import numpy as np

2. 图像的基础读写与显示

2.1 读取、显示、保存

importcv2importnumpyasnp# ------------------ 读取彩色图 ------------------img_color=cv2.imread('time98.jpg')# 读取格式为 BGR# print(img_color) #NumPy数组,其中存储了读取的图像文件的像素值cv2.imshow('彩色原图',img_color)# waitKey(0) 表示永久显示,按任意键关闭1.设置窗口显示时长(单位ms)2.获取按键的ASCII码值3.设置waitKey(0),代表窗口显示永久 cv2.waitKey(0)cv2.destroyAllWindows()#关闭所有打开的窗口并释放所有相关内容

2.2 图像属性(shape, dtype, size)

#----------------------打印图像属性----------------------------print("图像形状(shape):",img_color.shape)# (高, 宽, 通道数)print("图像数据类型(dtype):",img_color.dtype)# uint8 符号8位整数,用于表示像素值的范围在0-255之间print("图像大小(size):",img_color.size)#表示图像的大小,通常是一个整数,表示图像的总像素数,即图像的高度乘以宽度乘以通道数

2.3 灰度图读取

# ------------------ 读取灰度图并保存 ------------------img_gray=cv2.imread('time98.jpg',cv2.IMREAD_GRAYSCALE)cv2.imshow('灰度图',img_gray)print("灰度图形状(shape):",img_gray.shape)# 只有(高, 宽),无通道数# 保存到本地cv2.imwrite('time98_GRAY.jpg',img_gray)cv2.waitKey(0)cv2.destroyAllWindows()

3. ROI(感兴趣区域)操作

importcv2 img=cv2.imread('time98.jpg')# 截取 ROI:行范围 30~230,列范围 100~300roi=img[30:230,100:300]cv2.imshow('原图',img)cv2.imshow('截取ROI区域',roi)cv2.waitKey(0)cv2.destroyAllWindows()

4. BGR颜色通道的分离与合并

importcv2 img=cv2.imread('time98.jpg')# ---------- 方法1:通过NumPy索引提取 ----------blue_channel=img[:,:,0]# 蓝色通道green_channel=img[:,:,1]# 绿色通道red_channel=img[:,:,2]# 红色通道# ---------- 方法2:使用 split 函数 ----------b,g,r=cv2.split(img)# 分别显示三个灰度通道# 分别显示(注意:显示出来是单通道灰度图,越亮表示该颜色值越高)cv2.imshow('Blue通道',b)cv2.imshow('Green通道',g)cv2.imshow('Red通道',r)# ---------- 合并通道还原彩图 ----------img_merged=cv2.merge((b,g,r))cv2.imshow('合并后的彩图',img_merged)cv2.waitKey(0)cv2.destroyAllWindows()

5. 图像修改实战

5.1 随机噪声马赛克打码

importcv2importnumpyasnp img=cv2.imread('time98.jpg')# 在指定区域生成随机噪声(100x100像素块)# 注意:赋值区域尺寸必须和随机矩阵尺寸完全一致img[100:200,200:300]=np.random.randint(0,256,(100,100,3),dtype=np.uint8)cv2.imshow('马赛克打码效果',img)cv2.waitKey(0)cv2.destroyAllWindows()

5.2 图像组合(粘贴ROI)

importcv2 img1=cv2.imread('time98.jpg')# 源图img2=cv2.imread('aaa1.jpg')# 目标大图# 将 img1 的 (50:200, 100:250) 区域,粘贴到 img2 的 (200:350, 200:350) 位置# 前提:两个区域尺寸必须一致(这里都是 150x150)img2[200:350,200:350]=img1[50:200,100:250]cv2.imshow('组合后的图',img2)cv2.waitKey(0)cv2.destroyAllWindows()

5.3 图像缩放(resize)

importcv2 img=cv2.imread('time98.jpg')# 方法1:直接指定目标尺寸 (宽, 高)img_resize1=cv2.resize(img,(200,200))# 方法2:按比例缩放(fx为宽缩放比,fy为高缩放比)img_resize2=cv2.resize(img,None,fx=0.5,fy=0.5)cv2.imshow('原图',img)cv2.imshow('缩放为200x200',img_resize1)cv2.imshow('缩放为0.5倍',img_resize2)cv2.waitKey(0)cv2.destroyAllWindows()

6. 视频文件的读取与摄像头调用

importcv2# 参数为 0 表示调用电脑自带摄像头;若填写视频路径则读取视频文件video_capture=cv2.VideoCapture(0)ifnotvideo_capture.isOpened():print("无法打开摄像头/视频")exit()whileTrue:ret,frame=video_capture.read()ifnotret:break# 可选:将每一帧转为灰度显示# frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)cv2.imshow('Video',frame)# 按下 ESC 键(ASCII 码 27)退出循环ifcv2.waitKey(60)==27:break# 释放摄像头资源并关闭窗口video_capture.release()cv2.destroyAllWindows()

7. 综合作业全流程拆解

7.1 作业需求

读取一张彩色原图(dongwu.jpg),将其尺寸修改为 500×500,依次完成以下所有操作:
1、截取左上角 ROI 区域:行范围 0:250,列范围 100:250
2、将截取的 ROI 区域,精准粘贴到右下角(目标位置:行 250:500,列 250:400)
3、在图像右上角区域,选取"黑色小鸟"区域,进行随机噪声马赛克打码
4、将处理后的彩色图像,转换为灰度图像并保存到本地
5、最终同时显示处理后的彩色图像以及灰度图像

7.2 分步实现

importcv2importnumpyasnp# 1. 读取图像并修改尺寸为 500x500img=cv2.imread('dongwu.jpg')img=cv2.resize(img,(500,500))# 2. 截取左上角 ROI 区域:行 0:250,列 100:250roi=img[0:250,100:250]# 3. 将 ROI 精准粘贴到右下角:行 250:500,列 250:400img[250:500,250:400]=roi# 4. 在右上角 "黑色小鸟" 区域进行随机噪声马赛克打码# (根据原图自行调整坐标,此处示例为 50:150, 330:430,尺寸 100x100)img[50:150,330:430]=np.random.randint(0,256,(100,100,3),dtype=np.uint8)# 5. 将处理后的彩色图像转为灰度图并保存gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)cv2.imwrite('huise_final.jpg',gray_img)# 6. 同时显示处理后的彩色图像和灰度图像cv2.imshow('处理后的彩色图',img)cv2.imshow('转换后的灰度图',gray_img)cv2.waitKey(0)cv2.destroyAllWindows()

总结

本文系统介绍了 OpenCV 的基础操作与核心应用:

  1. 环境与基础:搭建了 OpenCV 和 NumPy 环境,建立了import cv2import numpy as np的编码习惯。
  2. 图像读写与显示:掌握了cv2.imreadcv2.imshowcv2.imwrite的使用,理解了彩色图与灰度图的区别及属性。
  3. 核心图像操作
    • ROI 操作:使用 NumPy 切片截取图像区域。
    • BGR 通道分离与合并:使用cv2.split()cv2.merge()处理颜色通道。
  4. 图像修改实战:实践了随机噪声马赛克、图像组合(粘贴 ROI)和图像缩放(cv2.resize)。
  5. 视频处理入门:学习了使用cv2.VideoCapture()读取视频或调用摄像头。
  6. 知识整合:通过综合作业串联了读取、缩放、ROI、粘贴、马赛克、色彩转换、保存与显示等完整流程。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/1 4:37:10

SpringBoot构建琼瑶文学数字化平台的技术实践

1. 项目概述:当SpringBoot遇上琼瑶文学作为一名同时痴迷技术开发和文学研究的跨界开发者,我一直在寻找将两者结合的有趣项目。去年为一个地方文化机构开发的"琼瑶品鉴平台",正是用SpringBoot技术栈构建的文学数字化探索案例。这个平…

作者头像 李华
网站建设 2026/8/1 4:34:32

C++日志系统设计:从spdlog实战到异步、格式化与性能优化

1. 项目概述:为什么C日志值得“深入浅出”地聊?在C的世界里摸爬滚打十几年,我发现一个有趣的现象:越是资深的开发者,对日志系统的“执念”往往越深。新手可能觉得,日志嘛,不就是printf或者std::…

作者头像 李华
网站建设 2026/8/1 4:34:18

MH2457开发板实战:FreeRTOS与LVGL在7寸屏上的嵌入式GUI开发

如果你正在寻找一款能够流畅运行FreeRTOS和LVGL的嵌入式开发板,特别是需要驱动7寸电容触摸屏,MH2457开发板可能已经进入了你的视野。但"勉强及格"这个评价背后,到底隐藏着哪些开发中的真实挑战?很多开发者容易被开发板的…

作者头像 李华
网站建设 2026/8/1 4:32:40

Codex用量限制放宽与Sol效率提升:AI编程助手实用化新阶段

最近在开发者圈子里,Codex 的用量限制调整和 Sol 效率提升成为了热门话题。很多开发者发现,原本频繁遇到的 API 调用限制突然变得宽松了,而新引入的 Sol 优化方案更是让处理效率提升了近 20%。这不仅仅是简单的参数调整,而是标志着…

作者头像 李华
网站建设 2026/8/1 4:30:07

Bebas Neue:为什么这款开源字体成为设计师的秘密武器?

Bebas Neue:为什么这款开源字体成为设计师的秘密武器? 【免费下载链接】Bebas-Neue Bebas Neue font 项目地址: https://gitcode.com/gh_mirrors/be/Bebas-Neue 你是否曾为寻找一款既专业又完全免费的字体而烦恼?在追求完美视觉体验的…

作者头像 李华
网站建设 2026/8/1 4:27:41

STP选举机制深度解析:从BPDU到端口状态,彻底掌握网络环路防护

1. 从一次网络环路故障说起:为什么我们需要STP选举那天下午,办公室的网络突然变得异常缓慢,打开一个网页要等上半分钟,内网文件传输更是直接卡死。运维同事在核心交换机上看到端口的指示灯疯狂闪烁,流量统计面板上显示…

作者头像 李华