《数字图像处理》实验2-空间域灰度变换与滤波处理

一、实验概述

1. 实验目标

  • 理解图像空间域处理的核心原理,掌握灰度变换(线性、幂次、对数)的实现方法;
  • 熟练运用 MATLAB 实现直方图均衡化,提升图像对比度;
  • 掌握噪声添加与中值滤波去噪的操作,理解不同尺寸滤波模板的效果差异;
  • 学会使用 Sobel、Laplacian 算子进行图像锐化,增强边缘细节。

2. 实验环境

  • 操作系统:Windows 8/10/11
  • 软件版本:MATLAB 2014 及以上版本

3. 核心原理

空间域图像处理直接对图像像素进行操作,主要包括两类核心技术:

  1. 灰度变换:通过映射函数调整像素灰度值,改善图像亮度、对比度(如线性变换、Gamma 变换、对数变换);
  2. 空间滤波:利用邻域像素的关系进行局部处理,包括平滑滤波(如中值滤波,抑制噪声)和锐化滤波(如 Sobel、Laplacian 算子,增强边缘)。

核心函数包括:灰度变换(imadjust、histeq)、噪声添加(imnoise)、滤波(medfilt2、filter2、fspecial)、可视化(imhist、subplot、sgtitle)等。

二、实验内容与完整代码实现

(一)灰度线性变换

实验任务

读取彩色图像并转换为灰度图,自定义线性变换函数 J = a*I + b(a 控制对比度,b 控制亮度),对比原图、灰度图及变换后图像的效果。

完整代码
复制代码
%% 1. 读取图像
imagePath = 'ALi.jpg';
colorImage = imread(imagePath);  % 读取彩色图像

%% 2. 转换为灰度图
grayImage = rgb2gray(colorImage);

%% 3. 获取图像尺寸
[rows, cols] = size(grayImage);
fprintf('图像尺寸:%d行 x %d列\n', rows, cols);

%% 4. 定义灰度线性变换函数
a = 1.5;   % 斜率,增大对比度(a>1增强,a<1减弱)
b = -100;  % 截距,调整亮度(b>0变亮,b<0变暗)

% 转换为双精度避免整数运算溢出,应用线性变换
transformedImage = a * double(grayImage) + b;

% 像素值截断到[0,255]范围,转换回uint8类型
transformedImage(transformedImage < 0) = 0;
transformedImage(transformedImage > 255) = 255;
transformedImage = uint8(transformedImage);

%% 5. 可视化结果
figure('Name', '图像灰度变换结果', 'Position', [100, 100, 1000, 400]);
subplot(1, 3, 1); imshow(colorImage); title('原图', 'FontSize', 12); axis on;
subplot(1, 3, 2); imshow(grayImage); title('灰度图', 'FontSize', 12); axis on;
subplot(1, 3, 3); imshow(transformedImage); title('灰度变换后图像', 'FontSize', 12); axis on;
sgtitle('图像灰度化及线性变换实验结果', 'FontSize', 14);
实验结果与分析
  • 变换效果:a=1.5 增强了图像对比度,暗部更暗、亮部更亮;b=-100 适当降低亮度,避免亮部溢出;
  • 关键注意点:uint8 类型像素值范围为 [0,255],需先转换为 double 类型进行运算,再截断并转回 uint8,否则会出现溢出失真。

(二)Gamma 幂次变换

实验任务

通过设置不同 Gamma 值(γ>1 和 γ<1),实现图像幂次变换,对比图像明暗变化效果。

完整代码
复制代码
%% 1. 读取彩色图像
imagePath = 'aali.jpg';
colorImage = imread(imagePath);

%% 2. 转换为灰度图
grayImage = rgb2gray(colorImage);

%% 3. 归一化处理(避免运算溢出)
grayDouble = double(grayImage) / 255;  % 转换为double并归一到[0,1]

%% 4. 定义Gamma值并执行幂次变换
gammaA = 3.5;   % γ>1,图像变暗(压缩亮部、拉伸暗部)
gammaB = 0.3;   % γ<1,图像变亮(拉伸亮部、压缩暗部)

