图像基本操作很多,这里做个汇总
首先要注意,opencv 中像素通道顺序为 BGR,与我们常说的 RGB 刚好相反。
首先准备一张图片,可创建新图像,也可读取已存在的图像
img = np.zeros(shape=(300, 300, 3), dtype=np.uint8) cv.namedWindow('t') cv.imshow('t', img)
获取图像属性
## 行、列、通道数 # 如果是彩色图,返回 行、列、通道数;如果是灰度图,返回 行、列 print(img.shape) # (300, 300, 3) ## 像素总数 print(img.size) # 270000 ## 数据类型 # img.dtype在调试时非常重要,因为OpenCV-Python代码中的大量错误是由无效的数据类型引起的 print(img.dtype) # uint8
获取和修改像素
# 对于 BGR 图像,它返回一个由蓝色、绿色和红色值组成的数组。对于灰度图像,只返回相应的灰度 px = img[100, 100, 0] # 获取 print(px) # 0 img[100: 200, 100: 200, :3] = np.random.randint(0, 255, size=[100, 100, 3], dtype=np.uint8) # 修改 cv.imshow('t', img) cv.waitKey(0)
获取感兴趣区域 ROI
这里主要了解 ROI 概念,其实就是 获取图像某部分
roi = img[100: 150, 100: 150, : 3] # 获取 roi img[200: 250, 200: 250, : 3] = roi # 移动 roi cv.imshow('t', img) cv.waitKey(0)
拆分 和 合并 通道
## 拆分:把 b g r 拆分开,合并:把 一个 通道 合并到 某个图像 # 拆分 b, g, r = cv.split(img) # 合并 img2 = cv.merge((b, b, b)) cv.imshow('t', img2) cv.waitKey(0)
cv.split()是一项耗时的操作(就时间而言)。因此,仅在必要时才这样做。否则请进行Numpy索引
设置边框 和 填充
# def copyMakeBorder(src, top, bottom, left, right, borderType, dst=None, value=None): constant= cv.copyMakeBorder(img, 10, 20, 30, 10, cv.BORDER_CONSTANT, value=[255, 0, 0]) cv.imshow('t', constant) cv.waitKey(0)
未完待续...
参考资料:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
2019-10-09 VMware 无法开机