OpenCV学习(五)——图像基本操作(访问图像像素值、图像属性、感兴趣区域ROI和图像边框)

图像基本操作

    • [5. 图像基本操作](#5. 图像基本操作)
      • [5.1 访问像素值并修改](#5.1 访问像素值并修改)
      • [5.2 访问图像属性](#5.2 访问图像属性)
      • [5.2 图像感兴趣区域ROI](#5.2 图像感兴趣区域ROI)
      • [5.3 拆分和合并图像通道](#5.3 拆分和合并图像通道)
      • [5.4 为图像设置边框(填充)](#5.4 为图像设置边框(填充))

5. 图像基本操作

  • 访问像素值并修改
  • 访问图像属性
  • 设置感兴趣区域(ROI)
  • 分割和合并图像

5.1 访问像素值并修改

访问像素值

python 复制代码
import cv2

# 读取图像
# img------>(h, w, c),c为通道数
img = cv2.imread('lena.jpg')

# 访问像素值
px = img[100, 100]
print("像素值:", px)
# img------>(b, g, r)
# 蓝色像素值------>对应通道b
blue = img[100, 100, 0]
print("蓝色像素值:", blue)

修改像素值

python 复制代码
img[100, 100] = [255,255,255]
print(img[100,100])

简单访问每个像素值并修改比较缓慢,一般不使用。

Numpy数组方法array.item()array.itemset()被认为更好,但是它们始终返回标量。

更好的像素访问和编辑方法:

python 复制代码
# 访问蓝色像素值
print(img.item(100, 100, 0))

# 修改蓝色像素值
img.itemset((100,100,0), 255)

修改B通道像素值为255,区间[200:400, 200:400]

python 复制代码
import cv2

# 读取图像
# img------>(h, w, c),c为通道数
img = cv2.imread('lena.jpg')

# 修改B通道像素值为255,区间[200:400, 200:400]
for i in range(200, 400):
    for j in range(200, 400):
        img.itemset((i, j, 0), 255)

# 显示图像
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

5.2 访问图像属性

属性属性包括行数、列数和通道数,图像数据类型,像素数等。

python 复制代码
import cv2

# 读取图像
# img------>(h, w, c),c为通道数
img = cv2.imread('lena.jpg')

# 图像形状
print('图像形状', img.shape)
# 像素总数
print('像素总数', img.size)

# 图像数据类型
print('图像数据类型', img.dtype)

5.2 图像感兴趣区域ROI

对于人物图像,我们感兴趣的一般是人脸区域。使用Numpy索引再次获得ROI,并将脸复制到图像中的另一个区域:

python 复制代码
import cv2

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

# 获取脸的区域
face = img[200:400, 200:400]

# 将脸复制到另一区域
img[200:400, 0:200] = face

# 显示图像
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

5.3 拆分和合并图像通道

将图像的通道进行分离,并分开展示。同时实现OpenCV在一个窗口显示多张图像。

python 复制代码
import cv2
import numpy as np

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

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

# 合并通道
img_m = cv2.merge((b, g, r))

# 改变各通道图像的尺寸
b = cv2.resize(b, (200, 200))
g = cv2.resize(g, (200, 200))
r = cv2.resize(r, (200, 200))
img = cv2.resize(img, (200, 200))


# 将单通道图像转换为3通道
b = cv2.cvtColor(b, cv2.COLOR_GRAY2RGB)
g = cv2.cvtColor(g, cv2.COLOR_GRAY2RGB)
r = cv2.cvtColor(r, cv2.COLOR_GRAY2RGB)

# 同一窗口显示多张图像
# 拼接需要图像的形状及通道一样
hmerge = np.hstack((b, g, r, img)) # 水平拼接
vmerge = np.vstack((b, g, r)) # 垂直拼接

# 显示图像
cv2.imshow('image', hmerge)
cv2.waitKey(0)
cv2.destroyAllWindows()

5.4 为图像设置边框(填充)

cv2.copyMakeBorder(src, top, bottom, left, right, borderType, dst=None, value=None)函数在卷积运算,零填充等方面有很多应用。

  • src:输入图像

  • top,bottom,left,right:边界宽度(以相应方向上的像素数为单位)

  • borderType:定义要添加哪种边框的标志,可以是以下类型

    • cv2.BORDER_CONSTANT :添加恒定的彩色边框
    • cv2.BORDER_REFLECT : 边框将是边框元素的镜像
    • cv2.BORDER_REPLICATE:最后一个元素被复制
    • cv2.BORDER_WRAP:包裹
  • dst:目标图像

  • value:边框的颜色

python 复制代码
import cv2
import numpy as np

# 读取图像
img = cv2.imread('lena.jpg')
img = cv2.resize(img, (200, 200))

# 设置边框
constant = cv2.copyMakeBorder(img, 10, 10, 10, 10, cv2.BORDER_CONSTANT)
reflect = cv2.copyMakeBorder(img, 10, 10, 10, 10, cv2.BORDER_REFLECT)
replicate = cv2.copyMakeBorder(img, 10, 10, 10, 10, cv2.BORDER_REPLICATE)
wrap = cv2.copyMakeBorder(img, 10, 10, 10, 10, cv2.BORDER_WRAP)

# 图像拼接,水平
hmerge = np.hstack((constant, reflect, replicate, wrap)) # 水平拼接


# 显示图像
cv2.imshow('image', hmerge)
cv2.waitKey(0)
cv2.destroyAllWindows()
相关推荐
我命由我123452 分钟前
python-dotenv - python-dotenv 快速上手
服务器·开发语言·数据库·后端·python·学习·学习方法
测试人社区-千羽13 分钟前
48小时攻克测试岗——闪电面试极速备战手册
人工智能·python·opencv·面试·职场和发展·单元测试·压力测试
独自归家的兔15 分钟前
大模型通义千问3-VL-Plus - 视觉推理(在线视频)
人工智能·计算机视觉
qq_1601448718 分钟前
2025年AI工程师认证报考指南:上海站最新流程
人工智能
Coding茶水间27 分钟前
基于深度学习的脑肿瘤检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
人工智能·深度学习·yolo·目标检测·机器学习·计算机视觉
L.EscaRC43 分钟前
【AI基础篇】认识RNN
人工智能·rnn·深度学习
Vantastic9991 小时前
基于Qwen Agent的多智能体协作系统:实现AI团队协同工作流
人工智能·python
Tezign_space1 小时前
抖音AI运营工具技术实践:特赞内容矩阵架构与300%效率提升方案
人工智能·架构·aigc·内容运营·抖音·ai营销工具·特赞
亿坊电商1 小时前
无人共享茶室智慧化破局:24H智能接单系统的架构实践与运营全景!
大数据·人工智能·架构
老蒋新思维1 小时前
创客匠人峰会新解:AI 时代知识变现的 “信任分层” 法则 —— 从流量到高客单的进阶密码
大数据·网络·人工智能·tcp/ip·重构·创始人ip·创客匠人