2026/2/17 2:00:53
网站建设
项目流程
石家庄规划建设局网站,微信网站模版下载,合肥网站设计服,域名查询 阿里云前言大家好#xff01;今天给大家梳理《数字图像处理》第 2 章的核心内容 —— 数字图像基础。这一章是整个数字图像处理的入门基石#xff0c;涵盖了从视觉感知到图像数字化、像素关系、数学工具等核心知识点。全文搭配可直接运行的 Python 代码、效果对比图和详细注释…前言大家好今天给大家梳理《数字图像处理》第 2 章的核心内容 —— 数字图像基础。这一章是整个数字图像处理的入门基石涵盖了从视觉感知到图像数字化、像素关系、数学工具等核心知识点。全文搭配可直接运行的 Python 代码、效果对比图和详细注释帮大家直观理解抽象概念新手也能轻松上手2.1 视觉感知要素2.1.1 人眼的结构人眼是图像感知的核心器官核心结构包括角膜→虹膜→瞳孔→晶状体→视网膜含视锥 / 视杆细胞。视锥细胞约 600-700 万个集中在黄斑区负责彩色视觉和高分辨率细节感知视杆细胞约 1 亿个分布在视网膜周边负责低光照下的暗视觉无色彩感知。2.1.2 人眼的成像原理人眼类似凸透镜成像系统光线经晶状体聚焦后在视网膜上形成倒立的实像视网膜上的感光细胞将光信号转化为神经电信号经视神经传递到大脑视觉皮层大脑最终将倒立的像 “矫正” 为正立的视觉感知。2.1.3 亮度适应与亮度分辨力亮度适应人眼能适应的亮度范围约从10−6 cd/m²暗视觉到106 cd/m²亮视觉但不能同时适应整个范围只能在某一 “亮度级” 下分辨细节亮度分辨力人眼对亮度变化的分辨能力有限通常在相同亮度背景下能分辨的最小亮度差约为背景亮度的 1%-2%。代码案例模拟人眼亮度分辨力亮度差感知import numpy as np import matplotlib.pyplot as plt # 设置matplotlib支持中文显示 plt.rcParams[font.sans-serif] [SimHei] # 黑体 plt.rcParams[axes.unicode_minus] False # 解决负号显示问题 # 生成背景亮度为100的图像中间添加不同亮度差的矩形块 def simulate_brightness_resolution(): # 构建500x500的背景图像亮度值100灰度范围0-255 background np.ones((500, 500)) * 100 # 定义不同的亮度差1%、2%、5%、10% diffs [1, 2, 5, 10] # 对应100的1%、2%、5%、10% colors [r, g, b, y] labels [1%亮度差, 2%亮度差, 5%亮度差, 10%亮度差] fig, ax plt.subplots(1, 1, figsize(8, 8)) ax.imshow(background, cmapgray, vmin0, vmax255) ax.axis(off) # 在图像中绘制不同亮度差的矩形 y_start 100 for i, diff in enumerate(diffs): # 计算矩形的亮度值 rect_brightness 100 diff # 绘制矩形x范围200-300y范围按顺序排列 rect np.ones((80, 100)) * rect_brightness background[y_starti*80 : y_start(i1)*80, 200:300] rect ax.imshow(background, cmapgray, vmin0, vmax255) # 添加图例 for i, label in enumerate(labels): ax.text(310, y_starti*8040, label, colorcolors[i], fontsize12) plt.title(人眼亮度分辨力模拟背景亮度100, fontsize14) plt.show() # 运行函数 simulate_brightness_resolution()效果说明运行后能看到1% 亮度差的矩形几乎和背景融为一体人眼难以分辨2% 开始隐约可见5% 以上清晰可辨直观体现人眼的亮度分辨特性。2.2 光与电磁波谱图像的本质是光的分布可见光只是电磁波谱中很小的一段波长 400nm-700nm波长 400nm紫外线、X 射线、γ 射线波长 700nm红外线、微波、无线电波数字图像处理主要关注可见光成像和近红外线遥感、夜视等。公式光的波长与频率关系cλ×f其中c为光速3×108 m/sλ为波长f为频率。2.3 图像传感与采集图像采集的核心是将光信号转化为电信号再转化为数字信号。常见的传感器类型如下2.3.1 单传感器图像采集单个光敏传感器通过机械扫描如旋转 / 平移逐点采集图像优点是精度高缺点是速度慢如早期传真机、高精度光谱仪。2.3.2 线阵传感器图像采集由一行传感器组成通过物体 / 传感器移动实现二维图像采集如扫描仪、工业检测线扫相机适合长条状物体成像如纸张、布匹。2.3.3 面阵传感器图像采集由二维阵列的传感器组成如 CCD/CMOS直接一次性采集二维图像速度快、操作简单是目前数码相机、手机摄像头的主流方案。2.3.4 简易图像形成模型数字图像可简化为光照i和反射r的乘积代码案例模拟图像形成模型光照 × 反射import numpy as np import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 生成光照图中心亮、边缘暗 x, y np.meshgrid(np.linspace(-1, 1, 500), np.linspace(-1, 1, 500)) i np.exp(-(x**2 y**2)/0.5) # 高斯分布光照 i i / i.max() # 归一化到0-1 # 生成反射图矩形区域反射率高其余低 r np.ones((500, 500)) * 0.2 # 背景反射率0.2 r[150:350, 150:350] 0.8 # 中心矩形反射率0.8 # 生成最终图像 f i * r # 绘制对比图 fig, axes plt.subplots(1, 3, figsize(15, 5)) axes[0].imshow(i, cmapgray, vmin0, vmax1) axes[0].set_title(光照分量 i(x,y), fontsize12) axes[0].axis(off) axes[1].imshow(r, cmapgray, vmin0, vmax1) axes[1].set_title(反射分量 r(x,y), fontsize12) axes[1].axis(off) axes[2].imshow(f, cmapgray, vmin0, vmax1) axes[2].set_title(最终图像 f(x,y)i×r, fontsize12) axes[2].axis(off) plt.tight_layout() plt.show()2.4 图像采样与量化2.4.1 采样与量化的基本概念采样将连续的空间坐标x,y离散化即 “取点”采样间隔决定空间分辨率量化将连续的亮度值离散化即 “取级”量化级数决定灰度分辨率。2.4.2 数字图像的表示方法采样和量化后的数字图像是二维矩阵2.4.3 空间分辨率与灰度分辨率空间分辨率单位长度内的像素数如dpi、像素/厘米分辨率越低图像越模糊灰度分辨率灰度级的数量如8位灰度图256级分辨率越低图像“层次感”越差。代码案例空间分辨率灰度分辨率对比import numpy as np import matplotlib.pyplot as plt import matplotlib.image as mpimg # 用于加载本地图像 import os # 用于检查文件是否存在 # 设置matplotlib支持中文显示 plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 加载本地图像 image_path ../picture/CSGO.jpg # 检查文件是否存在 if not os.path.exists(image_path): raise FileNotFoundError(f未找到图像文件{image_path}\n请检查路径是否正确) # 加载图像并转换为灰度图兼容彩色/灰度图像 img mpimg.imread(image_path) # 如果是彩色图像3通道转换为灰度图如果已是灰度图则直接使用 if len(img.shape) 3: # 按RGB权重转换为灰度Y 0.2989R 0.5870G 0.1140B img np.dot(img[..., :3], [0.2989, 0.5870, 0.1140]).astype(np.uint8) # 确保图像是8位灰度图0-255 img img.astype(np.uint8) # 打印图像基本信息方便调试 print(f图像尺寸{img.shape}) print(f图像数据类型{img.dtype}) print(f灰度值范围{img.min()} ~ {img.max()}) # 原有逻辑保留不变 # 1. 空间分辨率对比下采样 # 动态计算下采样间隔适配不同尺寸的图像避免采样后尺寸过小/过大 # 目标采样后尺寸约为原尺寸的1/1632x32对应512x512和1/4128x128对应512x512 h, w img.shape step_32 max(1, h // 32) # 确保步长至少为1 step_128 max(1, h // 128) img_32 img[::step_32, ::step_32] # 低分辨率约32x32 img_128 img[::step_128, ::step_128] # 中分辨率约128x128 # 2. 灰度分辨率对比量化 def quantize(img, levels): 量化图像到指定灰度级 if levels 1: # 避免除以0 return np.zeros_like(img) img_normalized img / 255.0 # 归一化到0-1 img_quantized np.floor(img_normalized * (levels - 1)) / (levels - 1) return (img_quantized * 255).astype(np.uint8) img_2level quantize(img, 2) # 2级灰度 img_16level quantize(img, 16) # 16级灰度 # 绘制对比图适配新图像尺寸 fig, axes plt.subplots(2, 2, figsize(12, 10)) # 空间分辨率 axes[0,0].imshow(img, cmapgray) axes[0,0].set_title(f原始图像{h}x{w}, fontsize12) axes[0,0].axis(off) axes[0,1].imshow(img_32, cmapgray) axes[0,1].set_title(f空间分辨率降低{img_32.shape[0]}x{img_32.shape[1]}, fontsize12) axes[0,1].axis(off) # 灰度分辨率 axes[1,0].imshow(img_16level, cmapgray) axes[1,0].set_title(灰度分辨率16级, fontsize12) axes[1,0].axis(off) axes[1,1].imshow(img_2level, cmapgray) axes[1,1].set_title(灰度分辨率2级, fontsize12) axes[1,1].axis(off) plt.tight_layout() plt.show()2.4.4 图像插值插值是提升图像空间分辨率的常用方法补全像素常见方法最近邻插值、双线性插值、双三次插值。代码案例不同插值方法效果对比import numpy as np import matplotlib.pyplot as plt import matplotlib.image as mpimg # 加载本地图像 import os # 检查文件是否存在 from scipy.ndimage import zoom # 设置matplotlib支持中文显示 plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 加载自定义本地图像 # 请替换为你的本地图像路径支持jpg/png/bmp等格式 image_path ../picture/TianHuoSanXuanBian.jpg # 检查文件是否存在 if not os.path.exists(image_path): raise FileNotFoundError(f未找到图像文件{image_path}\n请检查路径是否正确) # 加载图像 img mpimg.imread(image_path) # 彩色图像转灰度图兼容彩色/灰度图像 if len(img.shape) 3: # 标准RGB转灰度公式Y 0.2989R 0.5870G 0.1140B img np.dot(img[..., :3], [0.2989, 0.5870, 0.1140]).astype(np.uint8) # 确保图像为8位灰度图 img img.astype(np.uint8) # 打印图像基本信息方便调试 h, w img.shape print(f原始图像尺寸{h}x{w}) print(f图像数据类型{img.dtype}) # 动态下采样降低分辨率 # 动态计算下采样步长使低分辨率图像约为64x64适配不同尺寸图像 step_h max(1, h // 64) step_w max(1, w // 64) img_low img[::step_h, ::step_w] # 下采样到约64x64 low_h, low_w img_low.shape print(f下采样后低分辨率图像尺寸{low_h}x{low_w}) # 不同插值方法放大放大倍数适配低分辨率尺寸 # 计算放大倍数使放大后图像接近原图像尺寸或固定放大4倍 scale_h h / low_h # 按高度放大 scale_w w / low_w # 按宽度放大 # 也可固定放大4倍scale_h scale_w 4 # 1. 最近邻插值order0速度快块效应明显 img_nn zoom(img_low, (scale_h, scale_w), order0) # 2. 双线性插值order1平滑细节损失 img_bl zoom(img_low, (scale_h, scale_w), order1) # 3. 双三次插值order3效果最好细节保留完整 img_bc zoom(img_low, (scale_h, scale_w), order3) # 裁剪到原图像尺寸避免插值后尺寸微小偏差 img_nn img_nn[:h, :w] img_bl img_bl[:h, :w] img_bc img_bc[:h, :w] # 绘制插值效果对比图 fig, axes plt.subplots(2, 2, figsize(12, 10)) # 低分辨率原图 axes[0,0].imshow(img_low, cmapgray) axes[0,0].set_title(f低分辨率图像{low_h}x{low_w}, fontsize12) axes[0,0].axis(off) # 最近邻插值 axes[0,1].imshow(img_nn, cmapgray) axes[0,1].set_title(最近邻插值, fontsize12) axes[0,1].axis(off) # 双线性插值 axes[1,0].imshow(img_bl, cmapgray) axes[1,0].set_title(双线性插值, fontsize12) axes[1,0].axis(off) # 双三次插值 axes[1,1].imshow(img_bc, cmapgray) axes[1,1].set_title(双三次插值, fontsize12) axes[1,1].axis(off) plt.tight_layout() plt.show()效果说明最近邻插值最模糊有明显块效应双线性插值更平滑双三次插值效果最好细节保留最完整。2.5 像素间的基本关系2.5.1 像素的邻域像素(x,y)的邻域是围绕它的像素集合常见类型4邻域N4上下左右4个像素即(x±1,y)、(x,y±1)8邻域N84邻域对角线4个像素共8个D邻域仅对角线4个像素。2.5.2 邻接性、连通性、区域与边界邻接性两个像素满足位置邻域灰度相似如同一灰度级连通性从像素A到B存在一条邻接像素的路径区域连通的像素集合边界区域内与背景邻接的像素。2.5.3 距离度量常用的像素距离欧氏距离Euclidean曼哈顿距离城市街区距离切比雪夫距离棋盘距离代码案例像素距离计算与可视化import numpy as np import matplotlib.pyplot as plt import matplotlib.patches as patches plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 定义中心像素(5,5)计算不同距离的像素 center (5,5) x, y np.meshgrid(np.arange(0,11), np.arange(0,11)) # 初始化距离矩阵 d_euclidean np.sqrt((x-center[0])**2 (y-center[1])**2) d_manhattan np.abs(x-center[0]) np.abs(y-center[1]) d_chessboard np.maximum(np.abs(x-center[0]), np.abs(y-center[1])) # 绘制距离可视化 fig, axes plt.subplots(1, 3, figsize(15, 5)) # 欧氏距离 im1 axes[0].imshow(d_euclidean, cmapviridis) axes[0].scatter(center[0], center[1], colorred, s100, label中心像素) axes[0].set_title(欧氏距离, fontsize12) axes[0].axis(off) plt.colorbar(im1, axaxes[0], shrink0.8) # 曼哈顿距离 im2 axes[1].imshow(d_manhattan, cmapviridis) axes[1].scatter(center[0], center[1], colorred, s100) axes[1].set_title(曼哈顿距离, fontsize12) axes[1].axis(off) plt.colorbar(im2, axaxes[1], shrink0.8) # 棋盘距离 im3 axes[2].imshow(d_chessboard, cmapviridis) axes[2].scatter(center[0], center[1], colorred, s100) axes[2].set_title(切比雪夫距离, fontsize12) axes[2].axis(off) plt.colorbar(im3, axaxes[2], shrink0.8) plt.tight_layout() plt.show()2.6 数字图像处理常用数学工具简介2.6.1 数组运算与矩阵运算的区别数组运算逐元素运算对应位置元素直接运算如NumPy数组如AB表示每个元素相加矩阵运算线性代数运算遵循矩阵乘法规则行×列如A×B需要满足列数行数。2.6.2 线性运算与非线性运算线性运算满足可加性齐次性如f(axby)af(x)bf(y)如滤波、变换非线性运算不满足线性规则如取绝对值、指数、对数、阈值分割。2.6.3 算术运算图像算术运算加去噪、减背景差分、乘掩膜、除归一化。2.6.4 集合运算与逻辑运算集合运算并、交、补用于图像区域处理逻辑运算与、或、非、异或用于二值图像处理。2.6.5 空间域运算直接对像素灰度值进行运算如g(x,y)T[f(x,y)]其中T为变换函数如灰度调整、滤波。2.6.6 向量与矩阵运算图像可视为向量/矩阵常用运算转置、逆、特征值分解、奇异值分解SVD。2.6.7 图像变换将图像从空间域转换到变换域如傅里叶变换、离散余弦变换、小波变换便于频域分析、压缩、滤波。2.6.8 概率统计方法用统计特征描述图像均值亮度、方差对比度、直方图灰度分布、协方差相关性。代码案例图像数学运算综合演示import numpy as np import matplotlib.pyplot as plt from skimage import data plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 加载两张灰度图 img1 data.camera() img2 data.coins() # 统一尺寸取最小尺寸 h, w min(img1.shape[0], img2.shape[0]), min(img1.shape[1], img2.shape[1]) img1 img1[:h, :w] img2 img2[:h, :w] # 1. 算术运算加、减 img_add np.clip((img1 img2) / 2, 0, 255).astype(np.uint8) # 相加后归一化 img_sub np.clip(img1 - img2 128, 0, 255).astype(np.uint8) # 相减后偏移 # 2. 逻辑运算二值化后 img1_bin (img1 128).astype(np.uint8) * 255 img2_bin (img2 128).astype(np.uint8) * 255 img_and np.bitwise_and(img1_bin, img2_bin) img_or np.bitwise_or(img1_bin, img2_bin) # 3. 空间域运算灰度调整 img_bright np.clip(img1 * 1.5, 0, 255).astype(np.uint8) # 增亮 img_contrast np.clip((img1 - 128) * 2 128, 0, 255).astype(np.uint8) # 增强对比度 # 4. 统计特征计算 mean np.mean(img1) var np.var(img1) hist, bins np.histogram(img1, bins256, range(0,255)) # 绘制结果 fig, axes plt.subplots(3, 2, figsize(12, 15)) # 算术运算 axes[0,0].imshow(img_add, cmapgray) axes[0,0].set_title(f算术运算相加, fontsize12) axes[0,0].axis(off) axes[0,1].imshow(img_sub, cmapgray) axes[0,1].set_title(f算术运算相减, fontsize12) axes[0,1].axis(off) # 逻辑运算 axes[1,0].imshow(img_and, cmapgray) axes[1,0].set_title(f逻辑运算与, fontsize12) axes[1,0].axis(off) axes[1,1].imshow(img_or, cmapgray) axes[1,1].set_title(f逻辑运算或, fontsize12) axes[1,1].axis(off) # 空间域统计 axes[2,0].imshow(img_contrast, cmapgray) axes[2,0].set_title(f空间域对比度增强均值{mean:.2f}方差{var:.2f}, fontsize10) axes[2,0].axis(off) axes[2,1].plot(hist) axes[2,1].set_title(灰度直方图, fontsize12) axes[2,1].set_xlabel(灰度值) axes[2,1].set_ylabel(像素数) plt.tight_layout() plt.show()小结总结数字图像基础的核心是“从光到数字”的转化人眼感知光→传感器采集光信号→采样/量化转化为数字图像像素是数字图像的基本单元其邻域、连通性、距离度量是图像处理的基础而数组/矩阵运算、算术/逻辑运算等是核心工具分辨率空间灰度直接决定图像质量插值是提升空间分辨率的常用方法不同插值方法各有优劣双三次插值效果最佳。