本节摘要:SOURCE 1.1:数字图像是物理场景经采样与量化得到的离散矩阵。本节动手用 OpenCV 读图、打印
dtype与动态范围,理解灰度 0–255 与二值图在分割中的角色。
连续光信号 → 传感器采样 → 每点量化到整数。灰度图每像素 1 通道 0–255;彩色 RGB 每像素 3 通道;二值图 0/1 表前景背景。
import cv2 import numpy as np img = cv2.imread('sample.png', cv2.IMREAD_GRAYSCALE) print(img.shape, img.dtype, img.min(), img.max()) # 例:(480, 640) uint8 0 255
# 256x256 渐变 — 理解量化 h, w = 256, 256 grad = np.tile(np.linspace(0, 255, w, dtype=np.uint8), (h, 1)) cv2.imwrite('grad.png', grad)
| 类型 | shape | 典型用途 |
|---|---|---|
| 灰度 | (H, W) | 边缘、阈值 |
| RGB/BGR | (H, W, 3) | 显示、颜色特征 |
| 二值 | (H, W) | 掩膜、轮廓 |

(H,W) 降维>128 得二值图,数白色像素占比grad.png 直方图用 cv2.calcHist 画出 — 应近似均匀⚠️ 常见坑:
imread失败返回None未检查 — 路径或中文编码问题。
💡 关键直觉:CV 里「图像」= NumPy 数组,算法 = 数组运算。
下一节深入矩阵存储与通道顺序。
数字图像由"采样密度(分辨率)"和"量化位数(位深)"两个维度刻画。分辨率决定空间细节:同样视野下 1920×1080 能分辨的最小物体是 640×480 的三倍小,但存储和计算也近似三倍。位深决定灰度层次:8 位灰度提供 256 级,医学影像常用 12 位(4096 级)或 16 位,因为病灶组织的灰度差异可能只有几十级,位深不足会直接丢失诊断信息。工业相机常见 8 位和 10 位,HDR 合成图像常以 16 位保存避免累加溢出。
# 存储量估算 h, w, c = 1920, 1080, 3 # 彩色 1080p bytes_per_img = h * w * c # 未压缩约 6.2 MB # 灰度为 h*w*1,二值图可压缩到 1/8(bit 打包)
二值图虽然在视觉上简单,实际却要谨慎处理:阈值选在哪、前后景如何定义,直接决定下游轮廓和测量的准确性。灰度图转二值图是"信息压缩",压缩时损失的细节无法恢复,所以工业流水线里通常保留灰度图做测量,只在需要掩膜时临时转二值。
评价图像质量有两个视角。客观指标:PSNR 用于和"干净参考图"比较,适合去噪实验;SSIM 更接近人眼感知,对结构信息敏感,适合评估压缩和增强效果;信噪比 SNR 衡量信号相对噪声的强度。主观视角:肉眼检查边缘是否清晰、是否有伪影,工业验收里"目视合格"往往是第一道门槛。做实验时建议固定一个标准动作:读图 → 打印 shape 和 dtype → 转灰度 → 画直方图 → 做变换 → 保存对比。这个固定动作跑熟之后,后续所有章节的实验都能复用,也是培养工程手感最快的方式。
补一个关于 dtype 的工程提醒:uint8 的加减会回绕(255+1=0),浮点图的范围是 0.0-1.0 而不是 0-255。用 numpy 直接做算术时一定要先确认类型,cv2.add 这类函数会自动饱和截断,而 numpy 的加法不会——这两者的差异是初学者最常见的隐性 bug 来源。遇到图像全黑或全白,第一反应检查类型和数值范围,多半能定位问题。
最后,数字化流程的物理意义值得多说一句:采样率不满足奈奎斯特条件时会产生混叠(锯齿、摩尔纹),这也是为什么工程上拍摄高密度纹理(栅栏、网格布)时图像会"闪"。理解采样量化这一对操作,是理解后续一切图像算法的起点。
再补一个像素邻接的概念:数字图像里像素的邻接有 4 邻接(上下左右)和 8 邻接(加对角线)两种,它决定连通性判断——8 邻接下两个对角相接的像素是连通的,4 邻接下则不是。这个区分在形态学(3.3 节)和区域生长(4.3 节)里直接影响结果,到时会回头用到本节的概念。另外图像显示时要注意数据类型:uint8 直接显示是 0-255 灰度,float32 直接显示往往全黑,需要归一化到 0-255 或 0-1,这也是实验里最常见的显示问题之一。