04: 图像基本操作
2023-04-18 14:13:29 时间
学习获取和修改像素点的值,ROI感兴趣区域,通道分离合并等基本操作。图片等可到文末引用处下载。
目标
- 访问和修改图片像素点的值
- 获取图片的宽、高、通道数等属性
- 了解感兴趣区域ROI
- 分离和合并图像通道
教程
获取和修改像素点值
我们先读入一张图片:
import cv2
img = cv2.imread('lena.jpg')Copy to clipboardErrorCopied
通过行列的坐标来获取某像素点的值,对于彩色图,结果是B,G,R三个值的列表,对于灰度图或单通道图,只有一个值:
px = img[100, 90]
print(px) # [103 98 197]
# 只获取蓝色blue通道的值
px_blue = img[100, 90, 0]
print(px_blue) # 103Copy to clipboardErrorCopied
还记得吗?行对应y,列对应x,所以其实是img[y, x]
,需要注意噢(●ˇ∀ˇ●)。容易混淆的话,可以只记行和列,行在前,列在后。
修改像素的值也是同样的方式:
img[100, 90] = [255, 255, 255]
print(img[100, 90]) # [255 255 255]Copy to clipboardErrorCopied
经验之谈:还有一种性能更好的方式,获取:
img.item(100,100,0)
,修改:img.itemset((100,100,0),255)
,但这种方式只能B,G,R逐一进行。
注意:这步操作只是内存中的img像素点值变了,因为没有保存,所以原图并没有更改。
图片属性
img.shape
获取图像的形状,图片是彩色的话,返回一个包含行数(高度)、列数(宽度)和通道数的元组,灰度图只返回行数和列数:
print(img.shape) # (263, 247, 3)
# 形状中包括行数、列数和通道数
height, width, channels = img.shape
# img是灰度图的话:height, width = img.shapeCopy to clipboardErrorCopied
img.dtype
获取图像数据类型:
print(img.dtype) # uint8Copy to clipboardErrorCopied
经验之谈:多数错误是因为数据类型不对导致的,所以健壮的代码应该对这个属性加以判断。
img.size
获取图像总像素数:
print(img.size) # 263*247*3=194883Copy to clipboardErrorCopied
ROI
ROI:Region of Interest,感兴趣区域。什么意思呢?比如我们要检测眼睛,因为眼睛肯定在脸上,所以我们感兴趣的只有脸这部分,其他都不care,所以可以单独把脸截取出来,这样就可以大大节省计算量,提高运行速度。
截取ROI非常简单,指定图片的范围即可(后面我们学了特征后,就可以自动截取辣,(ง •_•)ง):
# 截取脸部ROI
face = img[100:200, 115:188]
cv2.imshow('face', face)
cv2.waitKey(0)Copy to clipboardErrorCopied
通道分割与合并
彩色图的BGR三个通道是可以分开单独访问的,也可以将单独的三个通道合并成一副图像。分别使用cv2.split()
和cv2.merge()
:
b, g, r = cv2.split(img)
img = cv2.merge((b, g, r))Copy to clipboardErrorCopied
split()
函数比较耗时,更高效的方式是用numpy中的索引,如提取B通道:
b = img[:, :, 0]
cv2.imshow('blue', b)
cv2.waitKey(0)Copy to clipboardErrorCopied
小结
img[y,x]
获取/设置像素点值,img.shape
:图片的形状(行数、列数、通道数),img.dtype
:图像的数据类型。img[y1:y2,x1:x2]
进行ROI截取,cv2.split()/cv2.merge()
通道分割/合并。更推荐的获取单通道方式:b = img[:, :, 0]
。
练习
- 打开lena.jpg,将帽子部分(高:25
120,宽:50220)的红色通道截取出来并显示。
接口文档
引用
相关文章
- 【技术种草】cdn+轻量服务器+hugo=让博客“云原生”一下
- CLB运维&运营最佳实践 ---访问日志大洞察
- vnc方式登陆服务器
- 轻松学排序算法:眼睛直观感受几种常用排序算法
- 十二个经典的大数据项目
- 为什么使用 CDN 内容分发网络?
- 大数据——大数据默认端口号列表
- Weld 1.1.5.Final,JSR-299 的框架
- JavaFX 2012:彻底开源
- 提升as3程序性能的十大要点
- 通过凸面几何学进行独立于边际的在线多类学习
- 利用行动影响的规律性和部分已知的模型进行离线强化学习
- ModelLight:基于模型的交通信号控制的元强化学习
- 浅谈Visual Source Safe项目分支
- 基于先验知识的递归卡尔曼滤波的代理人联合状态和输入估计
- 结合网络结构和非线性恢复来提高声誉评估的性能
- 最佳实践丨云开发CloudBase多环境管理实践
- TimeVAE:用于生成多变量时间序列的变异自动编码器
- 具有线性阈值激活的神经网络:结构和算法
- 内网渗透之横向移动 -- 从域外向域内进行密码喷洒攻击