0 · 导读:为什么从「像素数组」讲起
OpenCV 里几乎所有操作都落在同一块数据上:一个按行排布的 H×W×CH \times W \times CH×W×C 数值数组。你调的 blur、cvtColor、threshold 本质上都是在遍历这块数组、按规则改写每个像素。理解数组的内存布局、索引方式、数据类型,比背 API 更重要——因为一旦你明白「图就是数组」,滤波、修 bug、做加速都只是数组操作。
- 本篇交互演示全部用纯 JavaScript 在浏览器里实时跑,不依赖任何 CDN / 网络,断网也能用;
- 每个演示右侧都标注了它在 OpenCV 里对应的真实函数(C++/Python)。
1 · 像素数组与 Mat:图在内存里到底是什么
OpenCV 用 cv::Mat 表示图像。一个 HHH 行 WWW 列、CCC 通道的 8 位图,在内存里是一段长度为 H×W×CH \times W \times CH×W×C 的连续字节,逐行、逐像素、逐通道排布:
内存布局(8UC3, BGR)
行0: [B G R][B G R][B G R] ... [B G R] ← W 个像素
行1: [B G R][B G R] ...
...
行H-1: ...
索引: idx = (y * W + x) * C + c 其中 c=0→B, c=1→G, c=2→R
关键陷阱:OpenCV 默认 BGR,不是 RGB! 用
imread读进来的图,img[y,x,0]是蓝色通道。matplotlib / 网页 Canvas / 手机相册大多是 RGB,混用时不做转换就会出现「蓝天变黄天」「红蓝互换」这种诡异结果。
1.1 像素级读写(Python / C++ 对照)
# Python — 最慢但最直观,仅用于理解
img = cv.imread("cat.jpg") # shape = (H, W, 3), dtype=uint8
blue = img[y, x, 0] # 取 (x,y) 处蓝色通道
img[y, x] = [255, 0, 0] # 把该像素改成纯蓝
# C++ — 用 .at<Vec3b> 访问,快且安全
cv::Mat img = cv::imread("cat.jpg")
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/reset2021/article/details/169360415



