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

OpenCV(九):NumPy中的矩阵的检索与赋值

基本检索(访问单个元素)

对于2D图像(矩阵),通常使用**行(高度)列(宽度)**索引来访问像素。

语法: matrix[行索引, 列索引]

图像类型访问方式含义
灰度图 (2D)img[r, c]访问位于 (r,c) 处的像素强度值(一个数值)。
彩色图 (3D)img[r, c]访问位于 (r,c) 处的像素,返回一个包含 (B, G, R) 三个通道值的数组。
彩色图 (3D)img[r, c, ch]访问位于 (r,c) 处的像素的特定通道值(一个数值),ch 是通道索引(0: Blue, 1: Green, 2: Red)。

示例:

import numpy as np
import cv2# 创建一个 3x3 的灰度图 (uint8)
img_gray = np.array([[10, 20, 30],[40, 50, 60],[70, 80, 90]], dtype=np.uint8)# 创建一个 3x3x3 的彩色图 (uint8)
# (r, c, ch) -> BGR
img_color = np.zeros((3, 3, 3), dtype=np.uint8)
img_color[1, 1] = [100, 150, 200] # 第二行第二列的 BGR# 1. 访问灰度图的元素 (第二行,第三列)
pixel_gray = img_gray[1, 2] # 60
print(f"灰度图 (1, 2) 处的值: {pixel_gray}")# 2. 访问彩色图的像素 (第二行,第二列)
pixel_color = img_color[1, 1] # [100, 150, 200]
print(f"彩色图 (1, 1) 处的像素 (BGR): {pixel_color}")# 3. 访问彩色图的特定通道 (第二行,第二列的蓝色通道)
blue_value = img_color[1, 1, 0] # 100
print(f"彩色图 (1, 1) 处的 B 通道值: {blue_value}")

基本赋值(修改单个元素)

赋值操作与检索操作类似,只需将访问结果设置为新值即可。

语法: matrix[行索引, 列索引] = 新值

示例:

# 修改灰度图的元素 (第一行,第一列)
img_gray[0, 0] = 5 
print(f"修改后的灰度图 (0, 0): {img_gray[0, 0]}") # 5# 修改彩色图的像素 (第三行,第一列)
img_color[2, 0] = [10, 20, 30] # 设置 BGR
print(f"修改后的彩色图 (2, 0) 像素: {img_color[2, 0]}") # [10, 20, 30]# 修改彩色图的特定通道 (第二行,第二列的红色通道)
img_color[1, 1, 2] = 255 # R 通道设置为 255
print(f"修改后的彩色图 (1, 1) 像素: {img_color[1, 1]}") # [100, 150, 255]

区域检索与赋值(切片 Slice)

NumPy强大的**切片(Slicing)**功能允许您访问或修改矩阵的子区域。

语法: matrix[起始行:结束行, 起始列:结束列]

  • 切片范围是前闭后开[start:stop],包含 start 但不包含 stop
  • 可以省略 startstop 来表示从头开始或到尾部。
  • 使用 : 单独表示选取该轴上的所有元素。

示例:

# 假设 img 是一个 100x150 的彩色图像# 1. 检索一个 50x50 的子区域 (从第10行到第60行,从第20列到第70列)
roi = img_color[1:3, 0:2] # 选取 (1,0), (1,1), (2,0), (2,1) 四个像素的区域# 2. 访问图像的所有行,但只访问第10列到第20列
column_slice = img_color[:, 1:3] # 3. 访问图像的所有列,但只访问第50行到第60行
row_slice = img_color[0:2, :] # 4. 赋值:将一个区域的所有像素设置为白色 (假设是 uint8 图像)
# 注意:在彩色图中,白色是 (255, 255, 255)
img_color[0:1, 0:1] = [255, 255, 255] # 将 (0,0) 像素设为白色
print(f"修改后的彩色图 (0, 0) 像素: {img_color[0, 0]}") # [255, 255, 255]# 5. 赋值:将一个区域的所有像素设置为一个标量(仅对灰度图或某一通道有效)
img_gray[0:2, 0:2] = 0 # 将左上角 2x2 区域设为黑色 (0)
print(f"修改后的灰度图: \n{img_gray}") 
# [[ 0  0 30]
#  [ 0  0 60]
#  [70 80 90]]

布尔检索(Boolean Indexing)

布尔索引使用一个与矩阵形状相同的布尔(True/False)矩阵来选择元素。

示例:

# 检索:找出所有像素值大于 50 的位置
condition = img_gray > 50
print(f"布尔条件矩阵: \n{condition}")# 检索:获取所有大于 50 的值
values_gt_50 = img_gray[condition]
print(f"大于 50 的值: {values_gt_50}") # [60, 70, 80, 90]# 赋值:将所有像素值大于 50 的像素设置为 255
img_gray[img_gray > 50] = 255
print(f"布尔赋值后的灰度图: \n{img_gray}")
# [[ 0  0 30]
#  [ 0  0 255]
#  [255 255 255]]

重要提示:切片是引用!

在NumPy中,当你使用切片(例如 roi = img[r1:r2, c1:c2])时,roi 并不是原始矩阵的副本,而是一个视图(View),它引用了原始矩阵的同一块数据。

这意味着:

  • 修改 roi 会同时修改原始矩阵 img
  • 如果你需要一个独立的副本,请使用 .copy() 方法:roi_copy = img[r1:r2, c1:c2].copy()
  • 使用像 numpy.array() 这样的函数进行的简单索引(例如 img[1, 2])返回的是值本身,而不是引用。
http://www.dtcms.com/a/478621.html

相关文章:

  • 保定哪家做网站专业长沙的在线商城网站建设
  • 加密货币与金融体系融合:趋势洞察与未来展望
  • “icoin如何重新定义交易所的安全与体验”
  • Spring Boot微服务架构详解
  • 鸿蒙:将项目的rawfile目录下全部文件拷贝到app沙箱目录
  • SQL sever数据库--第一次作业
  • 青春励志剧《我的鸵鸟先生》杀青,陈若尧唱演结合,演绎反派摇滚歌手
  • CCF-GESP 等级考试 2025年9月认证C++四级真题解析
  • 旅游网站建设水平评价做网站总结
  • 网站模版建设工具中国域名拍卖网
  • 做旅游网站的引言自字网站建设教程
  • [工作流节点26] 流程性能优化与大规模并发场景实战指南
  • 十二、kubernetes 1.29 之 存储 Volume、pv/pvc
  • 精品网站建设价格网页制作的软件
  • 做卫浴软管的网站网站做好后怎么更新内容
  • 如何在合法合规范围内获取 sitekey 参数?有哪些公开/私有获取途径
  • JDK17先进特性
  • Spring Boot接入链路追踪(Micrometer Tracing+Zipkin) 一
  • Jenkins Share Library教程 —— 开发入门
  • SpringBoot读取自定义格式的Nacos配置
  • WordPress建站怎么交付青岛seo网络推广
  • 江西个人网站备案小制作小发明简单做法
  • 在Qt中实现SwitchButton(开关按钮)
  • day9_elementPlus2
  • qiankun子应用使用elementUI操作反馈图标不显示
  • Vue3.0: v-model 组件双向绑定学习文档 (v3.4 前后对比 + TypeScript)
  • 中山哪里有做微网站的做ppt图片用的网站
  • 『 QT 』QT窗口坐标体系详解
  • 服务器里怎么建设网站网站开发网站设计素材
  • 从多个数据源(CSV, Excel, SQL)自动整合数据