gammaImageA = grayDouble .^ gammaA;  % 幂次变换:s = r^γ
gammaImageB = grayDouble .^ gammaB;

%% 5. 转换回uint8类型以便显示
gammaImageA_uint8 = uint8(gammaImageA * 255);
gammaImageB_uint8 = uint8(gammaImageB * 255);

%% 6. 可视化结果
figure('Name', 'Gamma变换结果对比', 'Position', [100, 100, 1200, 500]);
subplot(1, 4, 1); imshow(colorImage); title('原图', 'FontSize', 12); axis on;
subplot(1, 4, 2); imshow(grayImage); title('灰度图', 'FontSize', 12); axis on;
subplot(1, 4, 3); imshow(gammaImageA_uint8); title(['Gamma=', num2str(gammaA)], 'FontSize', 12); axis on;
subplot(1, 4, 4); imshow(gammaImageB_uint8); title(['Gamma=', num2str(gammaB)], 'FontSize', 12); axis on;
sgtitle('不同Gamma值的幂次变换结果对比', 'FontSize', 14);
实验结果与分析
  • Gamma 值影响:
    • γ=3.5(γ>1):图像整体变暗,适合增强过亮图像的暗部细节;
    • γ=0.3(γ<1):图像整体变亮,适合改善过暗图像的亮部表现;
  • 核心原理:幂次变换通过非线性映射调整灰度分布,γ 值决定映射曲线的斜率,实现明暗自适应调整。

(三)对数变换

实验任务

实现对数变换 s = log(1 + r),增强图像暗部细节,对比变换前后效果。

完整代码
复制代码
%% 1. 读取彩色图像
imagePath = 'aali2.jpg';
colorImage = imread(imagePath);

%% 2. 转换为灰度图
grayImage = rgb2gray(colorImage);

%% 3. 转换为double类型
grayDouble = double(grayImage);

%% 4. 执行对数变换
logTransformed = log(1 + grayDouble);  % 1避免log(0)无意义

%% 5. 归一化与类型转换
normalized = mat2gray(logTransformed);  % 归一到[0,1]
logImage = im2uint8(normalized);        % 转回uint8

%% 6. 可视化结果
figure('Name', '对数变换结果', 'Position', [100, 100, 1200, 400]);
subplot(1, 3, 1); imshow(colorImage); title('原图', 'FontSize', 12); axis on;
subplot(1, 3, 2); imshow(grayImage); title('灰度图', 'FontSize', 12); axis on;
subplot(1, 3, 3); imshow(logImage); title('对数变换后图像', 'FontSize', 12); axis on;
sgtitle('图像对数变换结果对比', 'FontSize', 14);
实验结果与分析
  • 变换特点:对数变换压缩亮部灰度范围、拉伸暗部灰度范围,能有效增强暗部细节(如阴影区域);
  • 关键步骤:log 变换后结果范围较小,需用mat2gray归一化到 [0,1],否则图像会过暗或失真。

(四)直方图均衡化

实验任务

读取两张图像,转换为灰度图后计算并显示直方图,通过histeq函数实现直方图均衡化,对比均衡化前后的灰度分布与图像效果。

完整代码
复制代码
%% 1. 读取两张彩色图像
imagePath1 = 'ALi2.jpg';
imagePath2 = 'ALi.jpg';
colorImage1 = imread(imagePath1);
colorImage2 = imread(imagePath2);

%% 2. 转换为灰度图
grayImage1 = rgb2gray(colorImage1);
grayImage2 = rgb2gray(colorImage2);

%% 3. 直方图均衡化
eqImage1 = histeq(grayImage1);  % 第一张图均衡化
eqImage2 = histeq(grayImage2);  % 第二张图均衡化

