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)


相关推荐
GEO科技权威资讯6 小时前
生成对抗网络 (GAN):理解其原理与创作能力
人工智能·神经网络·生成对抗网络
一个java开发6 小时前
distributed.client.Client 用户可调用函数分析
大数据·python
eqwaak07 小时前
Matplotlib 动态显示详解:技术深度与创新思考
网络·python·网络协议·tcp/ip·语言模型·matplotlib
六月的可乐7 小时前
【干货推荐】AI助理前端UI组件-悬浮球组件
前端·人工智能·ui
蔡俊锋7 小时前
【无标题】
人工智能·chatgpt
007php0077 小时前
某大厂MySQL面试之SQL注入触点发现与SQLMap测试
数据库·python·sql·mysql·面试·职场和发展·golang
CodeCraft Studio7 小时前
Excel处理控件Aspose.Cells教程:使用 Python 将 Pandas DataFrame 转换为 Excel
python·json·excel·pandas·csv·aspose·dataframe
说私域7 小时前
基于开源AI大模型AI智能名片S2B2C商城小程序的参与感构建研究
人工智能·小程序·开源
flashlight_hi7 小时前
LeetCode 分类刷题:2563. 统计公平数对的数目
python·算法·leetcode