基于矢量法的RGB图像梯度幅值与方向解算系统
项目简介
本项目是一个基于MATLAB开发的图像处理系统,旨在解决彩色图像边缘检测中直接转化为灰度图导致的色彩信息丢失问题。系统采用基于Di Zenzo的结构张量(Structure Tensor)技术,将RGB图像的每个像素视为三维矢量,通过计算颜色结构张量的特征值与特征向量,精确解算彩色图像的梯度幅值(边缘强度)与梯度方向。
程序集成了从图像获取、预处理、核心张量解算到多维度可视化的完整流程,并内置了自动生成合成测试图像的功能,用于算法的演示与验证。
功能特性
- 全通道矢量计算:不将图像转换为灰度,而是分别计算R、G、B三个通道的一阶偏导数,保留所有色彩边缘信息。
- Di Zenzo结构张量算法:通过构建颜色结构张量矩阵并求解最大特征值,科学定义彩色图像的梯度幅值。
- 智能图像获取:支持用户交互式选择图片(JPG, PNG, BMP, TIF);若未选择文件,系统自动生成包含红圆、绿矩形、蓝三角形的合成RGB测试图像。
- 鲁棒的预处理:自动识别灰度图并转换为伪彩色三通道,统一将数据归一化为双精度浮点数。
- 多维可视化分析:
* 原始图像展示。
* 基于最大特征值的梯度幅值热力图。
* 基于HSV色彩空间的梯度方向可视化(色调代表方向,亮度/饱和度代表幅值)。
* 稀疏采样矢量场图(Quiver Plot),直观展示梯度的流向。
系统要求
- 开发环境:MATLAB
- 依赖工具箱:Image Processing Toolbox(用于图像读取与显示基础函数)
使用方法
- 在MATLAB环境中运行
main 函数。 - 系统将弹出文件选择对话框:
*
选择图片:选择一张本地RGB图像进行处理。
*
取消选择:直接点击“取消”,系统将自动生成一张400x400像素的几何图形合成图像(包含红色圆形、绿色矩形、蓝色三角形)进行演示。
- 程序运行结束后,将自动弹出包含四个子图的结果窗口,并在控制台输出图像尺寸、最大及平均梯度幅值等统计信息。
详细算法与实现逻辑
本节详细解析 main.m 代码中的核心实现流程,确保描述与实际代码逻辑完全一致。
1. 图像获取与合成
程序首先尝试通过UI获取用户文件。如果用户取消选择,代码通过
zeros 函数创建一个400x400的黑色背景,并利用
meshgrid 和逻辑掩膜(mask)绘制三个基本几何图形:
- 红色圆形:位于中心 (200, 200),半径100。
- 绿色矩形:位于左上区域。
- 蓝色三角形:位于右下区域,通过线性不等式定义形状。
这种机制确保了在无素材情况下也能验证算法对不同颜色边缘的响应。
2. 图像预处理
- 通道检查:读取图像后检测维度,若为单通道灰度图,使用
cat 函数将其复制为三通道,确保后续矩阵运算维度统一。 - 归一化:使用
im2double 将图像像素值从 uint8 映射到 [0, 1] 区间,保证数值计算的精度。
3. 核心解算:Di Zenzo 结构张量
这是代码的核心部分,具体步骤如下:
- 算子定义:定义了标准的 Sobel 算子(
kernel_x 和 kernel_y)用于计算梯度。 - 分通道求导:分别对 R、G、B 通道进行二维卷积(
conv2),得到三个通道在 X 和 Y 方向的偏导数:Rx, Ry, Gx, Gy, Bx, By。 - 构建张量元素:计算结构张量矩阵 $M = begin{bmatrix} g_{xx} & g_{xy} \ g_{xy} & g_{yy} end{bmatrix}$ 的各个分量:
* gxx = Rx² + Gx² + Bx² (叠加三通道X方向能量)
* gyy = Ry² + Gy² + By² (叠加三通道Y方向能量)
* gxy = Rx·Ry + Gx·Gy + Bx·By (计算方向相关性)
- 特征值分解:利用解析公式求解张量的最大特征值(lambda1):
* 该步骤通过构建判别式 $sqrt{(g_{xx} - g_{yy})^2 + 4g_{xy}^2}$ 配合 (gxx + gyy) 完成计算。
*
梯度幅值:取最大特征值的平方根 ($sqrt{lambda_1}$)。随后代码对其进行了归一化处理,使其范围落在 [0, 1] 之间。
*
梯度方向:使用公式 $0.5 times text{atan2}(2g_{xy}, g_{xx} - g_{yy})$ 计算。结果表示变化率最大的方向,范围在 $[-pi/2, pi/2]$ 之间。
4. 结果可视化模块
代码创建了一个包含四个子图的窗口进行综合展示:
展示输入的RGB图像或生成的合成图像。
显示归一后的梯度幅值图。代码应用了
jet 色图(colormap)来增强强边缘(红色)与弱背景(蓝色)的对比度。
采用HSV颜色空间进行编码:
*
色调 (H):由计算出的梯度方向映射得到,不同的颜色代表不同的边缘方向。
*
饱和度 (S):由梯度幅值决定,并进行了伽马校正(0.5次方)以增强视觉可见性。
*
亮度 (V):对于梯度幅值极小(<0.05)的区域强制设为黑色,以消除背景噪声干扰。
最后通过
hsv2rgb 转换为彩色图像显示。
*
降采样:为了防止箭头过于密集,代码以
step=15 为步长对图像进行采样。
*
矢量计算:将梯度幅值与方向分解为 U (x分量) 和 V (y分量)。
*
绘制:利用
quiver 函数绘制红色箭头。特别注意,代码在绘图时对 V 分量取反 (
-V),以修正MATLAB图像坐标系Y轴向下导致的视觉方向差异。仅绘制幅值大于 0.1 的显著边缘矢量。
5. 数据统计
程序最后会在控制台打印图像尺寸、全图最大梯度幅值以及平均梯度幅值,供定量分析使用。