OpenCV 开发 -- 图像基本处理


### 文章目录

  • [@[toc]](#文章目录 @[toc] 1 像素访问与设置的基本方法 1.1 单通道图像(灰度图) 1.2 多通道图像(彩色图) 1.3 批量像素操作 1.4 性能优化建议 2 图像通道分离与合并 2.1 通道分离 (Split) 2.2 通道合并 (Merge) 2.3 实际应用示例 2.4 通道交换 2.5 Alpha通道处理 2.6 性能优化技巧)
  • [1 像素访问与设置的基本方法](#文章目录 @[toc] 1 像素访问与设置的基本方法 1.1 单通道图像(灰度图) 1.2 多通道图像(彩色图) 1.3 批量像素操作 1.4 性能优化建议 2 图像通道分离与合并 2.1 通道分离 (Split) 2.2 通道合并 (Merge) 2.3 实际应用示例 2.4 通道交换 2.5 Alpha通道处理 2.6 性能优化技巧)
  • [1.1 单通道图像(灰度图)](#文章目录 @[toc] 1 像素访问与设置的基本方法 1.1 单通道图像(灰度图) 1.2 多通道图像(彩色图) 1.3 批量像素操作 1.4 性能优化建议 2 图像通道分离与合并 2.1 通道分离 (Split) 2.2 通道合并 (Merge) 2.3 实际应用示例 2.4 通道交换 2.5 Alpha通道处理 2.6 性能优化技巧)
  • [1.2 多通道图像(彩色图)](#文章目录 @[toc] 1 像素访问与设置的基本方法 1.1 单通道图像(灰度图) 1.2 多通道图像(彩色图) 1.3 批量像素操作 1.4 性能优化建议 2 图像通道分离与合并 2.1 通道分离 (Split) 2.2 通道合并 (Merge) 2.3 实际应用示例 2.4 通道交换 2.5 Alpha通道处理 2.6 性能优化技巧)
  • [1.3 批量像素操作](#文章目录 @[toc] 1 像素访问与设置的基本方法 1.1 单通道图像(灰度图) 1.2 多通道图像(彩色图) 1.3 批量像素操作 1.4 性能优化建议 2 图像通道分离与合并 2.1 通道分离 (Split) 2.2 通道合并 (Merge) 2.3 实际应用示例 2.4 通道交换 2.5 Alpha通道处理 2.6 性能优化技巧)
  • [1.4 性能优化建议](#文章目录 @[toc] 1 像素访问与设置的基本方法 1.1 单通道图像(灰度图) 1.2 多通道图像(彩色图) 1.3 批量像素操作 1.4 性能优化建议 2 图像通道分离与合并 2.1 通道分离 (Split) 2.2 通道合并 (Merge) 2.3 实际应用示例 2.4 通道交换 2.5 Alpha通道处理 2.6 性能优化技巧)
  • [2 图像通道分离与合并](#文章目录 @[toc] 1 像素访问与设置的基本方法 1.1 单通道图像(灰度图) 1.2 多通道图像(彩色图) 1.3 批量像素操作 1.4 性能优化建议 2 图像通道分离与合并 2.1 通道分离 (Split) 2.2 通道合并 (Merge) 2.3 实际应用示例 2.4 通道交换 2.5 Alpha通道处理 2.6 性能优化技巧)
  • [2.1 通道分离 (Split)](#文章目录 @[toc] 1 像素访问与设置的基本方法 1.1 单通道图像(灰度图) 1.2 多通道图像(彩色图) 1.3 批量像素操作 1.4 性能优化建议 2 图像通道分离与合并 2.1 通道分离 (Split) 2.2 通道合并 (Merge) 2.3 实际应用示例 2.4 通道交换 2.5 Alpha通道处理 2.6 性能优化技巧)
  • [2.2 通道合并 (Merge)](#文章目录 @[toc] 1 像素访问与设置的基本方法 1.1 单通道图像(灰度图) 1.2 多通道图像(彩色图) 1.3 批量像素操作 1.4 性能优化建议 2 图像通道分离与合并 2.1 通道分离 (Split) 2.2 通道合并 (Merge) 2.3 实际应用示例 2.4 通道交换 2.5 Alpha通道处理 2.6 性能优化技巧)
  • [2.3 实际应用示例](#文章目录 @[toc] 1 像素访问与设置的基本方法 1.1 单通道图像(灰度图) 1.2 多通道图像(彩色图) 1.3 批量像素操作 1.4 性能优化建议 2 图像通道分离与合并 2.1 通道分离 (Split) 2.2 通道合并 (Merge) 2.3 实际应用示例 2.4 通道交换 2.5 Alpha通道处理 2.6 性能优化技巧)
  • [2.4 通道交换](#文章目录 @[toc] 1 像素访问与设置的基本方法 1.1 单通道图像(灰度图) 1.2 多通道图像(彩色图) 1.3 批量像素操作 1.4 性能优化建议 2 图像通道分离与合并 2.1 通道分离 (Split) 2.2 通道合并 (Merge) 2.3 实际应用示例 2.4 通道交换 2.5 Alpha通道处理 2.6 性能优化技巧)
  • [2.5 Alpha通道处理](#文章目录 @[toc] 1 像素访问与设置的基本方法 1.1 单通道图像(灰度图) 1.2 多通道图像(彩色图) 1.3 批量像素操作 1.4 性能优化建议 2 图像通道分离与合并 2.1 通道分离 (Split) 2.2 通道合并 (Merge) 2.3 实际应用示例 2.4 通道交换 2.5 Alpha通道处理 2.6 性能优化技巧)
  • [2.6 性能优化技巧](#文章目录 @[toc] 1 像素访问与设置的基本方法 1.1 单通道图像(灰度图) 1.2 多通道图像(彩色图) 1.3 批量像素操作 1.4 性能优化建议 2 图像通道分离与合并 2.1 通道分离 (Split) 2.2 通道合并 (Merge) 2.3 实际应用示例 2.4 通道交换 2.5 Alpha通道处理 2.6 性能优化技巧)
更多精彩内容
👉内容导航 👈
👉OpenCV开发 👈

1 像素访问与设置的基本方法

OpenCV 中像素设置是图像处理的基础操作,允许我们直接修改图像中特定位置的像素值。

  • 坐标系统:OpenCV使用(y, x)坐标系统,其中y是行号,x是列号
  • 颜色顺序:OpenCV默认使用BGR而非RGB顺序
  • 边界检查:访问像素时需要确保坐标在图像范围内
  • 数据类型:注意图像数据类型,避免溢出问题
  • 性能考虑:大量像素操作时优先使用向量化操作而非循环

1.1 单通道图像(灰度图)

python 复制代码
import cv2
import numpy as np

# 读取图像
img = cv2.imread('image.jpg', 0)  # 0表示以灰度模式读取

# 获取像素值
pixel_value = img[y, x]

# 设置像素值
img[y, x] = new_value

1.2 多通道图像(彩色图)

在OpenCV中,图像的像素颜色默认是使用BGR(蓝、绿、红)格式来表示的,而不是RGB。

python 复制代码
# 读取彩色图像
img = cv2.imread('image.jpg')  # 默认BGR格式

# 获取像素值 (B, G, R)
pixel_values = img[y, x]
# 设置像素值
img[y, x] = [blue, green, red]
#------------------------------------------例如
# 获取像素值 (BGR 格式)
pixel_value = image[100, 100]  # 获取 (100, 100) 处的像素值

# 修改像素值
image[100, 100] = [255, 255, 255]  # 将 (100, 100) 处的像素设置为白色

1.3 批量像素操作

使用数组索引:

python 复制代码
import cv2
import numpy as np

# 读取图像
img = cv2.imread('11.png')
# 设置图像区域像素值
img[100:200, 100:200] = [255, 255, 255]  # 设置一个区域为白色

# 或者复制图像区域
roi = img[100:200, 100:200]
img[300:400, 300:400] = roi

cv2.imshow('image', img)
cv2.waitKey(0)

使用NumPy函数:

python 复制代码
import cv2
import numpy as np

# 读取图像
img = cv2.imread('11.png')
# 设置满足条件的像素
img[img > 200] = 255  # 将大于200的像素设为255
# 或者使用np.where
img = np.where(img < 100, 0, img)  # 将小于100的像素设为0

cv2.imshow('image', img)
cv2.waitKey(0)

1.4 性能优化建议

避免循环遍历像素

python 复制代码
# 不推荐:使用Python循环
for i in range(img.shape[0]):
    for j in range(img.shape[1]):
        img[i, j] = 255 - img[i, j]

# 推荐:使用向量化操作
img = 255 - img

2 图像通道分离与合并

图像通道分离与合并是OpenCV中处理多通道图像的重要操作,常用于彩色图像处理、颜色空间转换等场景。

注意:

  1. 内存使用cv2.split()会创建新的数组,占用额外内存
  2. 数据类型:确保所有通道具有相同的数据类型和尺寸
  3. 通道顺序:OpenCV默认使用BGR顺序,注意与其他库的兼容性
  4. 边界处理:操作通道时注意数值范围(通常0-255)

2.1 通道分离 (Split)

使用 cv2.split() 函数

python 复制代码
import cv2
import numpy as np

# 读取彩色图像
img = cv2.imread('image.jpg')  # 默认为BGR格式

# 分离通道
b, g, r = cv2.split(img)
# 或者
channels = cv2.split(img)
blue_channel = channels[0]
green_channel = channels[1]
red_channel = channels[2]

直接索引访问通道

python 复制代码
# 对于BGR图像
blue_channel = img[:, :, 0]
green_channel = img[:, :, 1]
red_channel = img[:, :, 2]

# 注意:这种方法直接引用原图像数据,修改会影响原图

2.2 通道合并 (Merge)

使用 cv2.merge() 函数

python 复制代码
# 合并三个单通道图像为多通道图像
merged_img = cv2.merge([b, g, r])

# 也可以创建包含特定通道的图像
# 例如创建只包含红色通道的BGR图像
red_only = cv2.merge([np.zeros_like(r), np.zeros_like(r), r])

2.3 实际应用示例

通道操作示例

python 复制代码
import cv2
import numpy as np

# 读取图像
img = cv2.imread('image.jpg')

# 分离BGR通道
b, g, r = cv2.split(img)

# 修改特定通道
# 增强红色通道
r_enhanced = cv2.add(r, 50)  # 增加红色分量

# 抑制绿色通道
g_suppressed = cv2.subtract(g, 50)  # 减少绿色分量

# 合并修改后的通道
modified_img = cv2.merge([b, g_suppressed, r_enhanced])

# 显示原图和修改后的图像
cv2.imshow('Original', img)
cv2.imshow('Modified', modified_img)

颜色空间转换中的应用

python 复制代码
# BGR转HSV并处理特定通道
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(hsv)

# 调整饱和度
s = cv2.multiply(s, 1.2)
s = np.clip(s, 0, 255).astype(np.uint8)

# 合并并转回BGR
hsv_modified = cv2.merge([h, s, v])
img_modified = cv2.cvtColor(hsv_modified, cv2.COLOR_HSV2BGR)

2.4 通道交换

python 复制代码
# 交换BGR到RGB
r, g, b = cv2.split(img)
rgb_img = cv2.merge([r, g, b])  # 注意这里顺序变了

# 或者使用索引
rgb_img = img[:, :, [2, 1, 0]]

2.5 Alpha通道处理

python 复制代码
# 对于RGBA图像
if img.shape[2] == 4:  # 检查是否有Alpha通道
    b, g, r, a = cv2.split(img)
    
    # 移除alpha通道
    bgr_img = cv2.merge([b, g, r])
    
    # 或者创建新的带alpha通道的图像
    new_alpha = np.full((img.shape[0], img.shape[1]), 255, dtype=np.uint8)
    img_with_alpha = cv2.merge([b, g, r, new_alpha])

2.6 性能优化技巧

避免不必要的通道分离

python 复制代码
# 不推荐:频繁分离和合并
b, g, r = cv2.split(img)
# 对每个通道进行处理
b_processed = some_operation(b)
g_processed = some_operation(g)
r_processed = some_operation(r)
result = cv2.merge([b_processed, g_processed, r_processed])

# 推荐:直接在多通道图像上操作
img_processed = some_operation(img)


相关推荐
小程故事多_805 小时前
基于LangGraph与Neo4j构建智能体级GraphRAG:打造下一代膳食规划助手
人工智能·aigc·neo4j
D***y2015 小时前
【Python】网络爬虫——词云wordcloud详细教程,爬取豆瓣最新评论并生成各式词云
爬虫·python·信息可视化
Bdygsl5 小时前
数字图像处理总结 Day 2 —— 数字化
图像处理·人工智能·计算机视觉
LDG_AGI5 小时前
【推荐系统】深度学习训练框架(九):推荐系统与LLM在Dataset、Tokenizer阶段的异同
人工智能·深度学习·算法·机器学习·推荐算法
智谱开放平台5 小时前
让 AI 真正懂仓库:如何用 CLAUDE.md 将 Claude Code 的工作效率发挥到极致
人工智能·claude
糯米酒5 小时前
不想使用docker部署n8n的看过来,你可以这样做
人工智能
roman_日积跬步-终至千里5 小时前
【模式识别与机器学习(17)】聚类分析教程【2】:高级方法与离群点分析
人工智能·机器学习·支持向量机
后台开发者Ethan5 小时前
py文件被初始化执行了2次
python
小殊小殊5 小时前
重磅!DeepSeek发布V3.2系列模型!
论文阅读·人工智能·算法