weixin_46634404 2021-05-14 14:10 采纳率: 0%
浏览 70

基于MATLAB图像融合的代码算法含义和实现步骤,麻烦大神解释下?

想问几个问题:

1.代码都是什么意思?

2.图像融合步骤是什么?

3.起主要作用的是哪段代码?

麻烦大神教一下,十分感谢

%合成两幅图像:将图像girl.bmp融合到图像scene.png上
clear
%读入第一个图像Girl.bmp
filename1='girl.bmp';
info=imfinfo(filename1);                %取一张图片的具体信息
width1=info.Width;
height1=info.Height;
if strcmp(info.ColorType,'grayscale')==1
    [A,MAP]=gray2ind(imread(filename1));%将灰度图变为索引图
    RGB1=ind2rgb(A,MAP);                %将索引图变为真彩色图
end
if strcmp(info.ColorType,'indexed')==1
    [A,MAP]=imread(filename1);
    RGB1=ind2rgb(A,MAP);                %将索引图变为真彩色图
end    
if strcmp(info.ColorType,'truecolor')==1
    RGB1=imread(filename1);
end
figure,imshow(RGB1);
 
%读入第二个图像Scene.png
filename2='scene.png';      
info=imfinfo(filename2);                %取一张图片的具体信息
width2=info.Width;
height2=info.Height;
if strcmp(info.ColorType,'grayscale')==1
    [A,MAP]=gray2ind(imread(filename2));%将灰度图变为索引图
    RGB2=ind2rgb(A,MAP);                %将索引图变为真彩色图
end
if strcmp(info.ColorType,'indexed')==1
    [A,MAP]=imread(filename2);
    RGB2=ind2rgb(A,MAP);                %将索引图变为真彩色图
end    
if strcmp(info.ColorType,'truecolor')==1
    RGB2=imread(filename2);
end
figure,imshow(RGB2);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%种子填充,得到参考图像
BW=~im2bw(RGB1);                        %图像二值化后取反
figure;imshow(BW);
%选择二值化图像左上角、右上角为种子起始点,连通模板选择4邻域的,将人物外轮廓以外
%的像素设置为1得B,然后用BW减去B,即可。
B=imfill(imfill(BW,[1,1],4),[1,width1],4);
figure;imshow(B);
B=~xor(BW,B);                        %经过异或取反()得到了人物轮廓参考图像B
figure;imshow(B);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%尝试边缘检测,然后再imfill填充hole的尝试,不过,效果不好没
%有成功,后来知道是外轮廓底端不封闭的缘故
BW2=im2bw(RGB1); 
figure,imshow(BW2);
[m n]=size(BW2);
imgn=zeros(m,n);        %边界标记图像
ed=[-1 -1;0 -1;1 -1;1 0;1 1;0 1;-1 1;-1 0]; %从左上角像素,逆时针搜索
for i=2:m-1
    for j=2:n-1
        if BW2(i,j)==1 && imgn(i,j)==0      %当前是没标记的白色像素
            if sum(sum(BW2(i-1:i+1,j-1:j+1)))~=9    %块内部的白像素不标记
                ii=i;         %像素块内部搜寻使用的坐标
                jj=j;
                imgn(i,j)=1;    %本像素块第一个标记的边界,第一个边界像素为2
                
                while imgn(ii,jj)~=1    %是否沿着像素块搜寻一圈了。
                    for k=1:8           %逆时针八邻域搜索
                        tmpi=ii+ed(k,1);        %八邻域临时坐标
                        tmpj=jj+ed(k,2);
                        %搜索到新边界,并且没有搜索一圈
                        if BW2(tmpi,tmpj)==1 && imgn(tmpi,tmpj)~=1  
                           ii=tmpi;        %更新内部搜寻坐标,继续搜索
                           jj=tmpj;
                           imgn(ii,jj)=1;%边界标记图像该像素标记,普通边界为1
                            break;
                        end
                    end
                end
                
            end
        end
    end
end
 
figure;imshow(imgn)
%imgn=imgn>=1;
imfill(imgn,'hole')
figure,imshow(imgn);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
%对第一个图像进行预处理
A=im2double(RGB1);                    %人物原图像变为双精度型
D=zeros(height1,width1);              %前景和背景交界点的标志矩阵D
K=3;                                  %领域宽度
for i=1:1:height1
    for j=1:1:width1
        if B(i,j)==0          %参考图像数据为0时,将第一幅图像的背景替换为蓝色
            A(i,j,1)=0;
            A(i,j,2)=0;
            A(i,j,3)=1.0;
        else                        %对第一个图像中的前景和背景交界处进行处理
            for k=1:1:K
                N(k)=B(i,j+k-round(K/2));
            end
            if ~all(N)                %假如该点左右两个像素点存在背景点  
                if ~isempty(find(N==1))   
                    k1=1;k2=-1;
                    while 1           %用内点(人廓内部)替换该点颜色
                        r=A(i,j+k1,1);g=A(i,j+k1,2);b=A(i,j+k1,3);
                        if B(i,j+k1)==1
                            break;
                        end
                        r=A(i,j+k2,1);g=A(i,j+k2,2);b=A(i,j+k2,3);
                        if B(i,j+k2)==1
                            break;
                        end
                        k1=k1+1;k2=k2-1;
                    end
                    A(i,j,1)=r;
                    A(i,j,2)=g;
                    A(i,j,3)=b;
                    D(i,j)=1;         %对前景背景交界点做标志
                end       
            end
        end        
    end
end
figure;imshow(A);
x=280;y=100;                        %第一幅图像融合到第二幅图像的起点位置指定
RGB=im2double(RGB2);
 
%融合图像
for i=1:1:height1
    for j=1:1:width1
        if B(i,j)==1   
            if D(i,j)==1             %交界点的处理,用渐进法。  
                RGB(y+i,x+j,1)=0.5*A(i,j,1)+0.5*RGB(y+i,x+j,1);
                RGB(y+i,x+j,2)=0.5*A(i,j,2)+0.5*RGB(y+i,x+j,2);
                RGB(y+i,x+j,3)=0.5*A(i,j,3)+0.5*RGB(y+i,x+j,3);
            else                     %前景的处理,直接用人物图像替代
                RGB(y+i,x+j,1)=A(i,j,1);
                RGB(y+i,x+j,2)=A(i,j,2);
                RGB(y+i,x+j,3)=A(i,j,3);    
            end
        end
    end
end
figure,imshow(RGB);
clc;

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-07 18:48
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况
  • ¥15 画两个图 python或R