python实现泊松图像融合
本文实例为大家分享了python实现泊松图像融合的具体代码,供大家参考,具体内容如下
```
from__future__importdivision
importnumpyasnp
importscipy.fftpack
importscipy.ndimage
importcv2
importmatplotlib.pyplotasplt
#sns.set(style="darkgrid")
defDST(x):
"""
ConvertsScipy'sDSToutputtoMatlab'sDST(scaling).
"""
X=scipy.fftpack.dst(x,type=1,axis=0)
returnX/2.0
defIDST(X):
"""
InverseDST.Python->Matlab
"""
n=X.shape[0]
x=np.real(scipy.fftpack.idst(X,type=1,axis=0))
returnx/(n+1.0)
defget_grads(im):
"""
returnthexandygradients.
"""
[H,W]=im.shape
Dx,Dy=np.zeros((H,W),'float32'),np.zeros((H,W),'float32')
j,k=np.atleast_2d(np.arange(0,H-1)).T,np.arange(0,W-1)
Dx[j,k]=im[j,k+1]-im[j,k]
Dy[j,k]=im[j+1,k]-im[j,k]
returnDx,Dy
defget_laplacian(Dx,Dy):
"""
returnthelaplacian
"""
[H,W]=Dx.shape
Dxx,Dyy=np.zeros((H,W)),np.zeros((H,W))
j,k=np.atleast_2d(np.arange(0,H-1)).T,np.arange(0,W-1)
Dxx[j,k+1]=Dx[j,k+1]-Dx[j,k]
Dyy[j+1,k]=Dy[j+1,k]-Dy[j,k]
returnDxx+Dyy
defpoisson_solve(gx,gy,bnd):
#converttodouble:
gx=gx.astype('float32')
gy=gy.astype('float32')
bnd=bnd.astype('float32')
H,W=bnd.shape
L=get_laplacian(gx,gy)
#settheinterioroftheboundary-imageto0:
bnd[1:-1,1:-1]=0
#gettheboundarylaplacian:
L_bp=np.zeros_like(L)
L_bp[1:-1,1:-1]=-4*bnd[1:-1,1:-1]\
+bnd[1:-1,2:]+bnd[1:-1,0:-2]\
+bnd[2:,1:-1]+bnd[0:-2,1:-1]#delta-x
L=L-L_bp
L=L[1:-1,1:-1]
#computethe2DDST:
L_dst=DST(DST(L).T).T#firstalongcolumns,thenalongrows
#normalize:
[xx,yy]=np.meshgrid(np.arange(1,W-1),np.arange(1,H-1))
D=(2*np.cos(np.pi*xx/(W-1))-2)+(2*np.cos(np.pi*yy/(H-1))-2)
L_dst=L_dst/D
img_interior=IDST(IDST(L_dst).T).T#inverseDSTforrowsandcolumns
img=bnd.copy()
img[1:-1,1:-1]=img_interior
returnimg
defblit_images(im_top,im_back,scale_grad=1.0,mode='max'):
"""
combineimagesusingpoissionediting.
IM_TOPandIM_BACKshouldbeofthesamesize.
"""
assertnp.all(im_top.shape==im_back.shape)
im_top=im_top.copy().astype('float32')
im_back=im_back.copy().astype('float32')
im_res=np.zeros_like(im_top)
#fracofgradientswhichcomefromsource:
forchinxrange(im_top.shape[2]):
ims=im_top[:,:,ch]
imd=im_back[:,:,ch]
[gxs,gys]=get_grads(ims)
[gxd,gyd]=get_grads(imd)
gxs*=scale_grad
gys*=scale_grad
gxs_idx=gxs!=0
gys_idx=gys!=0
#mixthesourceandtargetgradients:
ifmode=='max':
gx=gxs.copy()
gxm=(np.abs(gxd))>np.abs(gxs)
gx[gxm]=gxd[gxm]
gy=gys.copy()
gym=np.abs(gyd)>np.abs(gys)
gy[gym]=gyd[gym]
#getgradientmixturestatistics:
f_gx=np.sum((gx[gxs_idx]==gxs[gxs_idx]).flat)/(np.sum(gxs_idx.flat)+1e-6)
f_gy=np.sum((gy[gys_idx]==gys[gys_idx]).flat)/(np.sum(gys_idx.flat)+1e-6)
ifmin(f_gx,f_gy)<=0.35:
m='max'
ifscale_grad>1:
m='blend'
returnblit_images(im_top,im_back,scale_grad=1.5,mode=m)
elifmode=='src':
gx,gy=gxd.copy(),gyd.copy()
gx[gxs_idx]=gxs[gxs_idx]
gy[gys_idx]=gys[gys_idx]
elifmode=='blend':#fromrecursivecall:
#justdoanalphablend
gx=gxs+gxd
gy=gys+gyd
im_res[:,:,ch]=np.clip(poisson_solve(gx,gy,imd),0,255)
returnim_res.astype('uint8')
defcontiguous_regions(mask):
"""
returnalistof(ind0,ind1)suchthatmask[ind0:ind1].all()is
Trueandwecoverallsuchregions
"""
in_region=None
boundaries=[]
fori,valinenumerate(mask):
ifin_regionisNoneandval:
in_region=i
elifin_regionisnotNoneandnotval:
boundaries.append((in_region,i))
in_region=None
ifin_regionisnotNone:
boundaries.append((in_region,i+1))
returnboundaries
if__name__=='__main__':
"""
exampleusage:
"""
importseabornassns
im_src=cv2.imread('../f01006.jpg').astype('float32')
im_dst=cv2.imread('../f01006-5.jpg').astype('float32')
mu=np.mean(np.reshape(im_src,[im_src.shape[0]*im_src.shape[1],3]),axis=0)
#printmu
sz=(1920,1080)
im_src=cv2.resize(im_src,sz)
im_dst=cv2.resize(im_dst,sz)
im0=im_dst[:,:,0]>100
im_dst[im0,:]=im_src[im0,:]
im_dst[~im0,:]=50
im_dst=cv2.GaussianBlur(im_dst,(5,5),5)
im_alpha=0.8*im_dst+0.2*im_src
#plt.imshow(im_dst)
#plt.show()
im_res=blit_images(im_src,im_dst)
importscipy
scipy.misc.imsave('orig.png',im_src[:,:,::-1].astype('uint8'))
scipy.misc.imsave('alpha.png',im_alpha[:,:,::-1].astype('uint8'))
scipy.misc.imsave('poisson.png',im_res[:,:,::-1].astype('uint8'))
im_actual_L=cv2.cvtColor(im_src.astype('uint8'),cv2.cv.CV_BGR2Lab)[:,:,0]
im_alpha_L=cv2.cvtColor(im_alpha.astype('uint8'),cv2.cv.CV_BGR2Lab)[:,:,0]
im_poisson_L=cv2.cvtColor(im_res.astype('uint8'),cv2.cv.CV_BGR2Lab)[:,:,0]
#plt.imshow(im_alpha_L)
#plt.show()
foriinxrange(500,im_alpha_L.shape[1],5):
l_actual=im_actual_L[i,:]#-im_actual_L[i,:-1]
l_alpha=im_alpha_L[i,:]#-im_alpha_L[i,:-1]
l_poisson=im_poisson_L[i,:]#-im_poisson_L[i,:-1]
withsns.axes_style("darkgrid"):
plt.subplot(2,1,2)
#plt.plot(l_alpha,label='alpha')
plt.plot(l_poisson,label='poisson')
plt.hold(True)
plt.plot(l_actual,label='actual')
plt.legend()
#find"textregions":
is_txt=~im0[i,:]
t_loc=contiguous_regions(is_txt)
ax=plt.gca()
forb0,b1int_loc:
ax.axvspan(b0,b1,facecolor='red',alpha=0.1)
withsns.axes_style("white"):
plt.subplot(2,1,1)
plt.imshow(im_alpha[:,:,::-1].astype('uint8'))
plt.hold(True)
plt.plot([0,im_alpha_L.shape[0]-1],[i,i],'r')
plt.axis('image')
plt.show()
plt.subplot(1,3,1)
plt.imshow(im_src[:,:,::-1].astype('uint8'))
plt.subplot(1,3,2)
plt.imshow(im_alpha[:,:,::-1].astype('uint8'))
plt.subplot(1,3,3)
plt.imshow(im_res[:,:,::-1])#cv2readsinBGR
plt.show()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。