mat2gray、interp1

本文介绍了MATLAB中用于图像处理的函数mat2gray及im2uint8的工作原理,解释了如何将数值映射到特定区间,并探讨了利用interp1进行图像插值的方法及其应用场景。

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

p26:

“函数mat2gray会将值限定在[0,1]范围内”,我的理解是该函数会自动检测输入的值的类型,0对应该类型的最小值,1对应该类型的最大值,将该数值进行变换。

例如输入uint8类型的数字(范围为0-255),该函数就会自动将0对应0,1对应255来进行变换。

im2uint8也同理。


p27:

interp1(z,T,f)

该函数的z与T为长度相同的列向量,他们其中的值一一对应。

例如z数组为:[1 2 3 4 5 6] 

T数组为:[0 20 60 68 77 100]

则1对应0,2对应20,3对应60,4对应68,5对应77,6对应100,通过该对应来对图像f进行变换。如原图像中灰度值在0至20的,线性变换为1至2;而20至60的,线性变换为2至3。


linspace(a,b,numel(T))

a为起始值,b为结束值,numel函数可获取数组的元素个数。该函数会根据T数组的元素个数来对a至b的值进行等距分割。

例如t为6元素的数组,a=0,b=1,该函数会输出[0 0.2 0.4 0.6 0.8 1]。

% 基于COMSOL材料设置与信号的k-Wave声成像仿真示例 % 结构:背景脂肪(1450m/s, 911kg/m^3),中心方块肌肉(1580m/s, 1090kg/m^3) % 激励信号为COMSOL导出txt(两列:时间[s], 声压[Pa]) %% ========== 1. 读取COMSOL信号 ========== data = load('comsol_signal_liver.txt'); % txt两列,[时间(s), 声压(Pa)] t_comsol = data(:,1); p_comsol = data(:,2); % 取平均时间步长,确保k-Wave仿真与信号对齐 dt_kwave = mean(diff(t_comsol)); % [s] Nt = length(t_comsol); % 如需插值到更高采样率,可用interp1 %% ========== 2. 仿真区域与网格 ========== Lx = 20e-3; % x方向长度40mm Ly = 40e-3; % y方向长度40mm Nx = 200; % x方向网格数 Ny = 200; % y方向网格数 dx = Lx/Nx; dy = Ly/Ny; kgrid = kWaveGrid(Nx, dx, Ny, dy); kgrid.setTime(Nt, dt_kwave); %% ========== 3. 材料参数设置 ========== % 背景:脂肪 c_fat = 1450; % [m/s] rho_fat = 911; % [kg/m^3] % 方形目标:肌肉 c_liver= 1540; % [m/s] rho_liver = 1079;% [kg/m^3] medium.sound_speed = c_fat * ones(Nx,Ny); medium.density = rho_fat * ones(Nx,Ny); % 设置中心方形肌肉区 liver_width = 1.5e-3; % 1mm liver_height = 1e-3; % 1.5mm cx = round(Nx/2); cy = round(Ny/2); half_w = round(liver_width/(2*dx)); half_h = round(liver_height/(2*dy)); x_rng = (cx-half_w):(cx+half_w); y_rng = (cy-half_h):(cy+half_h); medium.sound_speed(x_rng, y_rng) = c_liver; medium.density(x_rng, y_rng) = rho_liver; % 可选:设置吸收 medium.alpha_coeff = 0.75; % [dB/(MHz*cm)] medium.alpha_power = 1.5; %% ========== 4. 声源设置 ========== % 激励点放在左侧正中央 src_y = round(Ny*0.05); src_x = round(Nx/2); source.p_mask = zeros(Nx,Ny); source.p_mask(src_x,src_y) = 1; source.p = p_comsol(:)'; % 行向量, [1,Nt] %% ========== 5. 传感器设置(全场成像) ========== sensor.mask = ones(Nx,Ny); % 采集全场 % 若内存不足,可采集某一面 %% ========== 6. 启动仿真 ========== input_args = {'PMLInside', false, 'PlotPML', false, 'DataCast', 'single'}; sensor_data = kspaceFirstOrder2D(kgrid, medium, source, sensor, input_args{:}); save('kwave_imaging_result.mat','sensor_data','-v7.3'); %% ========== 7. 后处理与成像 ========== if isstruct(sensor_data) && isfield(sensor_data, 'p') data_p = sensor_data.p; % [点数, 时间] else error('sensor_data中未找到p字段'); end % 取最大值投影(即反射最大声压,突出目标边界) proj = reshape(max(abs(data_p),[],2), Nx, Ny); figure; imagesc((1:Nx)*dx*1e3, (1:Ny)*dy*1e3, proj'); axis image; colorbar; colormap(gray); % 灰度 xlabel('x [mm]'); ylabel('y [mm]'); title('k-Wave成像最大值投影(中心为liver方块)'); set(gca,'YDir','normal'); % 对数压缩提升对比度 figure; imagesc((1:Nx)*dx*1e3, (1:Ny)*dy*1e3, log10(proj'+eps)); axis image; colorbar; colormap(gray); % 灰度 xlabel('x [mm]'); ylabel('y [mm]'); title('k-Wave成像对数压缩(中心为liver方块)'); set(gca,'YDir','normal'); %% ========== 8. ARFPSF曲线绘制 ========== % ARF: 取中心x处的y方向曲线 center_x = round(Nx/2); arf_curve = proj(:, center_x); arf_curve = arf_curve / max(arf_curve); figure; plot((1:Ny)*dy*1e3, arf_curve, 'LineWidth', 1.5); xlabel('y [mm]'); ylabel('Normalized ARF'); title('Normalized ARF (Point Target)'); grid on; % PSF: 取中心y处的x方向曲线 center_y = round(Ny/2); psf_curve = proj(:, center_y); psf_curve = psf_curve / max(psf_curve); % 归一化到0~1 figure; plot((1:Nx)*dx*1e3, psf_curve, 'LineWidth', 1); xlabel('x [mm]'); ylabel('Normalized PSF'); title('Normalized PSF (Point Target)'); grid on;。该代码执行后提示错误使用 liver (第 77 行) sensor_data中未找到p字段。提示该错误该如何解决,请给出修正后的完整代码
最新发布
07-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值