想问几个问题:
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;
不知道你这个问题是否已经解决, 如果还没有解决的话: