clear,cumsum,sum,numel,double,zeros,ones,abs,histeq,max/min

本文详细介绍了MATLAB中常用的函数,如clear、cumsum、sum等,并提供了丰富的示例代码帮助理解这些函数的功能和用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. clear

clear意思是清空内存中的矩阵常量和变量,清除变量。每次在编写matlab程序时在开始最好加上clear。

二. cumsum

matlab中使用sum和cumsum两个加和函数,区别与联系参考matlab中cumsum函数详解。

matlab中cumsum函数通常用于计算一个数组各行的累加值。在matlab的命令窗口中输入doc cumsum或者help cumsum即可获得该函数的帮助信息。

调用格式及说明

matlab中cumsum函数通常用于计算一个数组各行的累加值。在matlab的命令窗口中输入doc cumsum或者help cumsum即可获得该函数的帮助信息。

调用格式及说明

格式一:B = cumsum(A)

这种用法返回数组不同维数的累加和。

为了便于接下来的叙述,解释一下matlab中矩阵、数组、向量的概念:[1]

首先,matlab是矩阵实验室的意思。也就是说matlab中的数据都被视为矩阵。

数组就是一个一行n列的矩阵,向量就是一个n行一列的矩阵。

如果A是一个向量,cumsum(A) 返回一个向量,该向量中第m行的元素是A中第1行到第m行的所有元素累加和;

如果A是一个矩阵,cumsum(A) 返回一个和A同行同列的矩阵,矩阵中第m行第n列元素是A中第1行到第m行的所有第n列元素的累加和;

如果A是一个多维数组,cumsum(A)只对A中第一个非奇异维进行计算。

格式二:B = cumsum(A, dim)

这种调用格式返回A中由标量dim所指定的维数的累加和。

例如:cumsum(A, 1)返回的是沿着第一维(各列)的累加和,cumsum(A, 2)返回的是沿着第二维(各行)的累加和。

具体用法参考程序示例或matlab的帮助文档。

相关函数

cumprod, prod, sum

编辑本段程序示例

% cumsum example

clc

clear

A=[1;2;3;4;5];

cumsum(A)            % A是一个向量

B=1:5;

cumsum(B)            % A是一个数组

C = [1 2 3; 4 5 6];

cumsum(C, 1)

cumsum(C,2)

% 构造一个多维数组

D = zeros(3, 3, 3);

D(:,:,2) = [1,2,3;4,5,6;7,8,9];

D(:,:,3) = ones(3,3)

cumsum(D)

三. sum

sum 函数的例子

a1=[1, 2, 3; 4, 5, 6; 7, 8, 10]

sum(a1)= 12    15    19

b=[1, 2, 3]

sum(b) = 6

c=[1, 2, 3]

sum(c)=6

四. numel

numel:元素总数。n=numel(A)该语句返回数组中元素的总数。

五. double    

double(A);%返回与A矩阵数值相同但类型为double的矩阵。

六. zeros

zeros函数——生成零矩阵。

B = zeros(n):生成n×n全零阵。

B = zeros(m, n):生成m×n全零阵。

B = zeros([m n]):生成m×n全零阵。

B = zeros(d1, d2, d3……):生成d1×d2×d3×……全零阵或数组。

B = zeros([d1 d2 d3……]):生成d1×d2×d3×……全零阵或数组。

B = zeros(size(A)):生成与矩阵A相同大小的全零阵。

七. ones

ones的使用方法与zeros的使用方法类似。

八. abs

取绝对值。

九. imhist

功能:

计算和显示图像的色彩直方图

格式:

imhist(I, n)

imhist(X, map)

说明:

imhist(I, n)其中,n为指定的灰度级数目,缺省值为256。

imhist(X, map)就算和显示索引色图像X的直方图,map为调色板。

用astem(x, counts)同样可以显示直方图。

十. histeq

histeq函数

功能:

直方图均衡化

格式:

J = histeq(I, hgram)

J = histeq(I, n)

[J,T] = histeq(I, ...)

newmap = histeq(X, map, hgram)

newmap = histeq(X, map)

[new, T] = histeq(X, ...)

说明:

J = histeq(I, hgram)实现了所谓“直方图规定化”,即将原图象I的直方图变换成用户指定的向量hgram。hgram中的每一个元素都在[0,1]中;

J = histeq(I, n)指定均衡化后的灰度级数n,缺省值为64;

[J, T] = histeq(I, ...)返回从能将图像I的灰度直方图变换成图像J的直方图的变换T;

newmap = histeq(X, map)和[new, T] = histeq(X, ...)是针对索引色图像调色板的直方图均衡。

十一. max/min

求矩阵的最大值和最小值。

求矩阵A的最大值的函数有3种调用格式,分别是:

(1) max(A):返回一个行向量,向量的第i个元素是矩阵A的第i列上的最大值。

(2) [Y,U] = max(A):返回行向量Y和U,Y向量记录A的每列的最大值,U向量记录每列最大值的行号。

(3) max(A, [], dim):dim取1或2。dim取1时,该函数和max(A)完全相同;dim取2时,该函数返回一个列向量,其第i个元素是A矩阵的第i行上的最大值。

求最小值的函数是min,其用法和max完全相同。

转载于:https://my.oschina.net/wangsifangyuan/blog/864228

