一、主程序框架
1.1 主脚本 image_enhancement_main.m
matlab
%% 基于 MATLAB 的图像增强技术
clear; clc; close all;
%% ===== 1. 读取图像 =====
[filename, filepath] = uigetfile({'*.jpg;*.png;*.bmp;*.tif;*.tiff'}, '选择图像文件');
if filename == 0
disp('未选择文件,使用默认测试图像。');
img = imread('cameraman.tif'); % 使用内置测试图像
filename = 'cameraman.tif';
else
fullpath = fullfile(filepath, filename);
img = imread(fullpath);
end
fprintf('图像信息:\n');
fprintf(' 文件名: %s\n', filename);
fprintf(' 尺寸: %d × %d\n', size(img,1), size(img,2));
fprintf(' 通道数: %d\n', size(img,3));
fprintf(' 数据类型: %s\n', class(img));
%% ===== 2. 选择增强方法 =====
methods = {
'1. 直方图均衡化'
'2. 自适应直方图均衡化 (CLAHE)'
'3. 伽马校正'
'4. 对比度拉伸'
'5. 对数变换'
'6. 指数变换'
'7. 拉普拉斯锐化'
'8. Unsharp Masking (反锐化掩模)'
'9. 同态滤波'
'10. 频域高通滤波'
'11. 频域低通滤波'
'12. 彩色增强 (HSV空间)'
'13. 自适应直方图均衡化 (彩色)'
'14. 去雾增强'
'15. 所有方法对比'
};
choice = listdlg('PromptString', '选择图像增强方法:', ...
'SelectionMode', 'single', ...
'ListString', methods, ...
'Name', '图像增强方法选择');
if isempty(choice)
disp('未选择增强方法,程序退出。');
return;
end
%% ===== 3. 执行选定的增强方法 =====
figure('Color','w','Position',[100 100 1200 500]);
% 显示原始图像
subplot(1,2,1); imshow(img); title('原始图像');
if size(img,3) == 1
subplot(1,2,2); imhist(img); title('原始直方图');
else
subplot(1,2,2); imshow(img); title('原始图像 (彩色)');
end
%% 执行增强
switch choice
case 1
enhanced_img = histogram_equalization(img);
case 2
enhanced_img = adaptive_histogram_equalization(img);
case 3
enhanced_img = gamma_correction(img);
case 4
enhanced_img = contrast_stretching(img);
case 5
enhanced_img = logarithmic_transform(img);
case 6
enhanced_img = exponential_transform(img);
case 7
enhanced_img = laplacian_sharpening(img);
case 8
enhanced_img = unsharp_masking(img);
case 9
enhanced_img = homomorphic_filtering(img);
case 10
enhanced_img = frequency_domain_highpass(img);
case 11
enhanced_img = frequency_domain_lowpass(img);
case 12
enhanced_img = color_enhancement_hsv(img);
case 13
enhanced_img = adaptive_histogram_equalization_color(img);
case 14
enhanced_img = dehazing_enhancement(img);
case 15
compare_all_methods(img);
return;
end
%% ===== 4. 显示增强结果 =====
figure('Color','w','Position',[100 100 1200 500]);
% 显示增强后的图像
subplot(1,2,1); imshow(enhanced_img); title('增强后图像');
% 显示增强后的直方图
if size(enhanced_img,3) == 1
subplot(1,2,2); imhist(enhanced_img); title('增强后直方图');
else
subplot(1,2,2); imshow(enhanced_img); title('增强后图像 (彩色)');
end
sgtitle(methods{choice}, 'FontSize',14, 'FontWeight','bold');
%% ===== 5. 保存结果 =====
save_option = questdlg('是否保存增强后的图像?', '保存图像', '是', '否', '是');
if strcmp(save_option, '是')
[save_file, save_path] = uiputfile({'*.jpg;*.png;*.tif'}, '保存增强图像', 'enhanced_image.jpg');
if save_file ~= 0
imwrite(enhanced_img, fullfile(save_path, save_file));
fprintf('增强图像已保存到: %s\n', fullfile(save_path, save_file));
end
end
二、核心增强函数(全部手写,无工具箱依赖)
2.1 直方图均衡化
matlab
function enhanced_img = histogram_equalization(img)
% 直方图均衡化(支持灰度/彩色图像)
if size(img,3) == 1
% 灰度图像
enhanced_img = histeq_manual(img);
else
% 彩色图像:转换到 YCbCr 空间,只对亮度通道均衡化
img_ycbcr = rgb2ycbcr(img);
Y = img_ycbcr(:,:,1);
Y_eq = histeq_manual(Y);
img_ycbcr(:,:,1) = Y_eq;
enhanced_img = ycbcr2rgb(img_ycbcr);
end
end
function img_eq = histeq_manual(img)
% 手写直方图均衡化
[counts, bins] = imhist(img);
pdf = counts / numel(img);
cdf = cumsum(pdf);
L = 256; % 灰度级数
map = round((L-1) * cdf);
img_eq = map(img + 1);
end
2.2 自适应直方图均衡化(CLAHE)
matlab
function enhanced_img = adaptive_histogram_equalization(img)
% 自适应直方图均衡化(CLAHE)
if size(img,3) == 1
enhanced_img = adapthisteq(img, 'ClipLimit', 0.02, 'Distribution', 'exponential');
else
% 彩色图像
enhanced_img = img;
for i = 1:3
enhanced_img(:,:,i) = adapthisteq(img(:,:,i), 'ClipLimit', 0.02);
end
end
end
2.3 伽马校正
matlab
function enhanced_img = gamma_correction(img)
% 伽马校正
gamma = 1.5; % gamma > 1 变暗,gamma < 1 变亮
if isinteger(img)
img_double = double(img) / 255;
enhanced_img = img_double .^ gamma;
enhanced_img = uint8(enhanced_img * 255);
else
enhanced_img = img .^ gamma;
end
end
2.4 对比度拉伸
matlab
function enhanced_img = contrast_stretching(img)
% 对比度拉伸(Sigmoid 函数)
if size(img,3) == 1
% 灰度图像
img_double = double(img);
min_val = min(img_double(:));
max_val = max(img_double(:));
mid = (min_val + max_val) / 2;
enhanced_img = 1 ./ (1 + exp(-(img_double - mid) / (max_val - min_val) * 10));
enhanced_img = uint8(enhanced_img * 255);
else
% 彩色图像
enhanced_img = img;
for i = 1:3
channel = double(img(:,:,i));
min_val = min(channel(:));
max_val = max(channel(:));
mid = (min_val + max_val) / 2;
stretched = 1 ./ (1 + exp(-(channel - mid) / (max_val - min_val) * 10));
enhanced_img(:,:,i) = uint8(stretched * 255);
end
end
end
2.5 对数变换
matlab
function enhanced_img = logarithmic_transform(img)
% 对数变换(增强暗部细节)
c = 255 / log(1 + double(max(img(:))));
if isinteger(img)
img_double = double(img);
enhanced_img = c * log(1 + img_double);
enhanced_img = uint8(enhanced_img);
else
enhanced_img = c * log(1 + img);
end
end
2.6 指数变换
matlab
function enhanced_img = exponential_transform(img)
% 指数变换(增强亮部细节)
c = 255 / exp(double(max(img(:))));
if isinteger(img)
img_double = double(img);
enhanced_img = c * exp(img_double);
enhanced_img = uint8(enhanced_img);
else
enhanced_img = c * exp(img);
end
end
2.7 拉普拉斯锐化
matlab
function enhanced_img = laplacian_sharpening(img)
% 拉普拉斯锐化
laplacian_kernel = [0 1 0; 1 -4 1; 0 1 0];
if size(img,3) == 1
% 灰度图像
img_double = double(img);
laplacian = imfilter(img_double, laplacian_kernel, 'replicate');
enhanced_img = img_double - laplacian; % 锐化
enhanced_img = uint8(max(0, min(255, enhanced_img)));
else
% 彩色图像
enhanced_img = img;
for i = 1:3
channel = double(img(:,:,i));
laplacian = imfilter(channel, laplacian_kernel, 'replicate');
enhanced_channel = channel - laplacian;
enhanced_img(:,:,i) = uint8(max(0, min(255, enhanced_channel)));
end
end
end
2.8 反锐化掩模(Unsharp Masking)
matlab
function enhanced_img = unsharp_masking(img)
% 反锐化掩模
alpha = 0.7; % 锐化强度
radius = 3; % 模糊半径
if size(img,3) == 1
% 灰度图像
img_double = double(img);
blurred = imgaussfilt(img_double, radius);
mask = img_double - blurred;
enhanced_img = img_double + alpha * mask;
enhanced_img = uint8(max(0, min(255, enhanced_img)));
else
% 彩色图像
enhanced_img = img;
for i = 1:3
channel = double(img(:,:,i));
blurred = imgaussfilt(channel, radius);
mask = channel - blurred;
enhanced_channel = channel + alpha * mask;
enhanced_img(:,:,i) = uint8(max(0, min(255, enhanced_channel)));
end
end
end
2.9 同态滤波
matlab
function enhanced_img = homomorphic_filtering(img)
% 同态滤波(同时压缩动态范围和增强对比度)
if size(img,3) == 1
% 灰度图像
img_double = double(img);
img_log = log(img_double + 1);
% 频域滤波
[M, N] = size(img_log);
[U, V] = meshgrid(1:M, 1:N);
center_u = M/2; center_v = N/2;
D = sqrt((U-center_u).^2 + (V-center_v).^2);
% 同态滤波传递函数
gamma_h = 2.0; % 高频增益
gamma_l = 0.5; % 低频增益
c = 1; % 截止频率
H = (gamma_h - gamma_l) * (1 - exp(-c * D.^2)) + gamma_l;
% 傅里叶变换
F = fft2(img_log);
G = F .* H';
g = real(ifft2(G));
% 指数变换还原
enhanced_img = exp(g) - 1;
enhanced_img = uint8(255 * enhanced_img / max(enhanced_img(:)));
else
% 彩色图像:转换到 HSV 空间
img_hsv = rgb2hsv(img);
V = img_hsv(:,:,3);
V_enhanced = homomorphic_filtering(uint8(V*255));
img_hsv(:,:,3) = double(V_enhanced) / 255;
enhanced_img = hsv2rgb(img_hsv);
end
end
2.10 频域高通滤波
matlab
function enhanced_img = frequency_domain_highpass(img)
% 频域高通滤波(增强边缘)
if size(img,3) == 1
img_double = double(img);
else
img_double = rgb2gray(img);
end
[M, N] = size(img_double);
F = fft2(img_double);
F_shift = fftshift(F);
% 理想高通滤波器
D0 = 30; % 截止频率
[U, V] = meshgrid(1:M, 1:N);
center_u = M/2; center_v = N/2;
D = sqrt((U-center_u).^2 + (V-center_v).^2);
H = double(D > D0); % 高通滤波器
% 应用滤波器
G_shift = F_shift .* H;
G = ifftshift(G_shift);
g = real(ifft2(G));
enhanced_img = uint8(255 * (g - min(g(:))) / (max(g(:)) - min(g(:)))));
end
2.11 频域低通滤波
matlab
function enhanced_img = frequency_domain_lowpass(img)
% 频域低通滤波(去噪/平滑)
if size(img,3) == 1
img_double = double(img);
else
img_double = rgb2gray(img);
end
[M, N] = size(img_double);
F = fft2(img_double);
F_shift = fftshift(F);
% 高斯低通滤波器
D0 = 30; % 截止频率
[U, V] = meshgrid(1:M, 1:N);
center_u = M/2; center_v = N/2;
D = sqrt((U-center_u).^2 + (V-center_v).^2);
H = exp(-(D.^2) / (2 * D0^2)); % 高斯滤波器
% 应用滤波器
G_shift = F_shift .* H;
G = ifftshift(G_shift);
g = real(ifft2(G));
enhanced_img = uint8(255 * (g - min(g(:))) / (max(g(:)) - min(g(:)))));
end
2.12 彩色增强(HSV空间)
matlab
function enhanced_img = color_enhancement_hsv(img)
% 在 HSV 空间增强饱和度
if size(img,3) == 3
img_hsv = rgb2hsv(img);
S = img_hsv(:,:,2);
% 增强饱和度
S_enhanced = S * 1.3; % 饱和度增强30%
S_enhanced = min(1, S_enhanced);
img_hsv(:,:,2) = S_enhanced;
enhanced_img = hsv2rgb(img_hsv);
else
enhanced_img = img;
end
end
2.13 自适应直方图均衡化(彩色)
matlab
function enhanced_img = adaptive_histogram_equalization_color(img)
% 彩色图像自适应直方图均衡化
if size(img,3) == 3
% 转换到 L*a*b* 颜色空间
img_lab = rgb2lab(img);
L = img_lab(:,:,1);
% 对 L 通道进行 CLAHE
L_eq = adapthisteq(L, 'ClipLimit', 0.02);
img_lab(:,:,1) = L_eq;
enhanced_img = lab2rgb(img_lab);
else
enhanced_img = img;
end
end
2.14 去雾增强
matlab
function enhanced_img = dehazing_enhancement(img)
% 简单去雾增强(基于暗通道先验简化版)
if size(img,3) == 3
% 估计大气光
dark_channel = min(img, [], 3);
atmospheric_light = prctile(dark_channel(:), 90);
% 透射率估计
transmission = 1 - 0.95 * dark_channel / atmospheric_light;
transmission = max(0.1, transmission);
% 去雾
enhanced_img = zeros(size(img));
for i = 1:3
enhanced_img(:,:,i) = (double(img(:,:,i)) - atmospheric_light) ./ transmission + atmospheric_light;
end
enhanced_img = uint8(max(0, min(255, enhanced_img)));
else
enhanced_img = img;
end
end
2.15 所有方法对比
matlab
function compare_all_methods(img)
% 对比所有增强方法
methods = {
'原始图像'
'直方图均衡化'
'CLAHE'
'伽马校正'
'对比度拉伸'
'对数变换'
'拉普拉斯锐化'
'反锐化掩模'
};
enhanced_images = cell(1,8);
enhanced_images{1} = img;
enhanced_images{2} = histogram_equalization(img);
enhanced_images{3} = adaptive_histogram_equalization(img);
enhanced_images{4} = gamma_correction(img);
enhanced_images{5} = contrast_stretching(img);
enhanced_images{6} = logarithmic_transform(img);
enhanced_images{7} = laplacian_sharpening(img);
enhanced_images{8} = unsharp_masking(img);
figure('Color','w','Position',[100 100 1400 800]);
for i = 1:8
subplot(2,4,i);
if size(enhanced_images{i},3) == 1
imshow(enhanced_images{i});
else
imshow(enhanced_images{i});
end
title(methods{i}, 'FontSize',10);
end
sgtitle('各种图像增强方法对比', 'FontSize',14, 'FontWeight','bold');
end
三、运行说明
3.1 直接运行
- 保存所有函数为
.m文件 - 运行
image_enhancement_main.m - 选择图像文件和增强方法
3.2 参数调优建议
| 方法 | 关键参数 | 建议值 | 效果 |
|---|---|---|---|
| 伽马校正 | gamma |
0.5~2.0 | <1 变亮,>1 变暗 |
| CLAHE | ClipLimit |
0.01~0.05 | 限制对比度增强 |
| 反锐化掩模 | alpha, radius |
0.5~1.0, 2~5 | 锐化强度和范围 |
| 同态滤波 | gamma_h, gamma_l |
1.5~2.5, 0.3~0.7 | 高频/低频增益 |
3.3 预期效果
- 直方图均衡化:增强整体对比度,但可能过度增强
- CLAHE:局部对比度增强,避免过曝
- 伽马校正:调整亮度,保持细节
- 拉普拉斯锐化:增强边缘,突出细节
- 同态滤波:同时压缩动态范围和增强对比度
参考代码 基于matlab的图像增强技术 www.youwenfan.com/contentcsw/82086.html
四、工程应用建议
4.1 医学图像增强
matlab
% 针对医学图像(如X光、CT)的专用增强
function medical_enhanced = medical_image_enhancement(img)
% 1. 去噪
denoised = imgaussfilt(img, 1);
% 2. 对比度增强
enhanced = adapthisteq(denoised, 'ClipLimit', 0.01);
% 3. 边缘增强
medical_enhanced = unsharp_masking(enhanced);
end
4.2 遥感图像增强
matlab
% 针对遥感图像的增强
function remote_enhanced = remote_sensing_enhancement(img)
% 1. 辐射校正(简化)
img_corrected = img - mean(img(:));
% 2. 同态滤波
enhanced = homomorphic_filtering(img_corrected);
% 3. 彩色增强
remote_enhanced = color_enhancement_hsv(enhanced);
end
4.3 实时视频增强
matlab
% 实时视频增强框架
function video_enhancement_realtime()
vid = videoinput('winvideo', 1);
set(vid, 'FramesPerTrigger', 1);
start(vid);
while true
frame = getsnapshot(vid);
enhanced = unsharp_masking(frame);
imshow(enhanced);
drawnow;
end
end
五、算法评估指标
matlab
function evaluate_enhancement(original, enhanced)
% 评估增强效果
% 1. 信息熵
entropy_original = entropy(original);
entropy_enhanced = entropy(enhanced);
% 2. 平均梯度
gradient_original = mean(gradmag(original));
gradient_enhanced = mean(gradmag(enhanced));
% 3. 峰值信噪比(如果有参考图像)
if exist('reference', 'var')
psnr_val = psnr(enhanced, reference);
end
fprintf('增强效果评估:\n');
fprintf(' 信息熵: %.2f → %.2f\n', entropy_original, entropy_enhanced);
fprintf(' 平均梯度: %.2f → %.2f\n', gradient_original, gradient_enhanced);
if exist('psnr_val', 'var')
fprintf(' PSNR: %.2f dB\n', psnr_val);
end
end