【图像融合】基于带有散焦扩散缓解机制的自适应区域分割多焦点图像融合附Matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。
🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室
👇 关注我领取海量matlab电子书和数学建模资料
🍊个人信条:做科研,博学之、审问之、慎思之、明辨之、笃行之,是为:博学慎思,明辨笃行。
🔥 内容介绍
一、引言
在图像融合领域,多焦点图像融合旨在将不同焦点位置的图像信息整合,生成一幅在全区域都清晰的图像。然而,散焦扩散效应常常给这一过程带来诸多问题,影响融合图像的质量。本文所介绍的自适应区域分割多焦点融合(RDMF)算法,为解决散焦扩散效应引发的问题提供了创新思路,通过独特的策略提升了多焦点图像融合的效果。
二、RDMF 算法核心机制
综合测量图像活动水平:RDMF 算法创新性地将图像梯度信息与形态学特征相结合,以此全面衡量图像的活动水平。图像梯度能够反映图像中灰度变化的剧烈程度,突出图像的边缘和细节信息;而形态学特征则从图像的形状、结构等方面提供了更丰富的信息。两者结合,使得算法可以更精准地判断图像不同区域的重要性和活跃度,为后续的融合操作奠定基础。
缓解散焦扩散效应及解决相关挑战
修正焦点边界附近的散焦扩散效应:在多焦点图像中,焦点边界处的散焦扩散效应尤为明显,会导致融合图像在这些区域出现模糊或失真。RDMF 算法通过特定的方法对焦点边界附近的散焦扩散效应进行修正,使边界区域的图像信息更加清晰准确,有效改善了融合图像在焦点过渡区域的质量。
处理区域内部误差:除了焦点边界问题,图像区域内部也可能因散焦扩散产生误差,影响图像的整体清晰度。RDMF 算法针对区域内部的这些误差进行处理,通过对区域内图像信息的分析和调整,尽可能减少散焦扩散对区域内部细节的破坏,保留更多的原始图像细节信息。
优化融合区域之间的边界过渡:不同焦点区域融合时,边界过渡的自然与否直接影响融合图像的视觉效果。RDMF 算法注重对融合区域边界过渡的精细化处理,使得不同区域之间的融合更加平滑自然,避免出现明显的边界 artifacts(伪影),提升了融合图像的整体视觉质量。
⛳️ 运行结果
📣 部分代码
function [updateMap1,updateMap2] = computeDiffusion(initialMaps,enhanchedImages)%extract the defocus spread effect near the boundarieseq_img1=enhanchedImages{1};eq_img2=enhanchedImages{2};min_img=min(enhanchedImages{1},enhanchedImages{2});max_img=max(enhanchedImages{1},enhanchedImages{2});diff_img=max_img-min_img; % the variance of pixelif size(diff_img,3)==3gray_img=rgb2gray(diff_img);elseif size(diff_img,3)==1gray_img=diff_img;endif size(eq_img2,3)==3eq_img2_gray=rgb2gray(eq_img2);elseif size(eq_img2,3)==1eq_img2_gray=eq_img2;endif size(eq_img1,3)==3eq_img1_gray=rgb2gray(eq_img1);elseif size(eq_img1,3)==1eq_img1_gray = eq_img1;endave_img=(double(eq_img2_gray)+double(eq_img1_gray))/2; % the distribution of pixela=0.01;c=128;transformI=1./(1+exp(a*abs(ave_img-c)));img_normalized=double(gray_img)/255;alpha=exp(1)-1;logI=log(1+alpha*img_normalized);diffuse=uint8(logI.*transformI*255);binary=imbinarize(diffuse,"global");se=strel('disk',3);diffuse=imdilate(binary,se);% Extracting edge information and categorizing.ref=max(initialMaps{1,1},initialMaps{1,2});map1=uint8(zeros(size(gray_img)));map1(ref==initialMaps{1,2})=2;map1(ref==initialMaps{1,1})=1;ref=max(initialMaps{2,1},initialMaps{2,2});map2=zeros(size(gray_img));map2(ref==initialMaps{2,2})=2;map2(ref==initialMaps{2,1})=1;map2=medfilt2(map2,[8,8]);map2=uint8(map2);if size(min_img,3)==1min_img_gray=min_img;elseif size(min_img,3)==3min_img_gray=rgb2gray(min_img);endedgeI =edge(min_img_gray,'sobel')|edge(min_img_gray,'canny',0.15);edgeClass=uint8(zeros(size(edgeI)));edgeClass(edgeI==1&map1==2&map2==2)=2;edgeClass(edgeI==1&map1==1&map2==1)=1;% update two initial mapsupdateMap1=Knn(edgeClass,diffuse,map1,5,true);updateMap2=Knn(edgeClass,diffuse,map2,5,true);
