✨ 长期致力于积分球、空间频域成像、光学特性参数、梨、快速无损检测研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)基于蒙特卡洛仿真与最小二乘支持向量回归的光学参数反演算法:
设计一种两空间频率的快速反演方法。使用蒙特卡洛前向仿真生成大量漫反射率数据,覆盖吸收系数μa范围0.01-1.0 mm^-1、约化散射系数μ‘s范围0.2-2.5 mm^-1,每个参数组合运行10^7个光子。选取空间频率fx=0 mm^-1和fx=0.25 mm^-1两个通道的漫反射率作为输入特征。采用LSSVR建立回归模型,核函数为径向基核,通过遗传算法优化正则化参数γ和核宽度σ。在液体仿体验证中,μa和μ’s的最大相对误差分别为6.2%和5.8%,计算速度达到每样本0.03秒,较传统16频率拟合法快32倍。对新鲜梨损伤检测,该方法计算的μ‘s图能清晰分辨0.1J冲击损伤区域,对比度达到3.8:1。
(2)单帧解调与人工神经网络联合的快速SFDI系统:
研制一套单拍空间频域成像系统,采用数字微镜器件投影单幅正弦条纹图案,相机同步采集单帧图像。解调算法基于希尔伯特变换提取调制成分,避免了传统三相位法需要的多帧采集。单帧解调的最佳空间频率经390个液体仿体优化确定为1/3 mm^-1。随后构建三层人工神经网络,输入为单帧解调得到的漫反射率比值,输出为μa和μ‘s。网络隐层节点数设为15,训练采用Levenberg-Marquardt算法。对梨样本测试,每个像素的计算时间仅0.5ms,整幅512x512图像的处理时间约0.26秒。该方法的μa检测重复性标准差小于0.015 mm^-1,且在检测新鲜损伤时,损伤与正常组织的μa差异达0.18 mm^-1,而原始灰度图差异仅为3个灰度级。
(3)相位测量轮廓术与SFDI融合的表面轮廓修正模型:
提出一种结合PMP三维形貌测量的光学参数修正方法。投影三组相移正弦条纹,通过四步相移法计算梨表面的高度图和角度图。建立三阶衰减指数函数描述漫反射率与表面高度的关系:R_corrected = R_measured * exp(-αh - βh^2 - γh^3),其中α、β、γ通过半球形仿体标定得到。角度修正采用Lambertian余弦定律。融合后的算法对半球形仿体测试,μa相对误差从修正前的15.2%下降到4.3%,μ’s相对误差从12.7%下降到5.1%。对真实梨样本,修正后正常区域的μ‘s标准差从0.17 mm^-1降至0.07 mm^-1,损伤区域边缘对比度提升40%。该方法实现了无需切片的完整梨无损检测。
import numpy as np from scipy.fftpack import fft2, ifft2 from sklearn.svm import SVR from sklearn.preprocessing import StandardScaler import mcubes class MC_LSSVR_Inverter: def __init__(self): self.scaler_mua = StandardScaler() self.scaler_musp = StandardScaler() self.scaler_Rd = StandardScaler() self.svr_mua = SVR(kernel='rbf', gamma='auto') self.svr_musp = SVR(kernel='rbf', gamma='auto') def monte_carlo_forward(self, mua, musp, n_photons=1e6): g = 0.9 mus = musp / (1 - g) # simplified MC simulation (real implementation would be more complex) Rd = 0.5 * np.exp(-3 * np.sqrt(mua * musp) * 2) return Rd def generate_training_data(self, n_samples=1000): mua_vals = np.random.uniform(0.01, 1.0, n_samples) musp_vals = np.random.uniform(0.2, 2.5, n_samples) Rd_vals = np.array([self.monte_carlo_forward(m, s) for m,s in zip(mua_vals, musp_vals)]) return mua_vals, musp_vals, Rd_vals def train(self): mua, musp, Rd = self.generate_training_data(2000) Rd_scaled = self.scaler_Rd.fit_transform(Rd.reshape(-1,1)) self.svr_mua.fit(Rd_scaled, mua) self.svr_musp.fit(Rd_scaled, musp) def predict(self, Rd_meas): Rd_scaled = self.scaler_Rd.transform(Rd_meas.reshape(-1,1)) mua_pred = self.svr_mua.predict(Rd_scaled) musp_pred = self.svr_musp.predict(Rd_scaled) return mua_pred, musp_pred class SingleShotSFDI: def __init__(self, fx=1/3.0): self.fx = fx self.ann = self.build_ann() def build_ann(self): from sklearn.neural_network import MLPRegressor return MLPRegressor(hidden_layer_sizes=(15,), activation='tanh', solver='lbfgs', max_iter=500) def demodulate_single_frame(self, image): # Hilbert transform based demodulation f = fft2(image) rows, cols = image.shape u0 = int(self.fx * cols) f_hilbert = np.zeros_like(f, dtype=complex) for i in range(rows): f_hilbert[i, u0] = 2 * f[i, u0] demod = np.abs(ifft2(f_hilbert)) return demod def train_ann(self, X, y_mua, y_musp): # X: [demod_ratio] for two frequencies (fx=0 and fx=1/3) self.ann.fit(X, np.column_stack([y_mua, y_musp])) def predict_optical(self, demod_ratio): return self.ann.predict(demod_ratio.reshape(1,-1)) class PMP_Correction: def __init__(self): self.alpha, self.beta, self.gamma = 0.12, 0.03, 0.008 def compute_height_phase(self, images_3freq): # four-step phase shifting I1, I2, I3, I4 = images_3freq phase = np.arctan2(I4 - I2, I1 - I3) height = phase * 0.05 # calibration factor return height def lambertian_correction(self, reflectance, angle_map): return reflectance / np.maximum(np.cos(angle_map), 0.1) def height_attenuation(self, reflectance, height): atten = np.exp(-self.alpha * height - self.beta * height**2 - self.gamma * height**3) return reflectance / np.maximum(atten, 0.01) def correct_all(self, rd_map, height_map, angle_map): rd_h = self.height_attenuation(rd_map, height_map) rd_corrected = self.lambertian_correction(rd_h, angle_map) return rd_corrected def demo_integration(): # load demo data (simulated) rd_fx0 = np.random.rand(256,256) * 0.3 + 0.1 rd_fx025 = np.random.rand(256,256) * 0.2 + 0.05 inverter = MC_LSSVR_Inverter() inverter.train() mua_map = np.zeros_like(rd_fx0) musp_map = np.zeros_like(rd_fx0) for i in range(256): for j in range(256): Rd_comb = np.array([rd_fx0[i,j], rd_fx025[i,j]]) mua, musp = inverter.predict(Rd_comb) mua_map[i,j] = mua[0] musp_map[i,j] = musp[0] return mua_map, musp_map