【图像处理入门】2. Python中OpenCV与Matplotlib的图像操作指南

article/2025/6/23 9:35:57

在这里插入图片描述

一、环境准备

import cv2
import numpy as np
import matplotlib.pyplot as plt# 配置中文字体显示(可选)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

二、图像的基本操作

1. 图像读取、显示与保存

使用OpenCV操作
# 读取图像(支持多种格式)
img = cv2.imread('example.jpg')
print(f"图像尺寸: {img.shape}")  # 输出:(高度, 宽度, 通道数)# 显示图像
cv2.imshow('OpenCV Window', img)
cv2.waitKey(0)  # 等待按键
cv2.destroyAllWindows()# 保存图像
cv2.imwrite('output.jpg', img)  # 自动保存为JPG格式
使用Matplotlib操作
# 读取并显示图像
plt.figure(figsize=(10,5))
img_plt = plt.imread('example.png')  # 自动归一化到[0,1]
plt.subplot(121)
plt.imshow(img_plt)
plt.title('Matplotlib显示')# OpenCV与Matplotlib颜色空间差异
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # BGR转RGB
plt.subplot(122)
plt.imshow(img_rgb)
plt.title('OpenCV转RGB显示')
plt.show()

⚠️ 注意事项:

  1. OpenCV读取的像素值范围是[0,255],Matplotlib自动归一化到[0,1]
  2. 路径含中文时需使用cv2.imdecode特殊处理
  3. 保存质量可通过参数控制(如cv2.imwrite('out.jpg', img, [int(cv2.IMWRITE_JPEG_QUALITY), 90])

2. 像素级操作

单个像素访问与修改
# 访问特定位置像素值
px = img[100, 50]  # 获取坐标(50,100)处像素值
print(f"Blue={px[0]}, Green={px[1]}, Red={px[2]}")# 修改像素值
img[100, 50] = [0, 255, 0]  # 将该位置改为绿色
区域像素操作
# 提取ROI区域(感兴趣区域)
roi = img[50:150, 100:200]# 批量修改像素值
img[200:300, 300:400] = [0, 0, 255]  # 填充红色矩形
像素值统计分析
print(f"最大像素值: {img.max()}")
print(f"最小像素值: {img.min()}")
print(f"平均像素值: {img.mean()}")

3. 通道操作

通道分离与合并
# 分离通道(OpenCV方式)
b, g, r = cv2.split(img)
cv2.imshow('Blue Channel', b)# 合并通道
merged = cv2.merge([b, g, r])# 直接操作特定通道(Numpy方式)
img_copy = img.copy()
img_copy[:, :, 0] = 0  # 清空蓝色通道
多光谱分析示例
# 显示各通道灰度图
plt.figure(figsize=(12, 3))
for i, ch in enumerate(['Blue', 'Green', 'Red']):plt.subplot(1,3,i+1)plt.imshow(cv2.split(img)[i], cmap='gray')plt.title(f'{ch}通道')plt.axis('off')
plt.show()

三、完整实践案例

def image_processing_pipeline(path):# 1. 图像读取src = cv2.imread(path)if src is None:print("错误:无法读取图像!")return# 2. 通道分析b, g, r = cv2.split(src)# 3. 创建特殊效果special_effect = src.copy()special_effect[:, :, 1] = cv2.add(special_effect[:, :, 1], 50)  # 增强绿色通道# 4. 结果展示plt.figure(figsize=(15, 5))plt.subplot(141)plt.imshow(cv2.cvtColor(src, cv2.COLOR_BGR2RGB))plt.title('原图')plt.subplot(142)plt.imshow(r, cmap='gray')plt.title('红色通道')plt.subplot(143)plt.imshow(special_effect[:, :, [2,1,0]])plt.title('增强绿色通道')plt.subplot(144)plt.imshow(b, cmap='viridis')  # 使用不同色图plt.title('蓝色通道(Viridis色图)')plt.tight_layout()plt.show()# 执行处理流程
image_processing_pipeline('test_image.jpg')

四、性能优化技巧

  1. 向量化操作替代循环
# 推荐方式(Numpy向量化)
start_time = cv2.getTickCount()
brighter = cv2.add(img, np.array([30]))
print(f"耗时:{(cv2.getTickCount() - start_time)/cv2.getTickFrequency():.4f}s")# 不推荐方式(双重循环)
start_time = cv2.getTickCount()
for y in range(img.shape[0]):for x in range(img.shape[1]):img[y,x] = np.clip(img[y,x] + 30, 0, 255)
print(f"耗时:{(cv2.getTickCount() - start_time)/cv2.getTickFrequency():.4f}s")
  1. 内存连续性优化
# 检查数组内存布局
if not img.flags.c_contiguous:img = np.ascontiguousarray(img)

五、常见问题解决方案

  1. 图像无法显示

    • 检查路径是否包含中文/特殊字符
    • 确认图像尺寸是否超过屏幕分辨率
    • 尝试使用cv2.resizeWindow()调整窗口大小
  2. 颜色显示异常

    # 统一颜色空间转换
    def show_image统一(img_bgr, title='Image'):plt.imshow(cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB))plt.title(title)plt.axis('off')plt.show()
    
  3. 大图像处理

    # 金字塔下采样
    pyramid = cv2.pyrDown(img)
    print(f"下采样后尺寸:{pyramid.shape}")
    

