reset2021头像

OpenCV 图像处理基础实战:从像素数组到滤波与形态学

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

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--