photomontage後半部分梯度域融合gradient-domain fuse的思路與代碼實現

經過圖割過後,圖像的每一塊分佈在了不同的圖像,直接拼接在一起會有明顯的接縫,爲了解決這個問題需要用到泊松融合。

這裏與poisson image edit不同的是這裏不是一塊一塊兩兩融合到一起的,而是一次性全圖融合到一塊。

其重要思路是:

1.每一個塊在自己的原圖像中計算梯度

2.將梯度根據塊拼接在一起,形成合成的梯度圖

3.用這個梯度圖計算散度

4.泊松等式求解Ax=b

 

需要注意的是這裏用到的是第二類邊界,而不是第一類邊界。

下面是計算b的代碼 b是一個列向量

templt = [0 0 0; 0 -1 1; 0 0 0];
GR1 = imfilter(double(TargetImgR), templt, 'replicate');%Rx梯度
GG1 = imfilter(double(TargetImgG), templt, 'replicate');%Gx梯度
GB1 = imfilter(double(TargetImgB), templt, 'replicate');%Bx梯度
templt = [0 0 0; 0 -1 0; 0 1 0];
GR2 = imfilter(double(TargetImgR), templt, 'replicate');%Ry梯度
GG2 = imfilter(double(TargetImgG), templt, 'replicate');%Gy梯度
GB2 = imfilter(double(TargetImgB), templt, 'replicate');%By梯度
templt = [0 0 0; -1 1 0; 0 0 0];
VR1 = imfilter(double(GR1), templt, 0);%Rx散度
VG1 = imfilter(double(GG1), templt, 0);%Gx散度
VB1 = imfilter(double(GB1), templt, 0);%Bx散度
templt = [0 -1 0; 0 1 0; 0 0 0];
VR2 = imfilter(double(GR2), templt, 0);%Ry散度
VG2 = imfilter(double(GG2), templt, 0);%Gy散度
VB2 = imfilter(double(GB2), templt, 0);%By散度
VR=VR1+VR2;
VG=VG1+VG2;
VB=VB1+VB2;
VR=-VR;
VG=-VG;
VB=-VB;

bR=reshape(VR,[H*W 1]);
bG=reshape(VG,[H*W 1]);
bB=reshape(VB,[H*W 1]);

 

下面是計算鄰接矩陣A的代碼

[height, width]      = size(Mask);
total=height*width;

i1 = (1:total-height)';
j1 = i1+height;
i2 = (1+height:total)';
j2 = i2-height;
for i = 1:width
      i3_tem(:,i) = (i-1)*height + (1:height-1)';
end
i3 = i3_tem(:);
j3 = i3+1;

for i = 1:width
      i4_tem(:,i) = (i-1)*height + (2:height)';
end
i4 = i4_tem(:);
j4 = i4-1;

all=[[i1;i2;i3;i4],[j1;j2;j3;j4],[ones(size(i1));ones(size(i2));ones(size(i3));ones(size(i4))]];
neighb = spconvert(all);
SUM=double(sum(neighb,2));
K=reshape(SUM,[height,width]);

elementInDiag = SUM;
A = spdiags (elementInDiag, 0, total, total);
neighb=A-neighb;
neighb(IND,IND)=neighb(IND,IND)+1;

 

其中IND是人工設定的指定像素的位置。

這個需要與b(IND)相對應,表示一種限制條件,即這個像素點與原圖一致。在photmontage論文中也有提到。

bR(IND)=bR(IND)+R(IND);
bG(IND)=bG(IND)+G(IND);
bB(IND)=bB(IND)+B(IND);

最後是三通道的求解

    XR = cgs(sparse(A), bR, tolerance, max_iter, [], [], rand(H*W,1));
    XG = cgs(sparse(A), bG, tolerance, max_iter, [], [], rand(H*W,1));
    XB = cgs(sparse(A), bB, tolerance, max_iter, [], [], rand(H*W,1));

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章