帮做我改进hsv_svd_clahe函数文件 代码如下: % ===================== 主程序 ===================== clear, clc, close all; % 加载测试图像 low_light = imread('D:\SVD\实验素材\LOLdataset\our485\low\101.png'); reference = imread('D:\SVD\实验素材\LOLdataset\our485\high\101.png'); % 正常光照参考图像 % 初始化结果表 methods = {'HE', 'BIMEF', 'LIME', 'MSRCR', 'HSV-SVD-CLAHE'}; results = zeros(5, 6); % 5种方法 x 6个指标 (PSNR, SSIM, Avg Gradient, Entropy, NIQE, VIF) % 评估每种方法 disp('评估HE方法...'); enhanced_he = he_method(low_light); [results(1,1), results(1,2), results(1,3), results(1,4), results(1,5), results(1,6)] = ... evaluate_image(enhanced_he, reference); disp('评估BIMEF方法...'); enhanced_bimef = bimef(low_light); [results(2,1), results(2,2), results(2,3), results(2,4), results(2,5), results(2,6)] = ... evaluate_image(enhanced_bimef, reference); disp('评估LIME方法...'); enhanced_lime = lime_method(low_light); [results(3,1), results(3,2), results(3,3), results(3,4), results(3,5), results(3,6)] = ... evaluate_image(enhanced_lime, reference); disp('评估MSRCR方法...'); enhanced_msrcr = msrcr_method(low_light); [results(4,1), results(4,2), results(4,3), results(4,4), results(4,5), results(4,6)] = ... evaluate_image(enhanced_msrcr, reference); disp('评估HSV-SVD-CLAHE方法...'); enhanced_proposed = hsv_svd_clahe(low_light); [results(5,1), results(5,2), results(5,3), results(5,4), results(5,5), results(5,6)] = ... evaluate_image(enhanced_proposed, reference); % 显示结果 fprintf('\n%-25s %8s %8s %12s %10s %10s %10s\n', ... 'Method', 'PSNR', 'SSIM', 'Avg Gradient', 'Entropy', 'NIQE', 'VIF'); fprintf('--------------------------------------------------------------------------------------------\n'); for i = 1:5 fprintf('%-25s %8.2f %8.4f %12.4f %10.4f %10.4f %10.4f\n', ... methods{i}, results(i,1), results(i,2), results(i,3), results(i,4), results(i,5), results(i,6)); end % 可视化结果 figure('Position', [100, 50, 1200, 800], 'Name', '增强结果对比'); subplot(2,3,1); imshow(low_light); title('原始低照度图像'); subplot(2,3,2); imshow(enhanced_he); title('HE'); subplot(2,3,3); imshow(enhanced_bimef); title('BIMEF'); subplot(2,3,4); imshow(enhanced_lime); title('LIME'); subplot(2,3,5); imshow(enhanced_msrcr); title('MSRCR'); subplot(2,3,6); imshow(enhanced_proposed); title('HSV-SVD-CLAHE'); % 梯度可视化验证 figure('Position', [200, 100, 1200, 800], 'Name', '梯度分布验证'); subplot(2,3,1); plot_gradient(low_light, '原始图像梯度'); subplot(2,3,2); plot_gradient(enhanced_he, 'HE梯度'); subplot(2,3,3); plot_gradient(enhanced_bimef, 'BIMEF梯度'); subplot(2,3,4); plot_gradient(enhanced_lime, 'LIME梯度'); subplot(2,3,5); plot_gradient(enhanced_msrcr, 'MSRCR梯度'); subplot(2,3,6); plot_gradient(enhanced_proposed, '本文方法梯度'); % ===================== 梯度可视化函数 ===================== function plot_gradient(img, title_str) img_double = im2double(img); if size(img_double, 3) == 3 gray = rgb2gray(img_double); else gray = img_double; end % 计算梯度 [Gx, Gy] = imgradientxy(gray, 'sobel'); G_mag = sqrt(Gx.^2 + Gy.^2); % 排除边界 [h, w] = size(G_mag); border_cut = round(0.05*min(h, w)); if border_cut > 0 valid_region = G_mag(border_cut:end-border_cut, border_cut:end-border_cut); else valid_region = G_mag; end % 显示梯度幅值 imshow(valid_region, [0, 0.5]); colorbar; title(sprintf('%s\n平均梯度: %.4f', title_str, mean(valid_region(:)))); end % ===================== 评估函数 ===================== % 指标 理想范围 说明 % PSNR >25 dB 值越高表示失真越小 % SSIM 0.8-1.0 值越接近1结构相似度越高 % Avg Gradient 0.1-0.3 值越高表示边缘越清晰 % Entropy >7 值越高表示信息越丰富 % NIQE <5 值越低表示感知质量越好 % VIF >0.6 值越高表示视觉信息保留越好 function [psnr_val, ssim_val, avg_grad, entropy_val, niqe_val, vif_val] = ... evaluate_image(enhanced, reference) % 输入验证 if nargin < 2, reference = []; end % 转换为double类型 enhanced_double = im2double(enhanced); % PSNR和SSIM计算 if ~isempty(reference) && isequal(size(enhanced), size(reference)) reference_double = im2double(reference); psnr_val = psnr(enhanced_double, reference_double); ssim_val = ssim(enhanced_double, reference_double); % VIF计算(仅在有参考图像时) vif_val = calculate_vif(enhanced, reference); else psnr_val = NaN; ssim_val = NaN; vif_val = NaN; end % 平均梯度 if size(enhanced_double, 3) == 3 gray_img = rgb2gray(enhanced_double); else gray_img = enhanced_double; end % 使用Sobel算子计算梯度 [Gx, Gy] = imgradientxy(gray_img, 'sobel'); % 计算梯度幅值 G_mag = sqrt(Gx.^2 + Gy.^2); % 排除5%边界像素 [h, w] = size(G_mag); border_cut = round(0.05*min(h, w)); if border_cut > 0 valid_region = G_mag(border_cut:end-border_cut, border_cut:end-border_cut); else valid_region = G_mag; % 小图像不排除边界 end % 计算平均梯度 avg_grad = mean(valid_region(:)); % 信息熵 entropy_val = entropy(gray_img); % NIQE指标 niqe_val = niqe(enhanced); end % ===================== VIF计算函数 ===================== function vif_val = calculate_vif(enhanced, reference) % 计算视觉信息保真度(VIF)指标 % 转换为double类型并提取亮度通道(Y) enhanced_y = rgb2ycbcr(im2double(enhanced)); reference_y = rgb2ycbcr(im2double(reference)); enhanced_y = enhanced_y(:,:,1); reference_y = reference_y(:,:,1); % 设置VIF参数 sigma_nsq = 0.1; % 噪声方差估计 num_scales = 4; % 多尺度分析层数 % 初始化VIF值 vif_val = 0; % 多尺度VIF计算 for scale = 1:num_scales % 下采样 if scale > 1 enhanced_y = imresize(enhanced_y, 0.5, 'bicubic'); reference_y = imresize(reference_y, 0.5, 'bicubic'); end % 计算小波系数(使用db2滤波器) [ref_coeff, ~] = dwt2(reference_y, 'db2'); [enh_coeff, ~] = dwt2(enhanced_y, 'db2'); % 计算子带信息 ref_var = imfilter(ref_coeff.^2, ones(3)/9, 'symmetric'); enh_var = imfilter(enh_coeff.^2, ones(3)/9, 'symmetric'); cross_var = imfilter(ref_coeff.*enh_coeff, ones(3)/9, 'symmetric'); % 计算互信息 g = cross_var ./ (ref_var + eps); sv = enh_var - g.*cross_var; % 计算信息量 ref_info = log2(1 + ref_var / sigma_nsq); enh_info = log2(1 + (g.^2 .* ref_var) ./ (sv + sigma_nsq + eps)); % 累加VIF值 vif_val = vif_val + sum(enh_info(:)) / sum(ref_info(:)); end % 平均多尺度结果 vif_val = vif_val / num_scales; end % ===================== 改进的本文方法 ===================== function enhanced_img = hsv_svd_clahe(img, beta, gamma, tau) % 转换为HSV并计算平均亮度 img_double = im2double(img); hsv_img = rgb2hsv(img_double); V = hsv_img(:,:,3); mean_brightness = mean(V(:)); % 参数自适应调整 if nargin < 2 || isempty(beta) if mean_brightness < 0.2 % 极暗图像 beta = 3.2; gamma = 0.6; tau = 0.999; % 高阈值避免块状伪影 disp('参数模式: 极暗图像 (beta=3.2, gamma=0.6, tau=0.999)'); elseif mean_brightness < 0.5 % 低照度图像 beta = 2.5; gamma = 0.7; tau = 0.99; % 中等阈值 disp('参数模式: 低照度图像 (beta=2.5, gamma=0.7, tau=0.99)'); else % 正常图像 beta = 1.6; gamma = 0.85; tau = 0.95; % 较低阈值保留细节 disp('参数模式: 正常图像 (beta=1.6, gamma=0.85, tau=0.95)'); end end if nargin < 3 || isempty(gamma), gamma = 0.8; end if nargin < 4 || isempty(tau), tau = 0.999; end % 默认高阈值 % 奇异值分解 [U, S, V_svd] = svd(V, 'econ'); sigma = diag(S); total_energy = sum(sigma.^2); % 确定主次成分分界点 cum_energy_ratio = cumsum(sigma.^2) / total_energy; idx = find(cum_energy_ratio >= tau, 1); if isempty(idx), idx = numel(sigma); end % 主次成分差异化处理 sigma_enhanced = zeros(size(sigma)); sigma_enhanced(1:idx) = sigma(1:idx) * beta; % 主成分增强 sigma_enhanced(idx+1:end) = sigma(idx+1:end) * gamma; % 次成分抑制 % 重构亮度通道 V_enhanced = U * diag(sigma_enhanced) * V_svd'; V_enhanced = min(max(V_enhanced, 0), 1); % 添加细节增强层 base_layer = imgaussfilt(V_enhanced, 1.5); detail_layer = V_enhanced - base_layer; V_enhanced = base_layer + 1.6 * detail_layer; % 增强细节 % 重组HSV并转RGB hsv_enhanced = hsv_img; hsv_enhanced(:,:,3) = V_enhanced; rgb_enhanced = hsv2rgb(hsv_enhanced); % CLAHE增强 (Lab空间) lab_img = rgb2lab(rgb_enhanced); L = lab_img(:,:,1) / 100; L_clahe = adapthisteq(L, 'ClipLimit', 0.01, 'NumTiles', [8,8]); lab_img(:,:,1) = L_clahe * 100; enhanced_img = lab2rgb(lab_img, 'OutputType', 'double'); % 小波去噪(仅低照度图像) if mean_brightness < 0.5 try enhanced_img = wavelet_denoise(enhanced_img); disp('应用小波去噪'); catch ME warning('去噪步骤跳过: %s', ME.message); end end % 转换为uint8 enhanced_img = im2uint8(enhanced_img); end % ===================== 小波去噪函数 ===================== function denoised_img = wavelet_denoise(img) % 小波去噪处理泊松噪声 % 初始化输出 denoised_img = zeros(size(img)); % 小波去噪参数 wavelet = 'sym8'; level = 3; % 对每个通道分别处理 for ch = 1:3 channel = img(:,:,ch); % 使用Bayes方法去噪 denoised_channel = wdenoise2(channel, level, ... 'Wavelet', wavelet, ... 'DenoisingMethod', 'Bayes', ... 'ThresholdRule', 'median', ... 'NoiseEstimate', 'LevelDependent'); denoised_img(:,:,ch) = denoised_channel; end end % ===================== 传统增强方法 ===================== % 直方图均衡化 (HE) function enhanced = he_method(img) enhanced = histeq(img); end % BIMEF方法 function enhanced = bimef(img) % 读取彩色图像 img_double = im2double(img); gray_img = rgb2gray(img_double); log_img = log(1 + gray_img); % BIMEF 算法参数 filter_size = 5; step = 1; enhanced_img = zeros(size(log_img)); for i = step:step:size(log_img, 1)-filter_size+1 for j = step:step:size(log_img, 2)-filter_size+1 h = ones(filter_size, filter_size) / (filter_size^2); enhanced_img(i:i+filter_size-1, j:j+filter_size-1) = ... exp(h * log_img(i:i+filter_size-1, j:j+filter_size-1)); end end enhanced_img = (enhanced_img - min(enhanced_img(:))) / ... (max(enhanced_img(:)) - min(enhanced_img(:))); enhanced_img = uint8(255 * enhanced_img); % 转换为彩色 hsv_img = rgb2hsv(img_double); hsv_img(:, :, 3) = mat2gray(enhanced_img); enhanced = hsv2rgb(hsv_img); enhanced = im2uint8(enhanced); end % LIME方法 function enhanced = lime_method(img) img = im2double(img); T = max(img, [], 3); r = 16; eps = 0.01; L = imguidedfilter(T, img, 'NeighborhoodSize', [r r], 'DegreeOfSmoothing', eps); L = min(L, 1); L_adjusted = imadjust(L, [min(L(:)) max(L(:))], [0.2 1]); enhanced = zeros(size(img)); for ch = 1:3 enhanced(:,:,ch) = img(:,:,ch) ./ max(L_adjusted, 0.01); end enhanced = min(max(enhanced, 0), 1); enhanced = im2uint8(enhanced); end % MSRCR方法 function enhanced_img = msrcr_method(img) scales = [15, 80, 250]; alpha = 125; beta = 46; G = 5; img = im2double(img); msr = zeros(size(img)); for i = 1:numel(scales) sigma = scales(i); gaus_filter = fspecial('gaussian', 2*ceil(3*sigma)+1, sigma); for ch = 1:3 log_img = log(img(:,:,ch) + 1e-6); blurred = imfilter(img(:,:,ch), gaus_filter, 'symmetric'); log_blurred = log(blurred + 1e-6); msr(:,:,ch) = msr(:,:,ch) + (log_img - log_blurred)/numel(scales); end end color_restored = zeros(size(msr)); for ch = 1:3 I_ch = img(:,:,ch); col_sum = sum(img,3); color_restored(:,:,ch) = beta * (log(alpha*I_ch + 1) - log(col_sum + 1)); end enhanced_img = G * (0.5*msr + 0.5*color_restored); enhanced_img = (enhanced_img - min(enhanced_img(:))) / ... (max(enhanced_img(:)) - min(enhanced_img(:))); enhanced_img = im2uint8(enhanced_img); end
06-14
再加入VIF指标,注意代码和函数之间的联系 clear,clc,close all % 加载测试图像 low_light = imread('D:\SVD\实验素材\LOLdataset\eval15\low\547.png'); reference = imread('D:\SVD\实验素材\LOLdataset\eval15\high\547.png'); % 正常光照参考图像 % 初始化结果表 methods = {'HE', 'BIMEF', 'LIME', 'MSRCR', 'HSV-SVD-CLAHE'}; results = zeros(5, 5); % 5种方法 x 5个指标 (PSNR, SSIM, Avg Gradient, Entropy, NIQE) % 评估每种方法 enhanced_he = he_method(low_light); [results(1,1), results(1,2), results(1,3), results(1,4), results(1,5)] = evaluate_image(enhanced_he, reference); enhanced_bimef = bimef(low_light); [results(2,1), results(2,2), results(2,3), results(2,4), results(2,5)] = evaluate_image(enhanced_bimef, reference); enhanced_lime = lime_method(low_light); [results(3,1), results(3,2), results(3,3), results(3,4), results(3,5)] = evaluate_image(enhanced_lime, reference); enhanced_msrcr = msrcr_method(low_light); [results(4,1), results(4,2), results(4,3), results(4,4), results(4,5)] = evaluate_image(enhanced_msrcr, reference); enhanced_proposed = hsv_svd_clahe(low_light); [results(5,1), results(5,2), results(5,3), results(5,4), results(5,5)] = evaluate_image(enhanced_proposed, reference); % 显示结果 fprintf('%-25s %8s %8s %12s %10s %10s\n', 'Method', 'PSNR', 'SSIM', 'Avg Gradient', 'Entropy', 'NIQE'); fprintf('-------------------------------------------------------------------------------\n'); for i = 1:5 fprintf('%-25s %8.2f %8.4f %12.4f %10.4f %10.4f\n', ... methods{i}, results(i,1), results(i,2), results(i,3), results(i,4), results(i,5)); end % 可视化结果 figure('Position', [100, 50, 1200, 800]); subplot(2,3,1); imshow(low_light); title('原始低照度图像'); subplot(2,3,2); imshow(enhanced_he); title('HE'); subplot(2,3,3); imshow(enhanced_bimef); title('BIMEF'); subplot(2,3,4); imshow(enhanced_lime); title('LIME'); subplot(2,3,5); imshow(enhanced_msrcr); title('MSRCR'); subplot(2,3,6); imshow(enhanced_proposed); title('HSV-SVD-CLAHE'); % ===================== 改进的本文方法 ===================== % HSV_SVD_CLAHE 低照度图像增强算法 function enhanced_img = hsv_svd_clahe(img, beta, gamma, tau) % 转换为HSV并计算平均亮度 img_double = im2double(img); hsv_img = rgb2hsv(img_double); V = hsv_img(:,:,3); mean_brightness = mean(V(:)); % 参数自适应调整 if nargin < 2 || isempty(beta) if mean_brightness < 0.2 % 极暗图像 beta = 3.2; gamma = 0.6; tau = 0.999; % 高阈值避免块状伪影 disp('参数模式: 极暗图像 (beta=3.2, gamma=0.6, tau=0.999)'); elseif mean_brightness < 0.5 % 低照度图像 beta = 2.5; gamma = 0.7; tau = 0.99; % 中等阈值 disp('参数模式: 低照度图像 (beta=2.5, gamma=0.7, tau=0.99)'); else % 正常图像 beta = 1.6; gamma = 0.85; tau = 0.95; % 较低阈值保留细节 disp('参数模式: 正常图像 (beta=1.6, gamma=0.85, tau=0.95)'); end end if nargin < 3 || isempty(gamma), gamma = 0.8; end if nargin < 4 || isempty(tau), tau = 0.999; end % 默认高阈值 % 奇异值分解 [U, S, V_svd] = svd(V, 'econ'); sigma = diag(S); total_energy = sum(sigma.^2); % 确定主次成分分界点 cum_energy_ratio = cumsum(sigma.^2) / total_energy; idx = find(cum_energy_ratio >= tau, 1); if isempty(idx), idx = numel(sigma); end % 主次成分差异化处理 sigma_enhanced = zeros(size(sigma)); sigma_enhanced(1:idx) = sigma(1:idx) * beta; % 主成分增强 sigma_enhanced(idx+1:end) = sigma(idx+1:end) * gamma; % 次成分抑制 % 重构亮度通道 V_enhanced = U * diag(sigma_enhanced) * V_svd'; V_enhanced = min(max(V_enhanced, 0), 1); % 重组HSV并转RGB hsv_enhanced = hsv_img; hsv_enhanced(:,:,3) = V_enhanced; rgb_enhanced = hsv2rgb(hsv_enhanced); % CLAHE增强 (Lab空间) lab_img = rgb2lab(rgb_enhanced); L = lab_img(:,:,1) / 100; L_clahe = adapthisteq(L, 'ClipLimit', 0.01, 'NumTiles', [8,8]); lab_img(:,:,1) = L_clahe * 100; enhanced_img = lab2rgb(lab_img, 'OutputType', 'double'); % 小波去噪(仅低照度图像) if mean_brightness < 0.5 try enhanced_img = wavelet_denoise(enhanced_img); disp('应用小波去噪'); catch ME warning('去噪步骤跳过: %s', ME.message); end end % 转换为uint8 enhanced_img = im2uint8(enhanced_img); end % ===================== 修正的小波去噪函数 ===================== function denoised_img = wavelet_denoise(img) % 小波去噪处理泊松噪声 % 使用参数: % Wavelet: sym8 (适合图像去噪) % Level: 3 (中等分解层次) % ThresholdRule: 'median' (修正为有效参数) % DenoisingMethod: 'Bayes' (贝叶斯去噪) % 初始化输出 denoised_img = zeros(size(img)); % 小波去噪参数 wavelet = 'sym8'; level = 3; % 对每个通道分别处理 for ch = 1:3 channel = img(:,:,ch); % 修正的阈值规则 - 使用有效的'median'选项 denoised_channel = wdenoise2(channel, level, ... 'Wavelet', wavelet, ... 'DenoisingMethod', 'Bayes', ... 'ThresholdRule', 'median', ... % 修正为有效参数 'NoiseEstimate', 'LevelDependent'); denoised_img(:,:,ch) = denoised_channel; end end % ===================== 评估函数 ===================== function [psnr_val, ssim_val, avg_grad, entropy_val, niqe_val] = evaluate_image(enhanced, reference) % 输入验证 if nargin < 2, reference = []; end % PSNR计算 if ~isempty(reference) && isequal(size(enhanced), size(reference)) psnr_val = psnr(enhanced, reference); ssim_val = ssim(enhanced, reference); else psnr_val = NaN; ssim_val = NaN; end % 平均梯度 gray_img = rgb2gray(im2double(enhanced)); [Gx, Gy] = imgradientxy(gray_img,"sobel"); avg_grad = mean(sqrt(Gx.^2 + Gy.^2), 'all'); % 平均梯度范围 图像质量判断 可能原因 % < 0.05 质量差(模糊/低对比) 严重模糊、失焦、低对比度场景 % 0.05 ~ 0.15 质量中等 轻度模糊、纹理简单 % 0.15 ~ 0.3 质量良好 清晰、细节丰富 % > 0.3 质量优(或噪声干扰) 高锐度/高噪声 % 信息熵 entropy_val = entropy(gray_img); % NIQE指标 niqe_val = niqe(enhanced); end % ===================== 其他方法保持不变 ===================== % 直方图均衡化 (HE) function enhanced = he_method(img) enhanced = histeq(img); end % BIMEF方法 function enhanced = bimef(img) % 读取彩色图像 img_double = im2double(img); gray_img = rgb2gray(img_double); log_img = log(1 + gray_img); % BIMEF 算法参数 filter_size = 5; step = 1; enhanced_img = zeros(size(log_img)); for i = step:step:size(log_img, 1)-filter_size+1 for j = step:step:size(log_img, 2)-filter_size+1 h = ones(filter_size, filter_size) / (filter_size^2); enhanced_img(i:i+filter_size-1, j:j+filter_size-1) = ... exp(h * log_img(i:i+filter_size-1, j:j+filter_size-1)); end end enhanced_img = (enhanced_img - min(enhanced_img(:))) / ... (max(enhanced_img(:)) - min(enhanced_img(:))); enhanced_img = uint8(255 * enhanced_img); % 转换为彩色 hsv_img = rgb2hsv(img_double); hsv_img(:, :, 3) = mat2gray(enhanced_img); enhanced = hsv2rgb(hsv_img); enhanced = im2uint8(enhanced); end % LIME方法 function enhanced = lime_method(img) img = im2double(img); T = max(img, [], 3); r = 16; eps = 0.01; L = imguidedfilter(T, img, 'NeighborhoodSize', [r r], 'DegreeOfSmoothing', eps); L = min(L, 1); L_adjusted = imadjust(L, [min(L(:)) max(L(:))], [0.2 1]); enhanced = zeros(size(img)); for ch = 1:3 enhanced(:,:,ch) = img(:,:,ch) ./ max(L_adjusted, 0.01); end enhanced = min(max(enhanced, 0), 1); enhanced = im2uint8(enhanced); end % MSRCR方法 function enhanced_img = msrcr_method(img) scales = [15, 80, 250]; alpha = 125; beta = 46; G = 5; img = im2double(img); msr = zeros(size(img)); for i = 1:numel(scales) sigma = scales(i); gaus_filter = fspecial('gaussian', 2*ceil(3*sigma)+1, sigma); for ch = 1:3 log_img = log(img(:,:,ch) + 1e-6); blurred = imfilter(img(:,:,ch), gaus_filter, 'symmetric'); log_blurred = log(blurred + 1e-6); msr(:,:,ch) = msr(:,:,ch) + (log_img - log_blurred)/numel(scales); end end color_restored = zeros(size(msr)); for ch = 1:3 I_ch = img(:,:,ch); col_sum = sum(img,3); color_restored(:,:,ch) = beta * (log(alpha*I_ch + 1) - log(col_sum + 1)); end enhanced_img = G * (0.5*msr + 0.5*color_restored); enhanced_img = (enhanced_img - min(enhanced_img(:))) / ... (max(enhanced_img(:)) - min(enhanced_img(:))); enhanced_img = im2uint8(enhanced_img); end
06-13
请改进本文方法,使得它在我举例的几个算法里面是最好的。另外再加入niqe指标。注意修改代码的时候要注意代码和函数文件之间的联动。代码如下: clear,clc,close all % 加载测试图像 low_light = imread('D:\SVD\实验素材\ExDark数据库\Table\2015_06914.jpg'); reference = imread('D:\SVD\实验素材\ExDark数据库\Table\2015_06914.jpg'); % 正常光照参考图像 % 初始化结果表 methods = {'HE', 'BIMEF', 'LIME', 'MSRCR', 'HSV-SVD-CLAHE'}; results = zeros(5, 4); % 5种方法 x 4个指标 % 评估每种方法 enhanced_he = he_method(low_light); [results(1,1), results(1,2), results(1,3), results(1,4)] = evaluate_image(enhanced_he, reference); enhanced_bimef = bimef(low_light); [results(2,1), results(2,2), results(2,3), results(2,4)] = evaluate_image(enhanced_bimef, reference); enhanced_lime = lime_method(low_light); [results(3,1), results(3,2), results(3,3), results(3,4)] = evaluate_image(enhanced_lime, reference); enhanced_msrcr = msrcr_method(low_light); [results(4,1), results(4,2), results(4,3), results(4,4)] = evaluate_image(enhanced_msrcr, reference); enhanced_proposed = hsv_svd_clahe(low_light); [results(5,1), results(5,2), results(5,3), results(5,4)] = evaluate_image(enhanced_proposed, reference); % 显示结果 fprintf('%-25s %8s %8s %12s %10s\n', 'Method', 'PSNR', 'SSIM', 'Avg Gradient', 'Entropy'); fprintf('-------------------------------------------------------------\n'); for i = 1:5 fprintf('%-25s %8.2f %8.4f %12.4f %10.4f\n', ... methods{i}, results(i,1), results(i,2), results(i,3), results(i,4)); end % 可视化结果 figure('Position', [100, 100, 1200, 800]); subplot(2,3,1); imshow(low_light); title('原始低照度图像'); subplot(2,3,2); imshow(enhanced_he); title('HE'); subplot(2,3,3); imshow(enhanced_bimef); title('BIMEF'); subplot(2,3,4); imshow(enhanced_lime); title('LIME'); subplot(2,3,5); imshow(enhanced_msrcr); title('MSRCR'); subplot(2,3,6); imshow(enhanced_proposed); title('HSV-SVD-CLAHE'); % 本文方法 hsv_svd_clahe function enhanced_img = hsv_svd_clahe(img, beta, gamma) % HSV_SVD_CLAHE 低照度图像增强算法(亮度自适应双系数调节) % 新增功能:根据输入图像平均亮度自适应调整参数 % 亮度划分阈值: % dark_threshold = 0.2 (平均亮度 < 0.2 时为过暗图像) % normal_threshold = 0.5 (0.2 ≤ 平均亮度 < 0.5 时为低照度图像) % bright_threshold = 0.5 (平均亮度 ≥ 0.5 时为正常图像) % 转换为HSV并计算平均亮度 img_double = im2double(img); hsv_img = rgb2hsv(img_double); V = hsv_img(:,:,3); mean_brightness = mean(V(:)); fprintf('平均亮度: %.4f\n', mean_brightness); % 调试信息 % 参数自适应调整(如果未手动输入参数) if nargin < 2 || isempty(beta) % 根据亮度水平分配参数 if mean_brightness < 0.2 % 极暗图像 beta = 3.0; gamma = 0.65; disp('参数模式: 极暗图像 (beta=3.0, gamma=0.65)'); elseif mean_brightness < 0.5 % 低照度图像 beta = 2.3; gamma = 0.75; disp('参数模式: 低照度图像 (beta=2.3, gamma=0.75)'); else % 正常图像 beta = 1.5; gamma = 0.9; disp('参数模式: 正常图像 (beta=1.5, gamma=0.9)'); end end if nargin < 3 || isempty(gamma) gamma = 0.8; % gamma默认值 end % 奇异值分解 [U, S, V_svd] = svd(V, 'econ'); sigma = diag(S); total_energy = sum(sigma.^2); % 计算总能量 % 计算累积能量比 cum_energy_ratio = cumsum(sigma.^2) / total_energy; % 确定主次成分分界点(90%能量处) tau = 0.999; % 90%能量阈值 idx = find(cum_energy_ratio >= tau, 1); if isempty(idx) idx = numel(sigma); end sigma_enhanced = zeros(size(sigma)); % 主成分增强(前90%能量) main_idx = 1:idx; sigma_enhanced(main_idx) = sigma(main_idx) * beta; % 次成分抑制(后10%能量) secondary_idx = (idx+1):numel(sigma); sigma_enhanced(secondary_idx) = sigma(secondary_idx) * gamma; % 重构亮度通道 S_enhanced = diag(sigma_enhanced); V_enhanced = U * S_enhanced * V_svd'; V_enhanced = min(max(V_enhanced, 0), 1); % 限制在[0,1]范围 % 重组HSV图像 hsv_enhanced = hsv_img; hsv_enhanced(:,:,3) = V_enhanced; % 转回RGB空间 rgb_enhanced = hsv2rgb(hsv_enhanced); % CLAHE增强 (在Lab空间进行) lab_img = rgb2lab(rgb_enhanced); L = lab_img(:,:,1) / 100; % 归一化到[0,1] % 应用CLAHE L_clahe = adapthisteq(L, 'ClipLimit', 0.01, 'NumTiles', [8,8]); % 反归一化并重组Lab图像 lab_img(:,:,1) = L_clahe * 100; enhanced_img = lab2rgb(lab_img, 'OutputType', 'double'); %预训练去噪卷积神经网络 DnCNN 对单通道图像进行运算。将含噪 RGB 图像分成三个单独的颜色通道。 [imgR,imgG,imgB] = imsplit(enhanced_img); %加载预训练的 DnCNN 网络。 net = denoisingNetwork('dncnn'); %使用 DnCNN 网络去除每个颜色通道的噪声。 denoisedR = denoiseImage(imgR,net); denoisedG = denoiseImage(imgG,net); denoisedB = denoiseImage(imgB,net); %合并去噪的颜色通道以形成去噪后的 RGB 图像。 enhanced_img = cat(3,denoisedR,denoisedG,denoisedB); % 转换为uint8 enhanced_img = im2uint8(enhanced_img); end % 其他增强方法 % 直方图均衡化 (HE) function enhanced = he_method(img) enhanced = histeq(img); end % BIMEF方法 function enhanced = bimef(img) % 读取彩色图像 img_double = im2double(img); % 将图像转换为 double 类型 % 将图像转换为灰度图像 gray_img = rgb2gray(img_double); % 将灰度图像转换为对数域 log_img = log(1 + gray_img); % BIMEF 算法参数 filter_size = 5; % 滤波器大小 step = 1; % 步长 % 初始化输出图像 enhanced_img = zeros(size(log_img)); % 应用 BIMEF 算法 for i = step:step:size(log_img, 1)-filter_size+1 for j = step:step:size(log_img, 2)-filter_size+1 % 定义滤波器 h = ones(filter_size, filter_size) / (filter_size^2); % 滤波操作 enhanced_img(i:i+filter_size-1, j:j+filter_size-1) = ... exp(h * log_img(i:i+filter_size-1, j:j+filter_size-1)); end end % 将输出图像转换回线性域并归一化 enhanced_img = max(enhanced_img, 0); % 防止负值出现 enhanced_img = (enhanced_img - min(enhanced_img(:))) / ... (max(enhanced_img(:)) - min(enhanced_img(:))); % 归一化处理 enhanced_img = uint8(255 * enhanced_img); % 转换为 8 位无符号整数 % 将增强后的灰度图像转换回彩色图像 hsv_img = rgb2hsv(img_double); hsv_img(:, :, 3) = mat2gray(enhanced_img); % 替换亮度分量 enhanced = hsv2rgb(hsv_img); % 转换为uint8 enhanced = im2uint8(enhanced); end % LIME方法 (简化实现) function enhanced = lime_method(img) img = im2double(img); % 估计光照图 T = max(img, [], 3); % 优化光照图 (导向滤波) r = 16; eps = 0.01; L = imguidedfilter(T, img, 'NeighborhoodSize', [r r], 'DegreeOfSmoothing', eps); % 调整光照图 L = min(L, 1); % 将大于 1 的数值值设置为 1 L_adjusted = imadjust(L, [min(L(:)) max(L(:))], [0.2 1]); % 增强图像 enhanced = zeros(size(img)); for ch = 1:3 enhanced(:,:,ch) = img(:,:,ch) ./ max(L_adjusted, 0.01); end enhanced = min(max(enhanced, 0), 1); enhanced = im2uint8(enhanced); end % MSRCR方法 function enhanced_img = msrcr_method(img) % 默认参数设置 scales = [15, 80, 250]; % 多尺度参数 alpha = 125; % 颜色恢复增益 beta = 46; % 非线性强度 G = 5; % 增益因子 img = im2double(img); msr = zeros(size(img)); % 多尺度Retinex处理 for i = 1:numel(scales) sigma = scales(i); gaus_filter = fspecial('gaussian', 2*ceil(3*sigma)+1, sigma); for ch = 1:3 log_img = log(img(:,:,ch) + 1e-6); blurred = imfilter(img(:,:,ch), gaus_filter, 'symmetric'); log_blurred = log(blurred + 1e-6); msr(:,:,ch) = msr(:,:,ch) + (log_img - log_blurred)/numel(scales); end end % 改进的颜色恢复公式 color_restored = zeros(size(msr)); for ch = 1:3 I_ch = img(:,:,ch); col_sum = sum(img,3); color_restored(:,:,ch) = beta * (log(alpha*I_ch + 1) - log(col_sum + 1)); end % 融合结果并归一化 enhanced_img = G * (0.5*msr + 0.5*color_restored); enhanced_img = (enhanced_img - min(enhanced_img(:))) / ... (max(enhanced_img(:)) - min(enhanced_img(:))); enhanced_img = im2uint8(enhanced_img); end % 图像质量评估指标:PSNR、SSIM、平均梯度、信息熵 function [psnr_val, ssim_val, avg_grad, entropy_val] = evaluate_image(enhanced, reference) % 图像质量评估 % 输入: % enhanced - 增强后的图像 % reference - 参考图像 (正常光照图像) % 输出: % psnr_val - 峰值信噪比 % ssim_val - 结构相似性 % avg_grad - 平均梯度 % entropy_val - 信息熵 % PSNR计算 if exist('reference', 'var') && ~isempty(reference) psnr_val = psnr(enhanced, reference); else psnr_val = NaN; end % SSIM计算 if exist('reference', 'var') && ~isempty(reference) ssim_val = ssim(enhanced, reference); else ssim_val = NaN; end % 平均梯度 (清晰度) [Gx, Gy] = imgradientxy(rgb2gray(enhanced)); G_mag = sqrt(Gx.^2 + Gy.^2); avg_grad = mean(G_mag(:)); % 信息熵 (信息量) gray_img = rgb2gray(enhanced); entropy_val = entropy(gray_img); end
06-13
检查代码和函数,为什么每一个算法的平均梯度都这么低 clear,clc,close all % 加载测试图像 low_light = imread('D:\SVD\实验素材\ExDark数据库\Table\2015_06914.jpg'); reference = imread('D:\SVD\实验素材\ExDark数据库\Table\2015_06914.jpg'); % 正常光照参考图像 % 初始化结果表 methods = {'HE', 'BIMEF', 'LIME', 'MSRCR', 'HSV-SVD-CLAHE'}; results = zeros(5, 5); % 5种方法 x 5个指标 (PSNR, SSIM, Avg Gradient, Entropy, NIQE) % 评估每种方法 enhanced_he = he_method(low_light); [results(1,1), results(1,2), results(1,3), results(1,4), results(1,5)] = evaluate_image(enhanced_he, reference); enhanced_bimef = bimef(low_light); [results(2,1), results(2,2), results(2,3), results(2,4), results(2,5)] = evaluate_image(enhanced_bimef, reference); enhanced_lime = lime_method(low_light); [results(3,1), results(3,2), results(3,3), results(3,4), results(3,5)] = evaluate_image(enhanced_lime, reference); enhanced_msrcr = msrcr_method(low_light); [results(4,1), results(4,2), results(4,3), results(4,4), results(4,5)] = evaluate_image(enhanced_msrcr, reference); enhanced_proposed = hsv_svd_clahe(low_light); [results(5,1), results(5,2), results(5,3), results(5,4), results(5,5)] = evaluate_image(enhanced_proposed, reference); % 显示结果 fprintf('%-25s %8s %8s %12s %10s %10s\n', 'Method', 'PSNR', 'SSIM', 'Avg Gradient', 'Entropy', 'NIQE'); fprintf('-------------------------------------------------------------------------------\n'); for i = 1:5 fprintf('%-25s %8.2f %8.4f %12.4f %10.4f %10.4f\n', ... methods{i}, results(i,1), results(i,2), results(i,3), results(i,4), results(i,5)); end % 可视化结果 figure('Position', [100, 50, 1200, 800]); subplot(2,3,1); imshow(low_light); title('原始低照度图像'); subplot(2,3,2); imshow(enhanced_he); title('HE'); subplot(2,3,3); imshow(enhanced_bimef); title('BIMEF'); subplot(2,3,4); imshow(enhanced_lime); title('LIME'); subplot(2,3,5); imshow(enhanced_msrcr); title('MSRCR'); subplot(2,3,6); imshow(enhanced_proposed); title('HSV-SVD-CLAHE'); % ===================== 改进的本文方法 ===================== function enhanced_img = hsv_svd_clahe(img, beta, gamma, tau) % HSV_SVD_CLAHE 低照度图像增强算法 % 主要改进: % 1. 小波去噪处理泊松噪声 % 2. 自适应tau策略避免块状伪影 % 3. 参数优化 % 转换为HSV并计算平均亮度 img_double = im2double(img); hsv_img = rgb2hsv(img_double); V = hsv_img(:,:,3); mean_brightness = mean(V(:)); % 参数自适应调整 if nargin < 2 || isempty(beta) if mean_brightness < 0.2 % 极暗图像 beta = 3.2; gamma = 0.6; tau = 0.999; % 高阈值避免块状伪影 disp('参数模式: 极暗图像 (beta=3.2, gamma=0.6, tau=0.999)'); elseif mean_brightness < 0.5 % 低照度图像 beta = 2.5; gamma = 0.7; tau = 0.99; % 中等阈值 disp('参数模式: 低照度图像 (beta=2.5, gamma=0.7, tau=0.99)'); else % 正常图像 beta = 1.6; gamma = 0.85; tau = 0.95; % 较低阈值保留细节 disp('参数模式: 正常图像 (beta=1.6, gamma=0.85, tau=0.95)'); end end if nargin < 3 || isempty(gamma), gamma = 0.8; end if nargin < 4 || isempty(tau), tau = 0.999; end % 默认高阈值 % 奇异值分解 [U, S, V_svd] = svd(V, 'econ'); sigma = diag(S); total_energy = sum(sigma.^2); % 确定主次成分分界点 cum_energy_ratio = cumsum(sigma.^2) / total_energy; idx = find(cum_energy_ratio >= tau, 1); if isempty(idx), idx = numel(sigma); end % 主次成分差异化处理 sigma_enhanced = zeros(size(sigma)); sigma_enhanced(1:idx) = sigma(1:idx) * beta; % 主成分增强 sigma_enhanced(idx+1:end) = sigma(idx+1:end) * gamma; % 次成分抑制 % 重构亮度通道 V_enhanced = U * diag(sigma_enhanced) * V_svd'; V_enhanced = min(max(V_enhanced, 0), 1); % 重组HSV并转RGB hsv_enhanced = hsv_img; hsv_enhanced(:,:,3) = V_enhanced; rgb_enhanced = hsv2rgb(hsv_enhanced); % CLAHE增强 (Lab空间) lab_img = rgb2lab(rgb_enhanced); L = lab_img(:,:,1) / 100; L_clahe = adapthisteq(L, 'ClipLimit', 0.01, 'NumTiles', [8,8]); lab_img(:,:,1) = L_clahe * 100; enhanced_img = lab2rgb(lab_img, 'OutputType', 'double'); % 小波去噪(仅低照度图像) if mean_brightness < 0.5 try enhanced_img = wavelet_denoise(enhanced_img); disp('应用小波去噪'); catch ME warning('去噪步骤跳过: %s', ME.message); end end % 转换为uint8 enhanced_img = im2uint8(enhanced_img); end % ===================== 修正的小波去噪函数 ===================== function denoised_img = wavelet_denoise(img) % 小波去噪处理泊松噪声 % 使用参数: % Wavelet: sym8 (适合图像去噪) % Level: 3 (中等分解层次) % ThresholdRule: 'median' (修正为有效参数) % DenoisingMethod: 'Bayes' (贝叶斯去噪) % 初始化输出 denoised_img = zeros(size(img)); % 小波去噪参数 wavelet = 'sym8'; level = 3; % 对每个通道分别处理 for ch = 1:3 channel = img(:,:,ch); % 修正的阈值规则 - 使用有效的'median'选项 denoised_channel = wdenoise2(channel, level, ... 'Wavelet', wavelet, ... 'DenoisingMethod', 'Bayes', ... 'ThresholdRule', 'median', ... % 修正为有效参数 'NoiseEstimate', 'LevelDependent'); denoised_img(:,:,ch) = denoised_channel; end end % ===================== 评估函数 ===================== function [psnr_val, ssim_val, avg_grad, entropy_val, niqe_val] = evaluate_image(enhanced, reference) % 输入验证 if nargin < 2, reference = []; end % PSNR计算 if ~isempty(reference) && isequal(size(enhanced), size(reference)) psnr_val = psnr(enhanced, reference); ssim_val = ssim(enhanced, reference); else psnr_val = NaN; ssim_val = NaN; end % 平均梯度 gray_img = rgb2gray(im2double(enhanced)); [Gx, Gy] = imgradientxy(gray_img); avg_grad = mean(sqrt(Gx.^2 + Gy.^2), 'all'); % 信息熵 entropy_val = entropy(gray_img); % NIQE指标 niqe_val = niqe(enhanced); end % ===================== 其他方法保持不变 ===================== % 直方图均衡化 (HE) function enhanced = he_method(img) enhanced = histeq(img); end % BIMEF方法 function enhanced = bimef(img) % 读取彩色图像 img_double = im2double(img); gray_img = rgb2gray(img_double); log_img = log(1 + gray_img); % BIMEF 算法参数 filter_size = 5; step = 1; enhanced_img = zeros(size(log_img)); for i = step:step:size(log_img, 1)-filter_size+1 for j = step:step:size(log_img, 2)-filter_size+1 h = ones(filter_size, filter_size) / (filter_size^2); enhanced_img(i:i+filter_size-1, j:j+filter_size-1) = ... exp(h * log_img(i:i+filter_size-1, j:j+filter_size-1)); end end enhanced_img = (enhanced_img - min(enhanced_img(:))) / ... (max(enhanced_img(:)) - min(enhanced_img(:))); enhanced_img = uint8(255 * enhanced_img); % 转换为彩色 hsv_img = rgb2hsv(img_double); hsv_img(:, :, 3) = mat2gray(enhanced_img); enhanced = hsv2rgb(hsv_img); enhanced = im2uint8(enhanced); end % LIME方法 function enhanced = lime_method(img) img = im2double(img); T = max(img, [], 3); r = 16; eps = 0.01; L = imguidedfilter(T, img, 'NeighborhoodSize', [r r], 'DegreeOfSmoothing', eps); L = min(L, 1); L_adjusted = imadjust(L, [min(L(:)) max(L(:))], [0.2 1]); enhanced = zeros(size(img)); for ch = 1:3 enhanced(:,:,ch) = img(:,:,ch) ./ max(L_adjusted, 0.01); end enhanced = min(max(enhanced, 0), 1); enhanced = im2uint8(enhanced); end % MSRCR方法 function enhanced_img = msrcr_method(img) scales = [15, 80, 250]; alpha = 125; beta = 46; G = 5; img = im2double(img); msr = zeros(size(img)); for i = 1:numel(scales) sigma = scales(i); gaus_filter = fspecial('gaussian', 2*ceil(3*sigma)+1, sigma); for ch = 1:3 log_img = log(img(:,:,ch) + 1e-6); blurred = imfilter(img(:,:,ch), gaus_filter, 'symmetric'); log_blurred = log(blurred + 1e-6); msr(:,:,ch) = msr(:,:,ch) + (log_img - log_blurred)/numel(scales); end end color_restored = zeros(size(msr)); for ch = 1:3 I_ch = img(:,:,ch); col_sum = sum(img,3); color_restored(:,:,ch) = beta * (log(alpha*I_ch + 1) - log(col_sum + 1)); end enhanced_img = G * (0.5*msr + 0.5*color_restored); enhanced_img = (enhanced_img - min(enhanced_img(:))) / ... (max(enhanced_img(:)) - min(enhanced_img(:))); enhanced_img = im2uint8(enhanced_img); end
06-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值