返回

像素矩阵与邻域窗口

Pixel Matrix & Neighborhood - 图像即矩阵:像素坐标、索引、邻域与局部窗口
第二章 / 图像预处理
参数面板

左侧切换示例图像、显示模式、窗口大小与邻域类型;右侧固定当前像素,逐一对应图像坐标、数组行列、像素值和局部邻域窗口。

3
图像信息小矩阵 8×8
尺寸:8 × 8
矩阵:8 行 × 8
总像素数:64
当前窗口:3×3
当前模式:灰度(单通道)
窗口定位辅助操作
用方向键或下方 4 个按钮移动当前窗口;也可以直接点击原图或结果图跳转。
当前像素 (0, 0)1 / 64
方向
概念说明

为什么需要边界策略

把图像看成像素矩阵后,边缘位置的邻域窗口会出现越界问题。图源:项目示例图
任务

当 3×3 或更大的窗口滑到图像边缘时,窗口中心周围的格子会跑到图像外面。如果不处理,这个窗口就缺像素、算不下去。

思路

常用的处理办法是给越界位置赋一个可用的像素值:可以补 0、复制边缘像素、按镜像方式对称填充,或者只计算窗口中仍在图像内的部分。补法不同,边缘像素的输出结果就不一样。

观察

把窗口拖到图像边缘,看看邻域矩阵里哪些格子来自原图、哪些格子是边界策略补出来的;换一种策略,比较输出值的变化,就能明白边界处理到底影响了什么。

方向键移动行列 / 点击图像或矩阵格子跳转当前像素 (0, 0)
1 / 64
原图8×8
原图 · 点击或方向键选择像素
矩阵访问
1 / 64
矩阵视图8×8
同步矩阵视图(选中行列高亮)
当前 3×3 邻域窗口
整个方阵都是当前窗口内的像素;绿色高亮标出八邻域的方向集合。
0.0
0.0
0.1
0.0
0.0
0.1
0.1
0.1
0.1
当前窗口如何读取
中心像素位于第 1 行、第 1 列,即数学坐标 (x=0, y=0)。 当前窗口向四周各扩展 1 格,得到 3×3 邻域窗口;窗口内所有格子都属于当前局部范围。
八邻域在四邻域基础上再加入左上、右上、左下、右下四个对角位置。绿色描边用于说明方向定义,不表示大窗口里只有这些格子参与。
当前窗口靠近图像边界,越界位置按 clamp 策略复制最近的边界像素。

图像 = 矩阵

图像尺寸
高度 × 宽度 = 8 × 8 → 矩阵 8 行 × 8
当前像素
1 行,第 1 → 数学坐标 (0, 0)
灰度图中每个元素是一个标量;示例统一使用 [0, 1] 归一化值, OpenCV 8-bit 图像中常见范围是 [0, 255]。 彩色图中每个元素是 (R, G, B) 三元组。 在 OpenCV 中使用 cv::Mat 存储, 通过 image.at<uchar>(row, col) 访问灰度值, 通过 image.at<Vec3b>(row, col)[k] 访问通道值(k=0 B, 1 G, 2 R)。

坐标约定

image[row][col]0 行(row),第 0 列(col)
(x, y)x = 0(水平/列方向),y = 0(垂直/行方向)
图像坐标系中 y 轴向下为正,与数学坐标系 y 轴向上相反。坐标统一使用 (x, y) = (col, row)。
(x,y) = (col,row) = (0,0)

灰度像素 — 单通道值

选中像素
1, 列 1
灰度值:0.000→ 标量(单通道)

3×3 邻域窗口(中心红框 = image[0][0])

N(x,y) = { image[y+dy][x+dx] | -hdx,dyh }
其中 k = 3h = floor(k / 2) = 1; 因此当前窗口覆盖中心像素周围横向和纵向各 1 格。
0.0
0.0
0.1
0.0
0.0
0.1
0.1
0.1
0.1
八邻域(8 方向)
(-1, -1)
(0, -1)
(+1, -1)
(-1, 0)
(+1, 0)
(-1, +1)
(0, +1)
(+1, +1)
八邻域包含四邻域的全部方向,再加上四个对角方向;在 3×3 情况下,除中心外的 8 个位置都会被高亮。

边界越界处理

当前像素位于图像边界附近(行 1,列 1),3×3 窗口部分超出图像范围。

Clamp(复制边界)
越界坐标映射到最近的有效边界像素值
Zero(补零)
越界位置填充 0
Mirror(镜像)
越界位置沿边界镜像反射
Ignore(忽略)
不处理边界像素,输出图缩小

当前边界处理使用 Clamp 策略(灰显策略为当前页面未实现的常见方案,仅作知识扩展参考)。

矩阵详览(点击跳转)

为什么需要邻域窗口?

卷积、均值滤波、中值滤波、Sobel 边缘检测、拉普拉斯锐化、形态学操作等算法, 都依赖从图像中取出一个局部窗口(邻域),对这个窗口内的像素进行加权求和、排序、比较等操作, 然后将结果写回输出图像的对应位置。没有邻域窗口概念,就无法理解为什么这些算法需要“看周围像素”而不只是“看当前像素”。