六、扩展学习方向

  1. 进阶操作

    • 使用cv2.LUT()实现色彩查找表变换
    • 掩膜操作(mask)进行区域处理
    • 利用Numpy数组的布尔索引进行条件修改
  2. 性能提升

    • 使用OpenCV内置函数替代Python循环
    • 多线程处理图像块
    • CUDA加速(需安装opencv-contrib-python包)
  3. 实际应用

    • 图像增强:直方图均衡化、CLAHE算法
    • 颜色空间转换:HSV/YUV等
    • 形态学操作:腐蚀、膨胀

通过掌握这些基础操作,您将为后续的图像处理学习打下坚实基础。建议通过实际项目(如证件照背景替换、图像特效制作)加深理解。

下一篇我们将进入图像的「几何变换世界」,学习如何用数学矩阵实现图像的平移、旋转、缩放,以及不同插值算法对图像质量的影响。现在请打开你的图像,尝试裁剪一个有趣的ROI区域并修改它的颜色吧!

思考:为什么对大尺寸图像使用cv2.split()会更耗内存?如何用NumPy实现更高效的通道分离?


http://www.hkcw.cn/article/qrVTslsIPB.shtml

相关文章

设计模式——装饰器设计模式(结构型)

摘要 文中主要介绍了装饰器设计模式,它是一种结构型设计模式,可在不改变原有类代码的情况下,动态为对象添加额外功能。文中详细阐述了装饰器模式的角色、结构、实现方式、适合场景以及实战示例等内容,还探讨了其与其他设计模式的…

生活小记啊

最近生活上的事情还是蛮多的,想到哪写到哪。 工作 三月的某个周六,正在加班写技术方案,大晚上写完了听到调动通知,要去新的团队了。 还是蛮不舍的,看着产品从无到有,一路走过来,倾注了不少感…

【android bluetooth 案例分析 04】【Carplay 详解 2】【Carplay 连接之手机主动连车机】

1. 背景 在【android bluetooth 案例分析 04】【Carplay 详解 1】【CarPlay 在车机侧的蓝牙通信原理与角色划分详解】中我们从整理上介绍了车机中 carplay 相关基础概念。 本节 将详细分析 iphone手机主动 连接 车机carplay 这一过程。 先回顾一下 上一节, carpla…

【Kotlin】数字字符串数组集合

【Kotlin】简介&变量&类&接口 【Kotlin】数字&字符串&数组&集合 文章目录 Kotlin_数字&字符串&数组&集合数字字面常量显式转换数值类型转换背后发生了什么 运算字符串字符串模板字符串判等修饰符数组集合通过序列提高效率惰性求值序列的操…

FreeCAD源码分析: 串行化工具

本文分析FreeCAD中的串行化工具。 注1:限于研究水平,分析难免不当,欢迎批评指正。 注2:文章内容会不定期更新。 零、预修 0.1 QDataStream 0.2 Boost.Iostreams 0.3 Zipios 0.4 Xerces-C 一、核心组件 1.1 Base::Writer 1.2 Ba…

【R语言编程绘图-plotly】

安装与加载 在R中使用plotly库前需要安装并加载。安装可以通过CRAN进行,使用install.packages()函数。加载库使用library()函数。 install.packages("plotly") library(plotly)测试库文件安装情况 # 安装并加载必要的包 if (!requireNamespace("p…

设计模式——系统数据建模设计

摘要 本文主要介绍了UML在软件系统分析和设计中的应用,详细阐述了六大类关系(泛化、实现、依赖、关联、聚合、组合)及其在UML类图中的表示方法,并通过具体例子说明了这些关系在实际编程中的应用。同时,文章还概述了UM…

37. Sudoku Solver

