【matlab】=size(img)的其中两种用法&zeros( )

本文介绍了使用Matlab进行图像处理的基础操作,包括读取图片、转换颜色空间、获取图片尺寸等基本步骤。同时,还涉及了如何利用Matlab创建零矩阵以备后续处理之用。

i1=imread('D:\Work\1.png');

i1=rgb2gray(i1);

 

[m,n]=size(i1);

返回图片的尺寸信息, 并存储在m、n中。其中m中存储的是行数,n中存储的是列数。(要是数组就求出其m*n,要是照片的话就是求出其像素大小!)

 
 

i3=zeros(size(i1));
 
对于一个矩阵A,size(A)表示求A的行数和列数。
设m,n是正整数,zeros(m,n)表示生成一个mxn的零矩阵。
y=zeros(size(x))表示生成一个和x同样大小的的矩阵y。
 

转载于:https://www.cnblogs.com/wxl845235800/p/6682910.html

%% 集成化区域分割脚本:region_segmentation.m clear all close all clc % 阶段1:图像加载与预处理 try orig_img = imread('a.png'); if isempty(orig_img) error('图像加载失败'); end gray_img = im2double(rgb2gray(orig_img)); catch ME fprintf('错误: %s\n', ME.message); return; end % 阶段2:动态种子区域生长 % 参数设置 grad_th = 0.05; % 梯度阈值 seed_dist = 15; % 种子点最小间距 grow_th = 0.2; % 生长阈值 % 计算梯度图 [Gx, Gy] = imgradientxy(gray_img); grad_mag = sqrt(Gx.^2 + Gy.^2); % 自动种子点检测 seed_map = zeros(size(gray_img)); for i = 1:seed_dist:size(gray_img,1) for j = 1:seed_dist:size(gray_img,2) % 在低梯度区域选择种子 local_region = grad_mag(max(1,i-2):min(end,i+2), max(1,j-2):min(end,j+2)); if mean(local_region(:)) < grad_th seed_map(i,j) = 1; end end end [seed_y, seed_x] = find(seed_map); % 区域生长核心逻辑 grown_regions = zeros(size(gray_img)); for k = 1:length(seed_x) current_seed = [seed_y(k), seed_x(k)]; seed_value = gray_img(current_seed(1), current_seed(2)); % 初始化生长队列 queue = current_seed; visited = zeros(size(gray_img)); while ~isempty(queue) % 提取当前像素 [y, x] = deal(queue(1,1), queue(1,2)); queue(1,:) = []; % 生长条件判断 if visited(y,x) == 0 && abs(gray_img(y,x) - seed_value) < grow_th grown_regions(y,x) = 1; visited(y,x) = 1; % 扩展邻域 neighbors = [y-1 x; y+1 x; y x-1; y x+1]; valid_idx = all(neighbors > 0, 2) & neighbors(:,1) <= size(gray_img,1) & neighbors(:,2) <= size(gray_img,2); queue = [queue; neighbors(valid_idx,:)]; end end end % 阶段3:四叉树分裂合并 % 参数设置 split_th = 0.05; % 分裂阈值 merge_th = 0.03; % 合并阈值 % 初始化四叉树结构 quad_stack = {gray_img}; final_regions = zeros(size(gray_img)); % 分裂阶段 while ~isempty(quad_stack) current_block = quad_stack{end}; quad_stack(end) = []; % 计算块特征 block_mean = mean(current_block(:)); block_var = var(current_block(:)); if block_var > split_th && size(current_block,1) > 8 % 执行四等分 [sub1, sub2, sub3, sub4] = split_quad(current_block); quad_stack = [quad_stack, {sub1, sub2, sub3, sub4}]; else % 记录最终块 [y1, x1] = find(final_regions == 0, 1); block_size = size(current_block,1); final_regions(y1:y1+block_size-1, x1:x1+block_size-1) = block_mean; end end % 合并阶段 merged_img = final_regions; for i = 1:2:size(merged_img,1)-1 for j = 1:2:size(merged_img,2)-1 % 检查相邻块相似性 current_block = merged_img(i:i+1,j:j+1); if max(current_block(:)) - min(current_block(:)) < merge_th merged_img(i:i+1,j:j+1) = mean(current_block(:)); end end end % 阶段4:可视化结果 figure('Name','区域分割对比', 'Position',[100 100 1200 800]) subplot(2,3,1), imshow(orig_img), title('原始图像') subplot(2,3,2), imshow(gray_img), title('灰度图像') subplot(2,3,3), imshow(seed_map), title('动态种子点分布') subplot(2,3,4), imshow(grown_regions), title('区域生长结果') subplot(2,3,5), imshow(merged_img), title('四叉树分割') subplot(2,3,6), imshowpair(grown_regions, merged_img), title('方法对比') % 四叉分裂辅助模块 function [q1,q2,q3,q4] = split_quad(img_block) mid_y = floor(size(img_block,1)/2); mid_x = floor(size(img_block,2)/2); q1 = img_block(1:mid_y, 1:mid_x); q2 = img_block(1:mid_y, mid_x+1:end); q3 = img_block(mid_y+1:end, 1:mid_x); q4 = img_block(mid_y+1:end, mid_x+1:end); end四叉树分割实现出来全黑,重新编写四叉树部分的代码
06-04
再加入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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值