
一句话介绍: 这套 MATLAB GUIDE 程序以 RGB 图像为处理对象,可以从 JPEG 或程序自定义的 POL 图像中读取数据,在同一个主界面完成裁剪、90°旋转、水平翻转、曝光、对比度、饱和度、灰度、黑白、伪彩色和预设效果处理,并把最终图像保存为常见图片格式或自定义低位深 POL 文件。
很多基础图像处理实验并不需要复杂的识别模型,真正需要的是把几个常见操作集中到一个可以直接交互的界面里:
打开一张自己的图像;
调整图像尺寸和方向;观察亮度、对比度、饱和度变化;快速切换灰度、黑白和伪彩色效果;
处理完成后直接保存;
进一步观察降低空间分辨率或颜色位深后,图像数据会发生什么变化。
当前程序把这些操作串成了一套 GUIDE 图形界面。
完整使用链可以概括为:
JPEG / POL 图像 → 几何编辑 → 曝光 / 对比度 / 饱和度调整 → 常见效果 → 保存或压缩输出
这里需要先说明一点:程序没有附带用于展示效果的普通样例照片,工程中的 JPG 文件主要是 GUI 按钮和裁剪说明图标,因此实际处理对象需要用户自己选择。
1. 这套工程真正由哪些模块组成?
工程采用的是 MATLAB GUIDE 生成的 .fig + .m 结构。
核心程序一共有 7 组 MATLAB GUI 文件,其中 IEmain 是主入口,其余文件负责不同的弹窗功能。
文件 | 主要作用 |
|---|---|
IEmain.m/.fig | 主界面、图像读取、旋转、翻转及各功能入口 |
IEcrop.m/.fig | 方形裁剪和自定义坐标裁剪 |
IEexposure.m/.fig | 曝光调整与 RGB 直方图预览 |
IEcontrast.m/.fig | 对比度调整与 RGB 直方图预览 |
IEsaturation.m/.fig | HSV 饱和度调整与 RGB 直方图预览 |
IEeffects.m/.fig | 灰度、黑白、自动、Comic 和多种伪彩色效果 |
IEsave.m/.fig | 普通保存、像素压缩和颜色位深压缩 |
主界面实际提供 9 个操作入口:
Open → Save → Crop → Flip → Rotate → Exposure → Contrast → Effects → Saturation
其中旋转和翻转直接在 IEmain.m 中执行,另外几个功能则打开独立的模态 GUI。
工程还带有 ico 文件夹,用于保存 Open、Save、Crop、Rotate、Flip 等按钮图标和裁剪说明图片。
所以这不是一段单独的图像处理脚本,而是一套:
以主窗口管理当前图像、以多个子窗口完成具体编辑操作的 MATLAB GUIDE 图像处理工具。
2. 图像是怎样进入程序,又怎样在各个窗口之间传递的?
主界面的读取函数位于 btnOpen_Callback。
当前源码支持两类输入:JPEG:.jpg、.jpeg
程序自定义 POL:.pol1~.pol8
JPEG 图像直接通过 imread 读取。
程序随后主要依靠三个全局变量保存图像状态:
O:刚打开时的原始图像;
I:当前已经确认的工作图像;
M:各个编辑弹窗中的临时预览图像。
实际编辑逻辑基本是:
当前图像 I → 复 制到预览 M → 用户调整参数 → 界面显示 M → 点击 OK → M 写回 I
因此,各项操作是可以连续叠加的。
例如先旋转,再增加曝光,最后转成灰度,后一步使用的已经不是最初加载的图像,而是前一步确认后的 I。
需要特别注意,子窗口中的 Reset 通常恢复的是进入当前操作前的 I,而不是最初加载时保存在 O 中的原始图片。
3. 裁剪、旋转和翻转分别是怎样实现的?
这三类操作改变的是图像的空间结构,不涉及复杂图像算法。
主界面分别取出 R、G、B 三个通道,然后对每个通道调用 rot90。
因此每点击一次 Rotate,本质上就是:
R/G/B 三通道 → 分别旋转 90° → 重新组合成 RGB 图像
默认 rot90 对应 90°逆时针旋转。
Flip 使用的是 fliplr。
三个颜色通道分别左右翻转后重新组合,所以实现的是:
图像左侧 ↔ 图像右侧
也就是常见的水平镜像。
IEcrop 提供两种方式。
程序比较图像宽度和高度,将较长的方向从两侧截去一部分,使最终图像接近方形。
它适合快速得到:宽度 ≈ 高度
的图像区域。Custom
自定义模式由用户填写:
xFrom、xTo、yFrom、yTo
真正执行的是:
M = M(yFrom:yTo, xFrom:xTo, :)
因此这里填写的是 MATLAB 数组索引,而不是鼠标框选区域。
坐标需要满足:
为有效整数索引;起点不大于终点;不超出当前图像尺寸。
也就是说,这套裁剪程序更适合明确知道像素坐标范围的离线图像处理实验,而不是类似现代图片编辑器那样直接拖动裁剪框。
4. Exposure 调整真正改变了什么?
曝光窗口的滑块范围是:-100 ~ 100
默认值为 0,并取整后参与计算。
源码中的核心关系非常直接:
M = I + ΔE
其中 ΔE 就是当前滑块值。
因此:
ΔE > 0:整体像素值提高,图像趋向变亮;
ΔE < 0:整体像素值降低,图像趋向变暗;
ΔE = 0:理论上保持当前图像不变。
程序不是建立相机曝光时间、光圈或响应曲线模型,而是直接对 RGB 数值做偏移,所以这里的 Exposure 更准确地理解为:
RGB 像素级整体亮度偏移。
曝光窗口同时统计 R、G、B 三个通道在 0~255 范围内的直方图。
这样调节滑块时,不只是看图像“变亮还是变暗”,还可以观察三个颜色通道的像素分布怎样整体移动。
5. Contrast 为什么不是简单乘一个系数?
对比度窗口同样使用:-100 ~ 100的滑块范围。
但它并不是直接执行 M = kI,而是建立一组会随对比度参数变化的灰度映射控制点。
设当前对比度滑块值为 c,源码构造:
x = [0, 64+c/2, 128-c/2, 255]
y = [0, 64-c/2, 128+c/2, 255]
然后分别对 R、G、B 三个通道进行 spline 插值。
简单理解:
正的 c 会把中间灰度附近的映射拉得更陡;
暗部和亮部差异因此被拉开;
负的 c 则让中间区域变化更平缓;
最终形成减弱对比度的效果。
因此程序的对比度处理链是:
RGB 像素 → 四个控制点定义映射关系 → spline 插值 → 新 RGB 图像
与曝光一样,这个窗口也同步显示三个颜色通道的直方图。
当前源码有一个实际使用时值得注意的边界:当滑块回到精确的 0 时,处理分支不会生成 MCr、MCg、MCb,但后面的直方图代码仍会继续引用这些变量。
因此如果已经调整过对比度,希望恢复到 0,优先使用窗口中的 Reset 按钮会更稳妥。
6. Saturation 是怎样调整颜色浓度的?
饱和度处理没有直接修改 R、G、B,而是先转换到 HSV 空间:
RGB → HSV → 修改 S → RGB
滑块同样为:-100 ~ 100
程序先把滑块值除以 100,因此实际饱和度增量为:-1 ~ 1
核心关系可以概括为:
S_new = S + ΔS
其中:
ΔS = slider / 100
这样做的好处是,亮度和色相不需要直接参与颜色浓度调节,主要修改 HSV 中代表饱和度的 S 通道。
程序随后把大于 1 的值限制为 1,再通过 hsv2rgb 转回 RGB,并恢复到 uint8 图像。
所以:
正值让颜色更浓;
接近 0 时基本保持当前颜色;
负值用于降低颜色饱和程度。
这里有一个源码边界需要知道:当前程序只显式限制了 S > 1 的情况,没有对应把 S < 0 截断到 0。
因此在较大的负饱和度参数下,最终显示效果应以当前 MATLAB 的实际转换结果为准,不应把整个负值区间简单理解成严格受限的标准 HSV 饱和度。
7. Effects 里到底包含哪些图像效果?
IEeffects 可以分成两类。
程序提供:
B&W、Gray、Auto、Comic、Gray
灰度转换采用固定的 RGB 加权关系:
Y = 0.299R + 0.587G + 0.114B
得到 Y 后,程序把它复 制到三个通道:Y → R、G、B
所以输出仍然保持三通道图像结构,只是三个通道内容相同。
规则是:
Y ≥ 128 → 255
Y < 128 → 0
因此最终只保留纯黑和纯白两个等级。
它属于非常直接的固定阈值二值化,没有自动阈值搜索过程。
Auto 不是一个复杂的自动增强算法。
从源码来看,它固定组合了:
对比度 +15 → 曝光 +25
其中对比度仍然使用前面的 spline 灰度映射。
Comic 采用的是更强的一组固定参数:
对比度 +60 → 曝光 +30
所以它主要通过强化中间灰度映射和提高整体亮度制造更强烈的视觉效果,并没有实现边缘描绘、区域分割或真正的漫画风格生成模型。
下拉框提供:
Standard、Jet、HSV、Hot、Cool、Spring、Summer、Autumn、Winter、Bone、Copper、Pink、Lines
选择 Standard 时保持当前图像。
选择其他映射时,程序先按照:
Y = 0.299R + 0.587G + 0.114B
把原图转换成亮度值,再使用对应的 64 级 MATLAB colormap 进行插值,最后重新形成 RGB 伪彩色图像。
完整过程是:
RGB 图像 → 灰度亮度 Y → 64 级颜色映射 → RGB 伪彩色图像
需要注意,同一个 Effects 窗口中的各个效果默认都是以进入窗口时的当前图像 I 为基础重新生成 M。
因此连续点击 Gray、Comic、Jet,并不是把三个效果自动逐级叠加,而是后一次预览覆盖前一次预览。
如果需要真正叠加,可以确认第一个效果回到主界面,再重新进入 Effects 进行下一次处理。
8. 为什么这套程序的保存功能不只是“另存为”?
IEsave 提供三种保存思路:
普通保存、像素压缩、颜色压缩。
程序可以通过 imwrite 输出:
JPEG、JPEG 2000、PNG、TIFF、BMP
这里 GUI 中的 “No compression” 更准确地说是:
程序不再额外做像素降采样或颜色量化。
文件本身是否采用压缩编码,仍由 JPEG、PNG 等具体格式自身决定。
像素压缩以每个 2 × 2 区域为一组。
对 R、G、B 分别计算四个像素的平均值:
P_new = (P₁₁ + P₁₂ + P₂₁ + P₂₂) / 4
再用这个平均值替代原来的 4 个像素。
因此:
图像宽度大约减半;
图像高度大约减半;
总像素数量约变成原来的 1/4。
如果图像宽度或高度为奇数,当前循环只处理能够完整组成 2 × 2 区域的部分,末端不能组成完整块的行或列不会进入平均计算。
这是一种非常适合教学观察的空间降采样方法。
颜色压缩允许选择每个 RGB 通道的位数:
选择 | 每通道颜色级数 |
|---|---|
8 bit | 256 |
7 bit | 128 |
6 bit | 64 |
5 bit | 32 |
4 bit | 16 |
3 bit | 8 |
2 bit | 4 |
1 bit | 2 |
设位数为 b,程序先计算:n = 256 / 2ᵇ
然后进行:Q = floor(I / n)
也就是把原来的 256 级颜色压缩到 2ᵇ 个离散等级。
这部分不会保存成普通 PNG 或 JPEG,而是写入程序自己的二进制 POL 格式。
文件中还会保存图像尺寸相关的头部数据,因此主界面再次读取 .pol1~.pol8 时,可以按照位数恢复尺寸并把颜色码重新映射到 uint8 范围。
因此 POL 更准确地说是:
这套工程自己定义的一种低位深 RGB 图像存储格式,而不是通用图片格式。
9. 当前程序最后能够得到什么?
这套程序没有训练过程,也没有分类准确率、PSNR、SSIM 一类固定评价指标。
它真正输出的是:
一张经过用户确认后的当前 RGB 图像;
几何编辑后的新图像尺寸和方向;
曝光、对比度、饱和度调整后的图像;
灰度、黑白、预设或伪彩色效果图像;
JPEG、JPEG 2000、PNG、TIFF、BMP 文件;
经过颜色量化后的 .pol1~.pol8 自定义文件;
经过 2 × 2 平均降采样后的低分辨率图片。
曝光、对比度和饱和度窗口还会实时给出 R、G、B 三通道直方图,用于观察参数改变前后的像素分布。
当前工程没有附带普通测试照片、处理结果截图或数值评价日志,因此不能凭空给出“增强后提升了多少”之类的指标。
这套程序的结果需要根据用户自己加载的图像和实际选择的处理步骤来确定。
10. 这套程序适合用在哪里?
程序把一个主界面和多个子 GUI 串起来,并通过 global I、global M 管理图像状态。
因此它很适合观察:
GUIDE 控件 → Callback → 图像变量 → 预览 → OK 写回
这一类传统 MATLAB GUI 的工作方式。
裁剪、旋转、翻转、亮度偏移、对比度映射、HSV 饱和度、灰度和二值化都能在同一套程序中找到实际代码。
尤其是曝光、对比度和饱和度窗口还同时显示 RGB 直方图,适合观察:
一个参数变化后,图像视觉效果和像素分布如何一起变化。
程序不仅能编辑图像,还包含两种很直观的数据压缩思路:
2 × 2 像素平均降采样
以及:8 bit → 1 bit 的逐通道颜色量化
因此它可以用于理解“空间分辨率减少”和“颜色位深减少”是两种不同的信息压缩方式。
如果只需要对 RGB JPEG 做少量基础编辑,这套程序也可以作为一个轻量离线工具。
但它并不是现代通用图片编辑器:当前输入格式有限,没有图层、撤销历史、批量任务、自动文件管理,也没有深度学习增强或图像质量评价模块。
11. 哪些参数最值得修改?
当前程序里真正会明显改变图像结果的参数主要集中在下面几项。
参数 | 当前值 | 为什么值得改 | 调整后的主要影响 |
|---|---|---|---|
Exposure | 默认 0,范围 -100~100 | 直接改变 RGB 整体数值 | 正值变亮,负值变暗 |
Contrast | 默认 0,范围 -100~100 | 改变 spline 灰度映射曲线 | 正值增强明暗差异,负值压缩差异 |
Saturation | 默认 0%,范围 -100%~100% | 直接修改 HSV 的 S 分量 | 正值增强颜色,负值降低颜色浓度 |
黑白阈值 | 128 | 决定像素归为黑还是白 | 降低阈值会增加白色 区域,提高则增加黑色 区域 |
POL 位深 | 默认界面为 8 bit,可选 1~8 bit | 决定每个通道保留多少颜色等级 | 位深越低,颜色量化越明显,数据表示范围越小 |
其中黑白阈值 128 是源码固定值,不是界面滑块;如果要研究不同阈值,需要修改 IEeffects.m。
12. 怎么运行这套程序?
解压工程后,建议把 MATLAB 当前工作目录切换到:
Image_Enhancer/Image Enhancer
这一点很重要,因为主程序直接使用:
ico/open.jpg、ico/save.jpg、ico/crop.jpg
等相对路径加载界面图片。
主入口为:IEmain
在 MATLAB 命令窗口运行 IEmain 后即可打开 Image Enhancer 主界面。
实际使用建议按照:
Open 图像 → 选择处理功能 → 在子窗口预览 → OK 确认 → 返回主界面继续处理 → Save
的顺序操作。
当前源码主要按三通道 RGB 图像编写,例如旋转、翻转、曝光直方图和效果处理都会直接访问 I(:,:,1)、I(:,:,2)、I(:,:,3),因此使用普通 JPEG 时应优先选择 RGB 彩色图像。
另外,从源码状态管理来看,有几处会直接影响操作顺序:
Exposure、Contrast、Saturation、Effects 等子窗口使用全局 M 作为预览结果,但 OpeningFcn 并没有统一先执行 M = I;
Crop 同样依赖选择裁剪方式后初始化相关状态;
Color compression 的 numColorsValue 在位深下拉框回调中赋值。
因此实际操作时,不建议打开子窗口后什么都不做就直接点击 OK。
更稳妥的方式是:
曝光、对比度、饱和度窗口先移动一次滑块或点击 Reset;
Effects 先明确选择一个效果或点击 Reset;
Crop 先选择 Square 或 Custom,并在 Custom 模式下填写有效坐标;
颜色压缩保存前主动选择一次需要的 bit 位深;
对比度需要恢复 0 时优先点击 Reset。
工程源码头部标注为 GUIDE v2.5,主要文件最后修改时间集中在 2013 年。因此使用时应选择能够正常运行传统 GUIDE .fig/.m 界面的 MATLAB 环境。
13. 一句话看懂这个项目
这是一个基于 MATLAB GUIDE 的 RGB 图像处理 GUI:主程序IEmain负责 JPEG / 自定义 POL 图像读取和当前图像管理,并提供裁剪、90°旋转、水平翻转、曝光、对比度、饱和度和 Effects 等编辑入口;曝光通过 RGB 像素整体偏移实现,对比度利用四个控制点和 spline 插值改变灰度映射,饱和度在 HSV 空间修改 S 分量,Effects 还包含 128 阈值黑白化、加权灰度、Auto、Comic 以及 Jet、Hot、Cool 等多种伪彩色映射;最终既可以保存为 JPEG、JPEG 2000、PNG、TIFF、BMP,也可以通过 2 × 2 像素平均降低空间分辨率,或把每通道颜色量化到 1~8 bit 后保存为程序自定义 POL 文件,更适合 MATLAB GUI、基础数字图像处理、颜色量化和离线图像编辑实验。