从零开始学 OpenCV:Python 图像处理核心操作实战

从零开始学 OpenCV:Python 图像处理核心操作实战

计算机视觉是人工智能领域的重要分支,而 OpenCV 则是处理图像和视频数据的利器。本文将基于 Python 版本的 OpenCV,从最基础的图像读取、显示,到视频处理、色彩通道操作、图像修改与缩放,手把手带你掌握计算机视觉的核心基础操作。

首先安装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

opencv-python==3.4.18.65:OpenCV 的核心功能包,包含图像读取、处理、视频操作等基础功能,满足你之前代码中所有图像处理需求;

opencv-contrib-python==3.4.18.65:OpenCV 的扩展包,包含一些额外的高级功能(如特征检测、人脸识别等),且必须与核心包版本完全一致;

一、图像的基础读写与属性查看

1. 读取与显示图像

OpenCV 是计算机视觉领域最常用的库之一,它默认以 BGR 色彩模式读取图像(而非我们熟知的 RGB)。核心的图像读写显示操作仅需几行代码即可完成:

import cv2 import numpy as np # 读取图片(BGR格式) img = cv2.imread('img1.jpeg') # 显示图片:参数为窗口名称、图像数据 cv2.imshow('tupian', img) # 等待按键输入:0表示永久显示,返回按键ASCII码 key = cv2.waitKey(0) # 关闭所有窗口,释放内存 cv2.destroyAllWindows() 

2. 查看图像核心属性

读取图像后,我们可以通过 numpy 数组的属性查看图像的关键信息,这对后续处理至关重要:

# 图像形状:(高度, 宽度, 通道数) print('图像形状:', img.shape) # 数据类型:通常为uint8(0-255像素值) print('图像数据类型:', img.dtype) # 总像素数:高度×宽度×通道数 print('图像总像素数:', img.size) 

运行结果:

3. 读取灰度图

很多场景下我们需要处理灰度图像(单通道),只需在读取时指定参数:

import cv2 import numpy as np # 以灰度模式读取图像 gray_img = cv2.imread('img1.jpeg', cv2.IMREAD_GRAYSCALE) cv2.imshow('xx', gray_img) cv2.waitKey(0) cv2.destroyAllWindows() # 灰度图属性:仅(高度, 宽度),无通道数 print('灰度图形状:', gray_img.shape) # 保存处理后的图像 cv2.imwrite('img1_GRAY.jpeg', gray_img) 

运行结果:

二、视频文件的读取与处理

OpenCV 不仅能处理静态图像,还能轻松读取视频文件并逐帧处理:

import cv2 import numpy as np # 打开视频文件(参数为0可调用摄像头) video_capture = cv2.VideoCapture('video1.mp4') # 检查视频是否成功打开 if not video_capture.isOpened(): print('无法打开视频文件') exit() # 循环读取视频帧 while True: # ret:是否成功读取帧;frame:帧数据 ret, frame = video_capture.read() if not ret: # 读取完毕则退出循环 break # 将帧转为灰度图 gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cv2.imshow('Video', gray_frame) # 按下ESC键(ASCII码27)退出,60ms/帧控制播放速度 if cv2.waitKey(60) == 27: break # 释放视频资源 video_capture.release() cv2.destroyAllWindows() 

运行结果:

三、ROI 与色彩通道操作

1. 提取感兴趣区域(ROI)

ROI(Region of Interest)是图像中我们关注的特定区域,通过 numpy 数组切片即可快速提取:

import cv2 import numpy as np img = cv2.imread('img1.jpeg') # 提取ROI:[行范围, 列范围] → 对应[高度范围, 宽度范围] roi = img[30:230, 100:300] cv2.imshow('yuantu', img) cv2.imshow('qiepian', roi) cv2.waitKey(0) cv2.destroyAllWindows() 

运行结果:

2. 色彩通道的拆分与合并

OpenCV 读取的图像是 BGR 格式,我们可以拆分单个通道,也可以合并通道重构图像:

(1)拆分通道
import cv2 import numpy as np img = cv2.imread('img1.jpeg') # 方法1:数组切片 b_channel = img[:, :, 0] # 蓝色通道 g_channel = img[:, :, 1] # 绿色通道 r_channel = img[:, :, 2] # 红色通道 # 方法2:cv2.split(效率稍低) b, g, r = cv2.split(img) # 注意:单独显示单通道为灰度图(仅亮度信息) cv2.imshow('b', b) cv2.imshow('g', g) cv2.imshow('r', r) cv2.waitKey(0) cv2.destroyAllWindows() 

运行结果:

(2)显示单通道彩色效果

若想直观看到单通道的彩色效果,需将其他通道置 0:

import cv2 import numpy as np img = cv2.imread('img1.jpeg') # 复制原图像,避免修改原图 img_blue = img.copy() # 绿色通道置0 img_blue[:, :, 1] = 0 # 红色通道置0 img_blue[:, :, 2] = 0 cv2.imshow('result2', img_blue) cv2.waitKey(0) cv2.destroyAllWindows() 

运行结果:

(3)合并通道
# 合并BGR通道,重构原图像 merged_img = cv2.merge((b, g, r)) cv2.imshow('result3', merged_img) cv2.waitKey(0) cv2.destroyAllWindows() 

运行结果:

四、图像修改与缩放

1. 图像像素修改

我们可以直接通过数组赋值修改图像像素,实现如 “马赛克” 等效果:

import cv2 import numpy as np img = cv2.imread('img1.jpeg') # 对指定区域赋值随机像素(马赛克效果) img[100:200, 200:300] = np.random.randint(0, 256, (100, 100, 3)) cv2.imshow('masike', img) cv2.waitKey(0) cv2.destroyAllWindows() # 图像拼接:将img1的区域替换到img2中 img1 = cv2.imread('img1.jpeg') img2 = cv2.imread('img2.jpeg') # 注意:替换区域尺寸需匹配 img2[200:350, 200:350] = img1[50:200, 100:250] cv2.imshow('b', img1) cv2.imshow('a', img2) cv2.waitKey(0) cv2.destroyAllWindows() 

运行结果:

2. 图像缩放

cv2.resize是调整图像大小的核心函数,支持指定尺寸或缩放比例两种方式:

import cv2 import numpy as np a = cv2.imread('img1.jpeg') # 方式1:指定目标尺寸(宽, 高) a_new = cv2.resize(a, (300, 200)) # 方式2:指定缩放比例(fx:x轴缩放系数,fy:y轴缩放系数) # a_new = cv2.resize(a,None,fx=1.5,fy=0.5) cv2.imshow('a', a) cv2.imshow('a_new', a_new) cv2.waitKey(0) cv2.destroyAllWindows()

运行结果:

五、总结

本文基于 OpenCV-Python,梳理了计算机视觉入门的核心操作,核心要点如下:

  1. OpenCV 默认以 BGR 格式读取图像,可通过参数读取灰度图,读写显示需配合与窗口管理imread/imshow/imwrite函数;
  2. 视频处理本质是逐帧读取与处理,需注意循环终止条件和资源释放;
  3. 图像的 ROI 提取、色彩通道拆分 / 合并、像素修改、缩放均基于 numpy 数组操作,是 OpenCV 处理的核心逻辑;
  4. 单通道显示为灰度图,若需彩色效果需将其他通道置 0,通道合并需按 BGR 顺序。

这些基础操作是计算机视觉进阶(如目标检测、图像分割、特征提取)的基石,掌握后可结合实际场景灵活扩展,比如实现图像水印、视频特效、人脸马赛克等功能。

Read more

Mysql超详细安装配置教程(保姆级)

MySQL 一、下载 MySQL (一)下载地址 官网下载社区版 MySQL,推荐选择 MySQL 8.0.44 社区版(稳定版,兼容性强),下载地址:MySQL Community Downloads (二)下载步骤 1. Select Operating System 选择 Microsoft Windows; 2. 下载选项选择: * 推荐:Windows (x86, 64-bit), ZIP Archive(免安装压缩包,灵活配置),文件大小约 231.7M,点击 Download; * 备选:MySQL Installer for Windows(图形化安装程序,

By Ne0inhk
Flutter 组件 simple_cluster 的适配 鸿蒙Harmony 实战 - 驾驭轻量级集群分发架构、实现鸿蒙端多节点任务调度与高性能负载均衡方案

Flutter 组件 simple_cluster 的适配 鸿蒙Harmony 实战 - 驾驭轻量级集群分发架构、实现鸿蒙端多节点任务调度与高性能负载均衡方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 simple_cluster 的适配 鸿蒙Harmony 实战 - 驾驭轻量级集群分发架构、实现鸿蒙端多节点任务调度与高性能负载均衡方案 前言 在鸿蒙(OpenHarmony)生态迈向“万物互联、万物协同”的深水区后,单一设备孤岛式的算力模式已经无法满足复杂的工业控制、分布式协同办公以及大规模 IoT 设备管理的需求。面对需要将一个繁重的计算任务(如:海量 Hex 数据的指纹比对)分发给附近的 5 台鸿蒙平板协同处理;面对需要管理数十个传感器节点的实时状态同步。 如果依靠传统的手动 Socket 连接管理。那么不仅会导致通讯代码极其臃肿且难以维护。更会因为缺乏确定性的负载均衡(Load Balancing)与节点心跳(Heartbeat)逻辑。引发整个系统的雪崩式失效方案。 我们需要一种“逻辑集群化、操作极简化”的算力平衡艺术。

By Ne0inhk
【MYSQL】MYSQL学习的一大重点:MYSQL库的操作

【MYSQL】MYSQL学习的一大重点:MYSQL库的操作

🎬 个人主页:艾莉丝努力练剑 ❄专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录》 《Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享》 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬 艾莉丝的简介: 文章目录 * 0 ~> 实际场景:创建和删除数据库 * 0.1 创建方式1 * 0.2 创建方式2 * 0.3 创建方式3 * 1 ~> 数据库的编码集 * 1.1 目前整个数据库支持的字符集 * 1.2 目前整个数据库支持的字符集 * 1.3 UTF-8需要设置配置文件 * 1.4 MySQL 中与字符集排序规则(

By Ne0inhk