%% 4. 可视化结果(原图、灰度图、直方图、均衡化图)
figure('Name', '直方图及均衡化结果', 'Position', [100, 100, 1400, 1000]);
% 显示原图与灰度图
subplot(4, 2, 1); imshow(colorImage1); title('原图1', 'FontSize', 12); axis on;
subplot(4, 2, 2); imshow(grayImage1); title('灰度图1', 'FontSize', 12); axis on;
subplot(4, 2, 3); imshow(colorImage2); title('原图2', 'FontSize', 12); axis on;
subplot(4, 2, 4); imshow(grayImage2); title('灰度图2', 'FontSize', 12); axis on;
% 显示直方图
subplot(4, 2, 5); imhist(grayImage1); title('灰度直方图1', 'FontSize', 12); xlabel('灰度级'); ylabel('像素数量');
subplot(4, 2, 6); imhist(grayImage2); title('灰度直方图2', 'FontSize', 12); xlabel('灰度级'); ylabel('像素数量');
% 显示均衡化结果
subplot(4, 2, 7); imshow(eqImage1); title('直方图均衡化1', 'FontSize', 12); axis on;
subplot(4, 2, 8); imshow(eqImage2); title('直方图均衡化2', 'FontSize', 12); axis on;
sgtitle('图像直方图及均衡化实验结果', 'FontSize', 14);
实验结果与分析
  • 直方图特征:不同图像的灰度直方图分布差异显著(如有的集中在暗部,有的分布较分散);
  • 均衡化效果:均衡化后灰度分布更均匀,图像对比度明显提升,暗部细节更清晰;
  • 核心作用:直方图均衡化通过调整灰度概率密度分布,使图像充分利用所有灰度级,改善视觉效果。

(五)椒盐噪声与中值滤波

实验任务

为灰度图添加椒盐噪声,使用 3×3、5×5、7×7 三种尺寸模板进行中值滤波,对比去噪效果。

完整代码
复制代码
%% 1. 读取图像并转换为灰度图
imagePath = 'ALi2.jpg';
colorImage = imread(imagePath);
grayImage = rgb2gray(colorImage);

%% 2. 添加椒盐噪声
noisyImage = imnoise(grayImage, 'salt & pepper', 0.04);  % 噪声密度4%

%% 3. 不同尺寸模板中值滤波
filtered3 = medfilt2(noisyImage, [3, 3]);  % 3×3模板
filtered5 = medfilt2(noisyImage, [5, 5]);  % 5×5模板
filtered7 = medfilt2(noisyImage, [7, 7]);  % 7×7模板

%% 4. 可视化结果
figure('Name', '椒盐噪声与中值滤波结果', 'Position', [100, 100, 1500, 400]);
subplot(1, 5, 1); imshow(colorImage); title('原图', 'FontSize', 12); axis on;
subplot(1, 5, 2); imshow(grayImage); title('灰度图', 'FontSize', 12); axis on;
subplot(1, 5, 3); imshow(noisyImage); title('添加椒盐噪声', 'FontSize', 12); axis on;
subplot(1, 5, 4); imshow(filtered3); title('3×3模板中值滤波', 'FontSize', 12); axis on;
subplot(1, 5, 5); imshow(filtered7); title('7×7模板中值滤波', 'FontSize', 12); axis on;
sgtitle('椒盐噪声及不同尺寸模板中值滤波效果对比', 'FontSize', 14);
实验结果与分析
  • 噪声影响:椒盐噪声表现为图像中的黑白噪点,严重破坏图像清晰度;
  • 滤波效果:
    • 3×3 模板:能有效去除大部分噪点,但仍残留少量噪声;
    • 7×7 模板:去噪更彻底,但图像会出现轻微模糊(模板越大,模糊越明显);
  • 原理:中值滤波通过取邻域像素的中值替换中心像素,对椒盐噪声抑制效果显著,是常用的非线性平滑滤波方法。

(六)Sobel 与 Laplacian 算子锐化

实验任务

将灰度图转换为二值图,分别使用 Sobel 算子和 Laplacian 算子进行锐化,增强图像边缘细节。

完整代码
复制代码
%% 1. 读取图像并转换为灰度图
color_image = imread('aali2.jpg');
gray_image = rgb2gray(color_image);

%% 2. 转换为二值图像
threshold_level = 0.5;
binary_image = im2bw(gray_image, threshold_level);  % 阈值0.5二值化

%% 3. 算子锐化
% Sobel算子(水平边缘检测为主,增强边缘对比度)
H_sobel = fspecial('sobel');
sobel_sharpened = filter2(H_sobel, binary_image);  % 卷积运算