题目描述 37. Sudoku Solver 回溯 class Solution {vector<vector<bool>> row_used;vector<vector<bool>> col_used;vector<vector<bool>> box_used;public:void solveSudoku(vector<vector<char>>& board) {row_used.r…

【Java开发日记】基于 Spring Cloud 的微服务架构分析

目录 1、Spring Cloud 2、Spring Cloud 的核心组件 1. Eureka&#xff08;注册中心&#xff09; 2. Zuul&#xff08;服务网关&#xff09; 3. Ribbon&#xff08;负载均衡&#xff09; 4. Hystrix&#xff08;熔断保护器&#xff09; 5. Feign&#xff08;REST转换器&a…

进程间通信IV System V 系列(linux)

目录 消息队列 原理 操作 补充概念 信号量 (原子性计数器) 原理 操作 (和共享内存相似) 总结 小知识 消息队列 原理 在内核中建立一个队列&#xff0c;进程可以相互进行通信&#xff0c;通过队列进行IPC&#xff0c;就是进程之间发送带类型的数据块。 操作 接口和共享…

【MySQL】索引(B+树详解)

MySQL(五)索引 一、索引的减I/O设计 1.读取量 2.搜索树 2.1方向 2.2有序 3.分多叉 3.1B树 弊端: 3.2B树 3.2.1非叶子-搜索字段 3.2.1.1海量分叉 3.2.1.1.1最大式 3.2.1.1.2最快式 3.2.1.2缓存内存 3.2.1.2.1字段总量小 3.2.1.2.2时间复杂度 3.2.1.3区间搜索向…

2025年全国青少年信息素养大赛复赛C++算法创意实践挑战赛真题模拟强化训练(试卷4:共计6题带解析)

2025年全国青少年信息素养大赛复赛C++算法创意实践挑战赛真题模拟强化训练(试卷4:共计6题带解析) 第1题:最佳情侣身高差(题目及解析) 题目描述 专家通过多组情侣研究数据发现,最佳的情侣身高差遵循着一个公式:(女方的身高) 1.09 =(男方的身高)。如果符合,你俩的身…

5.31 day33

知识点回顾&#xff1a; PyTorch和cuda的安装 查看显卡信息的命令行命令&#xff08;cmd中使用&#xff09; cuda的检查 简单神经网络的流程 数据预处理&#xff08;归一化、转换成张量&#xff09; 模型的定义 继承nn.Module类 定义每一个层 定义前向传播流程 定义损失函数和优…

【C++】模板

目录 1、函数模板 基本用法 函数模板的实现原理 函数模板的实例化 模板参数的匹配原则 2、类模板 类模板的定义格式 类模板的实例化 1、函数模板 基本用法 template < typename T >返回值类型 函数名(参数列表){} template 是模板的意思&#xff0c;typename是…

第六十二节:深度学习-加载 TensorFlow/PyTorch/Caffe 模型

在计算机视觉领域,OpenCV的DNN(深度神经网络)模块正逐渐成为轻量级模型部署的利器。本文将深入探讨如何利用OpenCV加载和运行三大主流框架(TensorFlow、PyTorch、Caffe)训练的模型,并提供完整的代码实现和优化技巧。 一、OpenCV DNN模块的核心优势 OpenCV的DNN模块自3.3…

Linux系统下安装配置 Nginx

Windows Nginx https://nginx.org/en/download.htmlLinux Nginx https://nginx.org/download/nginx-1.24.0.tar.gz解压 tar -zxvf tar -zxvf nginx-1.18.0.tar.gz #解压安装依赖&#xff08;如未安装&#xff09; yum groupinstall "Development Tools" -y yum…

qwen3解读

1. 模型架构 重点&#xff1a; 思维模式和非思维模式这两种不同的操作模式集成到一个模型中。这样可以让用户在这些模式间切换&#xff0c;而不是在不同模型间切换。多阶段的后培训方法&#xff1a;增强推理和非推理模式。将基础模型和人的偏好结合。 预训练阶段&#xff1a…

用127.0.0.1访问VMware虚拟机中间件

文章目录 前言一、虚拟机安装、插件安装二、改虚拟机配置1.更改虚拟机使用的是 NAT 模式2.编辑 VMware 的 NAT 设置并添加端口转发 总结至此大功告成了&#xff01;&#xff01;&#xff01; 前言 docker 安装中间件很方便,平时使用windows作开发,如果想快速安装中间件,那么首…

【大模型部署】mac m1本地部署 ChatGLM3-6B 超详细教程

本人环境&#xff1a;macOS 15.5 (Sonoma) - Apple M1 / 16 G 目标&#xff1a;在 mac m1 16G 上 完全离线 的本地模型目录上&#xff0c;跑通官方 ChatGLM3-6B 目录 背景 & 踩坑记录 准备工作 新建 Conda 环境并安装依赖 关键环境变量 运行 composite_demo 常见报错与…

评标专家随机抽选系统-建设方案——仙盟创梦IDE

政策要求 抽选记录保存 专辑库管理 系统统计 抽选打印 系统分级管理 项目管理 系统分级管理 集团公司管理 专家补抽 评标专家随机抽选 1、系统分级管理合规 符合《数据安全法》第二十一条&#xff08;分类分级制度&#xff09;&#xff0c;安全按照不同职级&#xff0c;配置权…