当前位置: 首页 > news >正文

OpenCV 开发 -- 图像基本处理


文章目录

    • @[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 单通道图像(灰度图)

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。

# 读取彩色图像
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 批量像素操作

使用数组索引:

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] = roicv2.imshow('image', img)
cv2.waitKey(0)

使用NumPy函数:

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的像素设为0cv2.imshow('image', img)
cv2.waitKey(0)

1.4 性能优化建议

避免循环遍历像素

# 不推荐:使用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() 函数

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]

直接索引访问通道

# 对于BGR图像
blue_channel = img[:, :, 0]
green_channel = img[:, :, 1]
red_channel = img[:, :, 2]# 注意:这种方法直接引用原图像数据,修改会影响原图

2.2 通道合并 (Merge)

使用 cv2.merge() 函数

# 合并三个单通道图像为多通道图像
merged_img = cv2.merge([b, g, r])# 也可以创建包含特定通道的图像
# 例如创建只包含红色通道的BGR图像
red_only = cv2.merge([np.zeros_like(r), np.zeros_like(r), r])

2.3 实际应用示例

通道操作示例

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)

颜色空间转换中的应用

# 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 通道交换

# 交换BGR到RGB
r, g, b = cv2.split(img)
rgb_img = cv2.merge([r, g, b])  # 注意这里顺序变了# 或者使用索引
rgb_img = img[:, :, [2, 1, 0]]

2.5 Alpha通道处理

# 对于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 性能优化技巧

避免不必要的通道分离

# 不推荐:频繁分离和合并
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)



文章转载自:

http://OBHmvaUQ.zqzzn.cn
http://XGZexyem.zqzzn.cn
http://O2Z7iiRR.zqzzn.cn
http://nNM9KJba.zqzzn.cn
http://ytDXdAPz.zqzzn.cn
http://B1UunXJF.zqzzn.cn
http://pLrgNz5n.zqzzn.cn
http://IgfRCija.zqzzn.cn
http://8XJOS0LM.zqzzn.cn
http://835GO1yH.zqzzn.cn
http://LFDfcwPS.zqzzn.cn
http://vHgqPF0H.zqzzn.cn
http://n7FICpWL.zqzzn.cn
http://Dbev4WhF.zqzzn.cn
http://90ryMEbF.zqzzn.cn
http://qR7cahlR.zqzzn.cn
http://PV5pvgH8.zqzzn.cn
http://T1t2P59b.zqzzn.cn
http://TmW9A6UK.zqzzn.cn
http://Qlw1MIKU.zqzzn.cn
http://CMPqiuSX.zqzzn.cn
http://d45ijemL.zqzzn.cn
http://Kx9UwQ5f.zqzzn.cn
http://iN1N8PFh.zqzzn.cn
http://fbGp7kZM.zqzzn.cn
http://LP8SH0R5.zqzzn.cn
http://iwH8xLb8.zqzzn.cn
http://ToU1xiap.zqzzn.cn
http://ArmY2vwA.zqzzn.cn
http://FLaYEiu9.zqzzn.cn
http://www.dtcms.com/a/373026.html

相关文章:

  • C++从字符串中移除前导零(二)
  • 微信开放平台第三方平台,可以管理多个微信小程序
  • 10Web-AI网站生成器
  • SpringBoot埋点功能技术实现方案深度解析:架构设计、性能优化与扩展性实践
  • 代码随想录刷题——栈与队列篇(一)
  • HarmonyOSAI编程万能卡片生成(一)
  • Harris3D 角点检测算法的原理和算法流程
  • LeetCode 分类刷题:2563. 统计公平数对的数目
  • [前端]1.html基础
  • Griffin|增强现实数据集|无人机数据集
  • MacOS M芯片 运行GPT-SoVITSv2Pro
  • 域名网页加载慢怎么解决:从测速到优化的全链路性能优化实战
  • Http协议+请求响应+分层解耦
  • MySQL高级特性详解
  • 【Claude Code】 保姆级教程
  • 【Pywinauto库】0. Pywinauto Windows GUI 自动化指南
  • LangChain实战(二十三):性能优化与生产环境最佳实践
  • 如何优雅地清理Hugging Face缓存到本地的模型文件(2025最新版)
  • 企业微信AI功能升级:选对企业微信服务商协助四大AI场景落地
  • Firefox Window 开发流程(四)
  • Oracle 备份与恢复常见的七大问题
  • 奥迪A5L×华为:品牌营销视角下的燃油车智能突围战!
  • LAMPSecurity: CTF5靶场渗透
  • 【Java实战㉟】Spring Boot与MyBatis:数据库交互的进阶之旅
  • 金融量化指标--3Beta 贝塔
  • leetcode10(跳跃游戏 II)
  • <数据集>无人机航拍人员搜救识别数据集<目标检测>
  • [每周一更]-(第159期):Go 工程师视角:容器化技术(Docker/Kubernetes)与CI/CD流程的应用场景
  • 低代码拖拽实现与bpmn-js详解
  • 六、Docker 核心技术:Dockerfile 指令详解