文章目录一、去模糊反卷积RL二、去条纹FFT频域滤波三、去暗角四、去噪算法1、传统去噪算法均值滤波、中值滤波、双边滤波、非局部均值去噪2、自适应方向保持去噪方向性结构张量 方向性高斯加权滤波3、DnCNN去噪卷积神经网络PyTorch五、超分1、fairSIM一种快速而温和的超分辨率方法显著提升图像分辨率2、RCAN使用非常深的残差通道注意力网络实现图像超分辨率一、去模糊反卷积RL【PyTorch项目实战】反卷积Deconvolution概述Richardson-Lucy (RL) 反卷积算法 —— 通过不断迭代更新图像估计值二、去条纹FFT频域滤波去条纹算法 —— 兼容自然图像与荧光图像的频域滤波方法FFT三、去暗角去暗角算法四、去噪算法方法计算复杂度边缘保留性适用场景均值滤波低弱快速预处理中值滤波中中椒盐噪声双边滤波高强一般图像非局部均值高强工业/科研图像DnCNN中优高斯/未知噪声通用1、传统去噪算法均值滤波、中值滤波、双边滤波、非局部均值去噪# -*- coding: utf-8 -*- 图像去噪示例传统算法 涵盖均值滤波、中值滤波、双边滤波、非局部均值去噪 importcv2importnumpyasnpimportmatplotlib.pyplotasplt# 设置中文显示支持plt.rcParams[font.sans-serif][SimHei]plt.rcParams[axes.unicode_minus]False# 1. 读取图像 imgcv2.imread(../image/image.jpg)# 按默认路径读取图像imgcv2.cvtColor(img,cv2.COLOR_BGR2RGB)# 转换为RGB便于Matplotlib显示# 2. 添加模拟高斯噪声用于演示 noisenp.random.normal(0,25,img.shape)# 生成均值0、方差25的高斯噪声noisy_imgnp.clip(imgnoise,0,255).astype(np.uint8)# 添加并裁剪到合法范围# 3. 均值滤波 mean_denoisedcv2.blur(noisy_img,(5,5))# 5×5均值滤波核# 4. 中值滤波 median_denoisedcv2.medianBlur(noisy_img,5)# 5×5中值滤波核# 5. 双边滤波 bilateral_denoisedcv2.bilateralFilter(noisy_img,9,75,75)# 参数9为邻域直径75/75为颜色空间和坐标空间的高斯标准差# 6. 非局部均值去噪 nlm_denoisedcv2.fastNlMeansDenoisingColored(noisy_img,None,10,10,7,21)# 参数hColor/hLuminance10, templateWindowSize7, searchWindowSize21# 7. 可视化结果 titles[原图,加噪图,均值滤波,中值滤波,双边滤波,非局部均值]images[img,noisy_img,mean_denoised,median_denoised,bilateral_denoised,nlm_denoised]plt.figure(figsize(12,8))foriinrange(6):plt.subplot(2,3,i1)plt.imshow(images[i])plt.title(titles[i])plt.axis(off)plt.tight_layout()plt.show()2、自适应方向保持去噪方向性结构张量 方向性高斯加权滤波算法核心思想使用结构张量估计局部主方向与各向异性程度根据主方向自适应构造方向性高斯/双边滤波核或方向性加权窗在主方向上保持细节低平滑垂直方向上增强平滑在噪声较强或各向同性区域退化为普通去噪例如NLM或双边以保证稳定性对SEM单通道图像优化参数并提供调参建议。算法优点保留纤维状/条纹状微结构SEM常见抑制颗粒噪声可结合多尺度pyramid增强鲁棒性。参数说明与调参建议针对SEM场景sigma_grad结构张量平滑尺度建议在0.5~2.0之间调节。SEM细节极细时取较小值0.6左右噪声强时可适当增大。sigma_par_min / sigma_par_max用于在低/高各向异性之间插值的平行方向sigma。越小则在主方向上越保留细节推荐范围[0.4,2.5]。sigma_perp_ratio垂直方向相对于平行方向的放大倍数典型取值2~5SEM中建议3左右以加强纵向平滑。radius滤波半径影响计算复杂度与局部上下文建议5~9。aniso_thresh各向异性阈值当局部结构不明显时退化到各向同性去噪避免误估方向导致伪影建议0.08~0.2。# -*- coding: utf-8 -*- SEM自适应方向保持去噪方向性结构张量 方向性高斯加权滤波 说明 - 默认读取路径: ../image/image.jpg - 面向单通道灰度图SEM常用 - 每一行均带有中文注释便于教学与出版 importcv2# 导入OpenCV库用于图像I/O与基础操作importnumpyasnp# 导入NumPy用于数值计算fromscipyimportndimageasndi# 导入scipy.ndimage用于高阶滤波与插值importmath# 导入math用于数学函数defcompute_structure_tensor(img,sigma1.0):# 计算输入图像的结构张量并返回张量分量Jxx,Jxy,Jyy# 参数:# img: float32 灰度图取值范围[0,255]或[0,1]# sigma: 用于计算梯度前的高斯平滑尺度Iimg.astype(np.float32)# 将图像转换为float32以确保数值精度I_smoothndi.gaussian_filter(I,sigma)# 先按照sigma对图像进行高斯平滑以降低噪声对梯度的影响Ixndi.sobel(I_smooth,axis1,modereflect)# 计算水平方向梯度x方向Iyndi.sobel(I_smooth,axis0,modereflect)# 计算垂直方向梯度y方向JxxIx*Ix# 结构张量分量J_xx I_x^2JxyIx*Iy# 结构张量分量J_xy I_x * I_yJyyIy*Iy# 结构张量分量J_yy I_y^2# 对结构张量分量再做一个较大尺度的高斯平滑以得到局部统计量Jxxndi.gaussian_filter(Jxx,sigma*2.0)# Jxx局部平滑Jxyndi.gaussian_filter(Jxy,sigma*2.0)# Jxy局部平滑Jyyndi.gaussian_filter(Jyy,sigma*2.0)# Jyy局部平滑returnJxx,Jxy,Jyy# 返回三个分量供后续特征计算deftensor_orientation_anisotropy(Jxx,Jxy,Jyy,eps1e-12):# 从结构张量分量计算主方向角theta弧度和各向异性度aniso0~1# 参数:# Jxx,Jxy,Jyy: 结构张量分量traceJxxJyy# 计算迹tracedetJxx*Jyy-Jxy*Jxy# 计算行列式determinant# 计算特征值lambda1 lambda2tmpnp.sqrt(np.maximum((Jxx-Jyy)**24.0*Jxy*Jxy,0.0))# 特征值计算的中间项lambda10.5*(tracetmp)# 较大特征值lambda20.5*(trace-tmp)# 较小特征值# 各向异性度定义为 (lambda1 - lambda2) / (lambda1 lambda2 eps)aniso(lambda1-lambda2)/(lambda1lambda2eps)# 归一化的各向异性度越接近1越方向性明显# 计算主方向角theta 0.5 * atan2(2*Jxy, Jxx - Jyy)theta0.5*np.arctan2(2.0*Jxy,(Jxx-Jyyeps))# 主方向角范围约为(-pi/2,pi/2)returntheta,aniso# 返回角度与各向异性度defdirectional_kernel(radius,sigma_parallel,sigma_perp,angle):# 构造一个在给定角度处的方向性高斯核未归一化# 参数:# radius: 核半径像素# sigma_parallel: 平行于主方向的高斯标准差保留更多细节时取较小值# sigma_perp: 垂直于主方向的高斯标准差垂直方向加大平滑# angle: 主方向角弧度diameter2*radius1# 计算核直径ys,xsnp.mgrid[-radius:radius1,-radius:radius1]# 生成网格坐标# 将网格坐标旋转到主方向坐标系cos_amath.cos(angle)# 计算cos(angle)sin_amath.sin(angle)# 计算sin(angle)x_rotcos_a*xssin_a*ys# 旋转后的x坐标平行方向y_rot-sin_a*xscos_a*ys# 旋转后的y坐标垂直方向# 方向性高斯在平行方向使用sigma_parallel垂直方向使用sigma_perpkernnp.exp(-0.5*((x_rot**2)/(sigma_parallel**21e-12)(y_rot**2)/(sigma_perp**21e-12)))kern/(np.sum(kern)1e-12)# 归一化核使权重和为1returnkern# 返回方向性高斯核defadaptive_directional_denoise(img,radius7,sigma_grad1.0,sigma_par_min0.5,sigma_par_max2.5,sigma_perp_ratio3.0,aniso_thresh0.15):# 对输入灰度图执行自适应方向性去噪# 参数:# img: np.ndarray 单通道灰度图dtypeu8或float32# radius: 局部方向性滤波核半径# sigma_grad: 用于结构张量的平滑尺度# sigma_par_min/sigma_par_max: 平行方向sigma的范围# sigma_perp_ratio: 垂直方向sigma sigma_parallel * sigma_perp_ratio# aniso_thresh: 各向异性阈值当aniso小于此值时使用非方向性退化策略Iimg.astype(np.float32)# 将图像转为float32用于计算Jxx,Jxy,Jyycompute_structure_tensor(I,sigmasigma_grad)# 计算结构张量分量theta,anisotensor_orientation_anisotropy(Jxx,Jxy,Jyy)# 计算每像素主方向与各向异性度h,wI.shape# 获取图像高宽outputnp.zeros_like(I)# 初始化输出图像数组padradius# 填充大小等于半径I_paddednp.pad(I,pad,modereflect)# 对图像进行反射填充以便边界处理theta_paddednp.pad(theta,pad,modereflect)# 对角度图做相同填充aniso_paddednp.pad(aniso,pad,modereflect)# 对各向异性图做相同填充# 逐像素应用方向性滤波可向量化或分块加速此处为清晰易懂的实现foryinrange(h):# 遍历图像每一行像素forxinrange(w):# 遍历图像每一列像素yyypad# 计算填充后对应y坐标xxxpad# 计算填充后对应x坐标local_thetafloat(theta_padded[yy,xx])# 读取局部主方向角local_anisofloat(aniso_padded[yy,xx])# 读取局部各向异性度# 根据各向异性度线性插值选择平行方向sigma强方向性时使用小sigma以保留细节sigma_parsigma_par_max-(sigma_par_max-sigma_par_min)*local_aniso sigma_perpsigma_par*sigma_perp_ratio# 垂直方向sigma通常大于平行方向# 当局部各向异性低于阈值时退化到非方向性快速去噪例如使用局部均值或高斯iflocal_anisoaniso_thresh:# 提取方形邻域并直接使用高斯权重做平滑patchI_padded[yy-pad:yypad1,xx-pad:xxpad1]# 提取方形补丁# 构造各向同性高斯核ys,xsnp.mgrid[-pad:pad1,-pad:pad1]# 局部坐标网格iso_kernnp.exp(-0.5*((xs**2ys**2)/((sigma_par*sigma_perp_ratio)**21e-12)))iso_kern/(np.sum(iso_kern)1e-12)# 归一化valnp.sum(patch*iso_kern)# 加权求和得到中心像素的值output[y,x]val# 写入输出像素else:# 构建方向性核并应用到局部补丁kerndirectional_kernel(pad,sigma_par,sigma_perp,local_theta)# 方向性核patchI_padded[yy-pad:yypad1,xx-pad:xxpad1]# 提取对应补丁valnp.sum(patch*kern)# 使用方向性核加权求和output[y,x]val# 写入输出像素returnnp.clip(output,0.0,255.0).astype(np.uint8)# 裁剪并返回uint8图像if__name____main__:# 演示部分读取图像添加合成噪声并进行方向性去噪img_pathrD:\py\line\image.png# 默认图像路径遵循项目约定img_bgrcv2.imread(img_path,cv2.IMREAD_UNCHANGED)# 读取图像可能为16位或8位ifimg_bgrisNone:# 检查图像是否成功读取raiseFileNotFoundError(f无法读取图像:{img_path})# 抛出文件未找到错误# 若图像为彩色或多通道转换为灰度SEM一般为灰度图ifimg_bgr.ndim3andimg_bgr.shape[2]3:img_graycv2.cvtColor(img_bgr,cv2.COLOR_BGR2GRAY)# 转为灰度else:img_grayimg_bgr.copy()# 直接复制单通道图像# 将任何16位图像缩放到8位以便处理若需要保留高位精度可修改此处ifimg_gray.dtypenp.uint16:img_gray(img_gray/256).astype(np.uint8)# 将16位下采样到8位# 为演示添加合成高斯噪声真实SEM数据通常直接使用原图sigma_demo15# 合成噪声的标准差像素值层面noisenp.random.randn(*img_gray.shape)*sigma_demo# 生成高斯噪声noisynp.clip(img_gray.astype(np.float32)noise,0,255).astype(np.uint8)# 得到加噪图# 调用自适应方向性去噪函数denoisedadaptive_directional_denoise(noisy,radius7,sigma_grad1.0,sigma_par_min0.6,sigma_par_max2.0,sigma_perp_ratio3.0,aniso_thresh0.12)# 使用plt显示图像importmatplotlib.pyplotasplt# 设置中文显示支持plt.rcParams[font.sans-serif][SimHei]plt.rcParams[axes.unicode_minus]False# 显示原图plt.subplot(1,3,1)plt.imshow(img_gray,cmapgray)plt.title(原图)plt.axis(off)# 显示加噪图plt.subplot(1,3,2)plt.imshow(noisy,cmapgray)plt.title(加噪图)plt.axis(off)# 显示去噪图plt.subplot(1,3,3)plt.imshow(denoised,cmapgray)plt.title(去噪图)plt.axis(off)# 显示图像plt.show()3、DnCNN去噪卷积神经网络PyTorchDnCNNDenoising Convolutional Neural Network是一种基于卷积神经网络的图像去噪算法由张凯平等人在2017年提出。其核心思想是利用深层卷积网络直接学习从噪声图像到“噪声成分”的映射关系再通过将预测出的噪声从原图中减去得到干净图像。采用残差学习Residual Learning策略使网络更易于训练结合批归一化Batch Normalization来加速收敛与稳定训练过程。该模型可同时处理高斯噪声去除、JPEG压缩伪影消除以及盲去噪等任务表现优于传统滤波方法如BM3D代表了深度学习在图像去噪领域的典型应用。网络结构较轻可在CPU上运行。channels3输入必须是RGB等三通道图像# -*- coding: utf-8 -*- 基于PyTorch的DnCNN图像去噪实现 importtorchimporttorch.nnasnnimporttorch.nn.functionalasFimporttorchvision.transformsasTfromPILimportImageimportnumpyasnpimportmatplotlib.pyplotasplt# 1. 定义DnCNN网络结构 classDnCNN(nn.Module):def__init__(self,channels3,num_layers17):super(DnCNN,self).__init__()layers[]# 第一层卷积 ReLUlayers.append(nn.Conv2d(channels,64,kernel_size3,padding1,biasFalse))layers.append(nn.ReLU(inplaceTrue))# 中间层卷积 BN ReLUfor_inrange(num_layers-2):layers.append(nn.Conv2d(64,64,kernel_size3,padding1,biasFalse))layers.append(nn.BatchNorm2d(64))layers.append(nn.ReLU(inplaceTrue))# 最后一层卷积输出噪声残差layers.append(nn.Conv2d(64,channels,kernel_size3,padding1,biasFalse))self.dncnnnn.Sequential(*layers)defforward(self,x):outself.dncnn(x)returnx-out# 输出为去噪后的图像原图减去预测噪声# 2. 图像预处理函数 defpreprocess(img_path):imgImage.open(img_path).convert(RGB)# 打开并转换为RGBtransformT.Compose([T.ToTensor()])# 转换为张量格式[0,1]img_tensortransform(img).unsqueeze(0)# 增加batch维度returnimg,img_tensor# 3. 添加噪声函数 defadd_gaussian_noise(img_tensor,sigma25):noisetorch.randn_like(img_tensor)*(sigma/255.0)noisytorch.clamp(img_tensornoise,0.,1.)returnnoisy# 4. 推理流程 devicetorch.device(cudaiftorch.cuda.is_available()elsecpu)modelDnCNN().to(device)model.eval()# 推理模式# 加载图像img,cleanpreprocess(../image/image.jpg)noisyadd_gaussian_noise(clean)# 输入模型withtorch.no_grad():denoisedmodel(noisy.to(device)).cpu()# 转换为可显示图像to_pilT.ToPILImage()noisy_imgto_pil(noisy.squeeze())denoised_imgto_pil(denoised.squeeze())# 5. 可视化对比 plt.figure(figsize(10,4))plt.subplot(1,3,1)plt.imshow(img)plt.title(原图)plt.axis(off)plt.subplot(1,3,2)plt.imshow(noisy_img)plt.title(加噪图)plt.axis(off)plt.subplot(1,3,3)plt.imshow(denoised_img)plt.title(去噪结果DnCNN)plt.axis(off)plt.tight_layout()plt.show()五、超分1、fairSIM一种快速而温和的超分辨率方法显著提升图像分辨率fairSIM一种快速而温和的超分辨率方法显著提升图像分辨率2、RCAN使用非常深的残差通道注意力网络实现图像超分辨率【PyTorch项目实战】超分RCAN使用非常深的残差通道注意力网络实现图像超分辨率 —— 自研解决了RCAN恢复图像的模糊性
【图像增强】去条纹 + 去暗角 + 去模糊 + 去噪 + 超分
文章目录一、去模糊反卷积RL二、去条纹FFT频域滤波三、去暗角四、去噪算法1、传统去噪算法均值滤波、中值滤波、双边滤波、非局部均值去噪2、自适应方向保持去噪方向性结构张量 方向性高斯加权滤波3、DnCNN去噪卷积神经网络PyTorch五、超分1、fairSIM一种快速而温和的超分辨率方法显著提升图像分辨率2、RCAN使用非常深的残差通道注意力网络实现图像超分辨率一、去模糊反卷积RL【PyTorch项目实战】反卷积Deconvolution概述Richardson-Lucy (RL) 反卷积算法 —— 通过不断迭代更新图像估计值二、去条纹FFT频域滤波去条纹算法 —— 兼容自然图像与荧光图像的频域滤波方法FFT三、去暗角去暗角算法四、去噪算法方法计算复杂度边缘保留性适用场景均值滤波低弱快速预处理中值滤波中中椒盐噪声双边滤波高强一般图像非局部均值高强工业/科研图像DnCNN中优高斯/未知噪声通用1、传统去噪算法均值滤波、中值滤波、双边滤波、非局部均值去噪# -*- coding: utf-8 -*- 图像去噪示例传统算法 涵盖均值滤波、中值滤波、双边滤波、非局部均值去噪 importcv2importnumpyasnpimportmatplotlib.pyplotasplt# 设置中文显示支持plt.rcParams[font.sans-serif][SimHei]plt.rcParams[axes.unicode_minus]False# 1. 读取图像 imgcv2.imread(../image/image.jpg)# 按默认路径读取图像imgcv2.cvtColor(img,cv2.COLOR_BGR2RGB)# 转换为RGB便于Matplotlib显示# 2. 添加模拟高斯噪声用于演示 noisenp.random.normal(0,25,img.shape)# 生成均值0、方差25的高斯噪声noisy_imgnp.clip(imgnoise,0,255).astype(np.uint8)# 添加并裁剪到合法范围# 3. 均值滤波 mean_denoisedcv2.blur(noisy_img,(5,5))# 5×5均值滤波核# 4. 中值滤波 median_denoisedcv2.medianBlur(noisy_img,5)# 5×5中值滤波核# 5. 双边滤波 bilateral_denoisedcv2.bilateralFilter(noisy_img,9,75,75)# 参数9为邻域直径75/75为颜色空间和坐标空间的高斯标准差# 6. 非局部均值去噪 nlm_denoisedcv2.fastNlMeansDenoisingColored(noisy_img,None,10,10,7,21)# 参数hColor/hLuminance10, templateWindowSize7, searchWindowSize21# 7. 可视化结果 titles[原图,加噪图,均值滤波,中值滤波,双边滤波,非局部均值]images[img,noisy_img,mean_denoised,median_denoised,bilateral_denoised,nlm_denoised]plt.figure(figsize(12,8))foriinrange(6):plt.subplot(2,3,i1)plt.imshow(images[i])plt.title(titles[i])plt.axis(off)plt.tight_layout()plt.show()2、自适应方向保持去噪方向性结构张量 方向性高斯加权滤波算法核心思想使用结构张量估计局部主方向与各向异性程度根据主方向自适应构造方向性高斯/双边滤波核或方向性加权窗在主方向上保持细节低平滑垂直方向上增强平滑在噪声较强或各向同性区域退化为普通去噪例如NLM或双边以保证稳定性对SEM单通道图像优化参数并提供调参建议。算法优点保留纤维状/条纹状微结构SEM常见抑制颗粒噪声可结合多尺度pyramid增强鲁棒性。参数说明与调参建议针对SEM场景sigma_grad结构张量平滑尺度建议在0.5~2.0之间调节。SEM细节极细时取较小值0.6左右噪声强时可适当增大。sigma_par_min / sigma_par_max用于在低/高各向异性之间插值的平行方向sigma。越小则在主方向上越保留细节推荐范围[0.4,2.5]。sigma_perp_ratio垂直方向相对于平行方向的放大倍数典型取值2~5SEM中建议3左右以加强纵向平滑。radius滤波半径影响计算复杂度与局部上下文建议5~9。aniso_thresh各向异性阈值当局部结构不明显时退化到各向同性去噪避免误估方向导致伪影建议0.08~0.2。# -*- coding: utf-8 -*- SEM自适应方向保持去噪方向性结构张量 方向性高斯加权滤波 说明 - 默认读取路径: ../image/image.jpg - 面向单通道灰度图SEM常用 - 每一行均带有中文注释便于教学与出版 importcv2# 导入OpenCV库用于图像I/O与基础操作importnumpyasnp# 导入NumPy用于数值计算fromscipyimportndimageasndi# 导入scipy.ndimage用于高阶滤波与插值importmath# 导入math用于数学函数defcompute_structure_tensor(img,sigma1.0):# 计算输入图像的结构张量并返回张量分量Jxx,Jxy,Jyy# 参数:# img: float32 灰度图取值范围[0,255]或[0,1]# sigma: 用于计算梯度前的高斯平滑尺度Iimg.astype(np.float32)# 将图像转换为float32以确保数值精度I_smoothndi.gaussian_filter(I,sigma)# 先按照sigma对图像进行高斯平滑以降低噪声对梯度的影响Ixndi.sobel(I_smooth,axis1,modereflect)# 计算水平方向梯度x方向Iyndi.sobel(I_smooth,axis0,modereflect)# 计算垂直方向梯度y方向JxxIx*Ix# 结构张量分量J_xx I_x^2JxyIx*Iy# 结构张量分量J_xy I_x * I_yJyyIy*Iy# 结构张量分量J_yy I_y^2# 对结构张量分量再做一个较大尺度的高斯平滑以得到局部统计量Jxxndi.gaussian_filter(Jxx,sigma*2.0)# Jxx局部平滑Jxyndi.gaussian_filter(Jxy,sigma*2.0)# Jxy局部平滑Jyyndi.gaussian_filter(Jyy,sigma*2.0)# Jyy局部平滑returnJxx,Jxy,Jyy# 返回三个分量供后续特征计算deftensor_orientation_anisotropy(Jxx,Jxy,Jyy,eps1e-12):# 从结构张量分量计算主方向角theta弧度和各向异性度aniso0~1# 参数:# Jxx,Jxy,Jyy: 结构张量分量traceJxxJyy# 计算迹tracedetJxx*Jyy-Jxy*Jxy# 计算行列式determinant# 计算特征值lambda1 lambda2tmpnp.sqrt(np.maximum((Jxx-Jyy)**24.0*Jxy*Jxy,0.0))# 特征值计算的中间项lambda10.5*(tracetmp)# 较大特征值lambda20.5*(trace-tmp)# 较小特征值# 各向异性度定义为 (lambda1 - lambda2) / (lambda1 lambda2 eps)aniso(lambda1-lambda2)/(lambda1lambda2eps)# 归一化的各向异性度越接近1越方向性明显# 计算主方向角theta 0.5 * atan2(2*Jxy, Jxx - Jyy)theta0.5*np.arctan2(2.0*Jxy,(Jxx-Jyyeps))# 主方向角范围约为(-pi/2,pi/2)returntheta,aniso# 返回角度与各向异性度defdirectional_kernel(radius,sigma_parallel,sigma_perp,angle):# 构造一个在给定角度处的方向性高斯核未归一化# 参数:# radius: 核半径像素# sigma_parallel: 平行于主方向的高斯标准差保留更多细节时取较小值# sigma_perp: 垂直于主方向的高斯标准差垂直方向加大平滑# angle: 主方向角弧度diameter2*radius1# 计算核直径ys,xsnp.mgrid[-radius:radius1,-radius:radius1]# 生成网格坐标# 将网格坐标旋转到主方向坐标系cos_amath.cos(angle)# 计算cos(angle)sin_amath.sin(angle)# 计算sin(angle)x_rotcos_a*xssin_a*ys# 旋转后的x坐标平行方向y_rot-sin_a*xscos_a*ys# 旋转后的y坐标垂直方向# 方向性高斯在平行方向使用sigma_parallel垂直方向使用sigma_perpkernnp.exp(-0.5*((x_rot**2)/(sigma_parallel**21e-12)(y_rot**2)/(sigma_perp**21e-12)))kern/(np.sum(kern)1e-12)# 归一化核使权重和为1returnkern# 返回方向性高斯核defadaptive_directional_denoise(img,radius7,sigma_grad1.0,sigma_par_min0.5,sigma_par_max2.5,sigma_perp_ratio3.0,aniso_thresh0.15):# 对输入灰度图执行自适应方向性去噪# 参数:# img: np.ndarray 单通道灰度图dtypeu8或float32# radius: 局部方向性滤波核半径# sigma_grad: 用于结构张量的平滑尺度# sigma_par_min/sigma_par_max: 平行方向sigma的范围# sigma_perp_ratio: 垂直方向sigma sigma_parallel * sigma_perp_ratio# aniso_thresh: 各向异性阈值当aniso小于此值时使用非方向性退化策略Iimg.astype(np.float32)# 将图像转为float32用于计算Jxx,Jxy,Jyycompute_structure_tensor(I,sigmasigma_grad)# 计算结构张量分量theta,anisotensor_orientation_anisotropy(Jxx,Jxy,Jyy)# 计算每像素主方向与各向异性度h,wI.shape# 获取图像高宽outputnp.zeros_like(I)# 初始化输出图像数组padradius# 填充大小等于半径I_paddednp.pad(I,pad,modereflect)# 对图像进行反射填充以便边界处理theta_paddednp.pad(theta,pad,modereflect)# 对角度图做相同填充aniso_paddednp.pad(aniso,pad,modereflect)# 对各向异性图做相同填充# 逐像素应用方向性滤波可向量化或分块加速此处为清晰易懂的实现foryinrange(h):# 遍历图像每一行像素forxinrange(w):# 遍历图像每一列像素yyypad# 计算填充后对应y坐标xxxpad# 计算填充后对应x坐标local_thetafloat(theta_padded[yy,xx])# 读取局部主方向角local_anisofloat(aniso_padded[yy,xx])# 读取局部各向异性度# 根据各向异性度线性插值选择平行方向sigma强方向性时使用小sigma以保留细节sigma_parsigma_par_max-(sigma_par_max-sigma_par_min)*local_aniso sigma_perpsigma_par*sigma_perp_ratio# 垂直方向sigma通常大于平行方向# 当局部各向异性低于阈值时退化到非方向性快速去噪例如使用局部均值或高斯iflocal_anisoaniso_thresh:# 提取方形邻域并直接使用高斯权重做平滑patchI_padded[yy-pad:yypad1,xx-pad:xxpad1]# 提取方形补丁# 构造各向同性高斯核ys,xsnp.mgrid[-pad:pad1,-pad:pad1]# 局部坐标网格iso_kernnp.exp(-0.5*((xs**2ys**2)/((sigma_par*sigma_perp_ratio)**21e-12)))iso_kern/(np.sum(iso_kern)1e-12)# 归一化valnp.sum(patch*iso_kern)# 加权求和得到中心像素的值output[y,x]val# 写入输出像素else:# 构建方向性核并应用到局部补丁kerndirectional_kernel(pad,sigma_par,sigma_perp,local_theta)# 方向性核patchI_padded[yy-pad:yypad1,xx-pad:xxpad1]# 提取对应补丁valnp.sum(patch*kern)# 使用方向性核加权求和output[y,x]val# 写入输出像素returnnp.clip(output,0.0,255.0).astype(np.uint8)# 裁剪并返回uint8图像if__name____main__:# 演示部分读取图像添加合成噪声并进行方向性去噪img_pathrD:\py\line\image.png# 默认图像路径遵循项目约定img_bgrcv2.imread(img_path,cv2.IMREAD_UNCHANGED)# 读取图像可能为16位或8位ifimg_bgrisNone:# 检查图像是否成功读取raiseFileNotFoundError(f无法读取图像:{img_path})# 抛出文件未找到错误# 若图像为彩色或多通道转换为灰度SEM一般为灰度图ifimg_bgr.ndim3andimg_bgr.shape[2]3:img_graycv2.cvtColor(img_bgr,cv2.COLOR_BGR2GRAY)# 转为灰度else:img_grayimg_bgr.copy()# 直接复制单通道图像# 将任何16位图像缩放到8位以便处理若需要保留高位精度可修改此处ifimg_gray.dtypenp.uint16:img_gray(img_gray/256).astype(np.uint8)# 将16位下采样到8位# 为演示添加合成高斯噪声真实SEM数据通常直接使用原图sigma_demo15# 合成噪声的标准差像素值层面noisenp.random.randn(*img_gray.shape)*sigma_demo# 生成高斯噪声noisynp.clip(img_gray.astype(np.float32)noise,0,255).astype(np.uint8)# 得到加噪图# 调用自适应方向性去噪函数denoisedadaptive_directional_denoise(noisy,radius7,sigma_grad1.0,sigma_par_min0.6,sigma_par_max2.0,sigma_perp_ratio3.0,aniso_thresh0.12)# 使用plt显示图像importmatplotlib.pyplotasplt# 设置中文显示支持plt.rcParams[font.sans-serif][SimHei]plt.rcParams[axes.unicode_minus]False# 显示原图plt.subplot(1,3,1)plt.imshow(img_gray,cmapgray)plt.title(原图)plt.axis(off)# 显示加噪图plt.subplot(1,3,2)plt.imshow(noisy,cmapgray)plt.title(加噪图)plt.axis(off)# 显示去噪图plt.subplot(1,3,3)plt.imshow(denoised,cmapgray)plt.title(去噪图)plt.axis(off)# 显示图像plt.show()3、DnCNN去噪卷积神经网络PyTorchDnCNNDenoising Convolutional Neural Network是一种基于卷积神经网络的图像去噪算法由张凯平等人在2017年提出。其核心思想是利用深层卷积网络直接学习从噪声图像到“噪声成分”的映射关系再通过将预测出的噪声从原图中减去得到干净图像。采用残差学习Residual Learning策略使网络更易于训练结合批归一化Batch Normalization来加速收敛与稳定训练过程。该模型可同时处理高斯噪声去除、JPEG压缩伪影消除以及盲去噪等任务表现优于传统滤波方法如BM3D代表了深度学习在图像去噪领域的典型应用。网络结构较轻可在CPU上运行。channels3输入必须是RGB等三通道图像# -*- coding: utf-8 -*- 基于PyTorch的DnCNN图像去噪实现 importtorchimporttorch.nnasnnimporttorch.nn.functionalasFimporttorchvision.transformsasTfromPILimportImageimportnumpyasnpimportmatplotlib.pyplotasplt# 1. 定义DnCNN网络结构 classDnCNN(nn.Module):def__init__(self,channels3,num_layers17):super(DnCNN,self).__init__()layers[]# 第一层卷积 ReLUlayers.append(nn.Conv2d(channels,64,kernel_size3,padding1,biasFalse))layers.append(nn.ReLU(inplaceTrue))# 中间层卷积 BN ReLUfor_inrange(num_layers-2):layers.append(nn.Conv2d(64,64,kernel_size3,padding1,biasFalse))layers.append(nn.BatchNorm2d(64))layers.append(nn.ReLU(inplaceTrue))# 最后一层卷积输出噪声残差layers.append(nn.Conv2d(64,channels,kernel_size3,padding1,biasFalse))self.dncnnnn.Sequential(*layers)defforward(self,x):outself.dncnn(x)returnx-out# 输出为去噪后的图像原图减去预测噪声# 2. 图像预处理函数 defpreprocess(img_path):imgImage.open(img_path).convert(RGB)# 打开并转换为RGBtransformT.Compose([T.ToTensor()])# 转换为张量格式[0,1]img_tensortransform(img).unsqueeze(0)# 增加batch维度returnimg,img_tensor# 3. 添加噪声函数 defadd_gaussian_noise(img_tensor,sigma25):noisetorch.randn_like(img_tensor)*(sigma/255.0)noisytorch.clamp(img_tensornoise,0.,1.)returnnoisy# 4. 推理流程 devicetorch.device(cudaiftorch.cuda.is_available()elsecpu)modelDnCNN().to(device)model.eval()# 推理模式# 加载图像img,cleanpreprocess(../image/image.jpg)noisyadd_gaussian_noise(clean)# 输入模型withtorch.no_grad():denoisedmodel(noisy.to(device)).cpu()# 转换为可显示图像to_pilT.ToPILImage()noisy_imgto_pil(noisy.squeeze())denoised_imgto_pil(denoised.squeeze())# 5. 可视化对比 plt.figure(figsize(10,4))plt.subplot(1,3,1)plt.imshow(img)plt.title(原图)plt.axis(off)plt.subplot(1,3,2)plt.imshow(noisy_img)plt.title(加噪图)plt.axis(off)plt.subplot(1,3,3)plt.imshow(denoised_img)plt.title(去噪结果DnCNN)plt.axis(off)plt.tight_layout()plt.show()五、超分1、fairSIM一种快速而温和的超分辨率方法显著提升图像分辨率fairSIM一种快速而温和的超分辨率方法显著提升图像分辨率2、RCAN使用非常深的残差通道注意力网络实现图像超分辨率【PyTorch项目实战】超分RCAN使用非常深的残差通道注意力网络实现图像超分辨率 —— 自研解决了RCAN恢复图像的模糊性