% Laplacian算子(检测所有方向边缘,增强细节)
H_laplacian = fspecial('laplacian', 0.2);  % 0.2为平滑系数
laplacian_sharpened = filter2(H_laplacian, binary_image);

%% 4. 可视化结果
figure('Name', '图像锐化结果对比', 'NumberTitle', 'off');
subplot(1, 4, 1); imshow(color_image); title('原图'); axis on;
subplot(1, 4, 2); imshow(binary_image); title('二值图像'); axis on;
subplot(1, 4, 3); imshow(sobel_sharpened, []); title('sobel算子锐化'); axis on;
subplot(1, 4, 4); imshow(laplacian_sharpened, []); title('拉普拉斯算子锐化'); axis on;
sgtitle('Sobel 与 Laplacian 算子锐化效果对比');
实验结果与分析
  • 算子特点:
    • Sobel 算子:基于梯度计算,对水平 / 垂直边缘增强效果明显,边缘轮廓较粗;
    • Laplacian 算子:基于二阶导数,对所有方向边缘敏感,细节增强更细腻,但对噪声也更敏感;
  • 显示技巧:锐化后结果可能超出 [0,255] 范围,使用imshow(sharpened, [])自动缩放显示范围,避免图像失真。

三、实验总结

1. 核心技术梳理

处理类型 关键技术 核心函数 应用场景
灰度变换 线性变换 doubleuint8 调整对比度、亮度
Gamma 变换 ^(幂运算) 明暗自适应调整
对数变换 logmat2gray 增强暗部细节
直方图处理 均衡化 imhisthisteq 提升图像对比度
平滑滤波 中值滤波 imnoisemedfilt2 去除椒盐噪声
锐化滤波 Sobel 算子 fspecialfilter2 边缘增强(水平 / 垂直)
Laplacian 算子 fspecialfilter2 全方向细节增强

2. 关键注意事项

  • 数据类型转换:uint8(0-255)与 double(任意范围)的转换是避免运算溢出的核心;
  • 归一化处理:对数变换、幂次变换后需归一化,否则图像会因灰度范围过小而失真;
  • 滤波模板选择:中值滤波模板越大,去噪效果越好但模糊越明显,需根据噪声密度权衡;
  • 锐化算子差异:Sobel 适合边缘轮廓提取,Laplacian 适合细节增强,需根据需求选择。

3. 问题与解决方案

  • 问题 1:图像变换后过暗 / 过亮→解决方案:检查数据类型转换是否完整,使用mat2gray归一化或imadjust调整灰度范围;
  • 问题 2:中值滤波后图像模糊严重→解决方案:减小滤波模板尺寸,或选择其他平滑滤波(如均值滤波);
  • 问题 3:锐化后边缘不明显→解决方案:调整二值化阈值,或对灰度图直接锐化(而非二值图)。

通过本次实验,系统掌握了空间域图像处理的核心方法,理解了灰度变换、直方图均衡化、滤波等技术的原理与应用场景,为后续复杂图像处理(如边缘检测、图像分割)奠定了基础。

相关推荐
bleuesprit2 小时前
模型加载时trust_remote_code 的作用
人工智能
EniacCheng2 小时前
贝叶斯定理
人工智能·机器学习·概率论
木头左2 小时前
多时间框架LSTM量化交易策略的实现与参数优化
人工智能·rnn·lstm
小雨下雨的雨2 小时前
ModelEngine的Aido智能体【娱乐生涯 AI 助手】升级计划——工作流编排精确制导AI应用
人工智能·ai·娱乐·智能体
Melody20502 小时前
mmcv的依赖安装教程
人工智能·深度学习
水如烟2 小时前
孤能子视角:“排序搜索“,以及当前人工智能策略––强关系与弱关系
人工智能
KG_LLM图谱增强大模型2 小时前
[150页最新PPT]深度解析大模型与知识图谱的融合范式,通往AGI的必由之路?
人工智能·大模型·知识图谱·agi
龙亘川2 小时前
AI 赋能智慧农业:核心技术、应用案例与学习路径全解析
人工智能·学习
过期的秋刀鱼!2 小时前
week3-机器学习-逻辑回归模型介绍和决策边界
人工智能·机器学习·逻辑回归