python实现泊松图像融合


Posted in Python onJuly 26, 2018

本文实例为大家分享了python实现泊松图像融合的具体代码,供大家参考,具体内容如下

```
from __future__ import division
import numpy as np 
import scipy.fftpack
import scipy.ndimage
import cv2
import matplotlib.pyplot as plt 
#sns.set(style="darkgrid")


def DST(x):
  """
  Converts Scipy's DST output to Matlab's DST (scaling).
  """
  X = scipy.fftpack.dst(x,type=1,axis=0)
  return X/2.0

def IDST(X):
  """
  Inverse DST. Python -> Matlab
  """
  n = X.shape[0]
  x = np.real(scipy.fftpack.idst(X,type=1,axis=0))
  return x/(n+1.0)

def get_grads(im):
  """
  return the x and y gradients.
  """
  [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]
  return Dx,Dy

def get_laplacian(Dx,Dy):
  """
  return the laplacian
  """
  [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]
  return Dxx+Dyy

def poisson_solve(gx,gy,bnd):
  # convert to double:
  gx = gx.astype('float32')
  gy = gy.astype('float32')
  bnd = bnd.astype('float32')

  H,W = bnd.shape
  L = get_laplacian(gx,gy)

  # set the interior of the boundary-image to 0:
  bnd[1:-1,1:-1] = 0
  # get the boundary laplacian:
  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]

  # compute the 2D DST:
  L_dst = DST(DST(L).T).T #first along columns, then along rows

  # 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 # inverse DST for rows and columns

  img = bnd.copy()

  img[1:-1,1:-1] = img_interior

  return img

def blit_images(im_top,im_back,scale_grad=1.0,mode='max'):
  """
  combine images using poission editing.
  IM_TOP and IM_BACK should be of the same size.
  """
  assert np.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)

  # frac of gradients which come from source:
  for ch in xrange(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
    # mix the source and target gradients:
    if mode=='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]

      # get gradient mixture statistics:
      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)
      if min(f_gx, f_gy) <= 0.35:
        m = 'max'
        if scale_grad > 1:
          m = 'blend'
        return blit_images(im_top, im_back, scale_grad=1.5, mode=m)

    elif mode=='src':
      gx,gy = gxd.copy(), gyd.copy()
      gx[gxs_idx] = gxs[gxs_idx]
      gy[gys_idx] = gys[gys_idx]

    elif mode=='blend': # from recursive call:
      # just do an alpha blend
      gx = gxs+gxd
      gy = gys+gyd

    im_res[:,:,ch] = np.clip(poisson_solve(gx,gy,imd),0,255)

  return im_res.astype('uint8')


def contiguous_regions(mask):
  """
  return a list of (ind0, ind1) such that mask[ind0:ind1].all() is
  True and we cover all such regions
  """
  in_region = None
  boundaries = []
  for i, val in enumerate(mask):
    if in_region is None and val:
      in_region = i
    elif in_region is not None and not val:
      boundaries.append((in_region, i))
      in_region = None

  if in_region is not None:
    boundaries.append((in_region, i+1))
  return boundaries


if __name__=='__main__':
  """
  example usage:
  """
  import seaborn as sns

  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)
  # print mu
  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)

  import scipy
  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()
  for i in xrange(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]


    with sns.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 "text regions":
      is_txt = ~im0[i,:]
      t_loc = contiguous_regions(is_txt)
      ax = plt.gca()
      for b0,b1 in t_loc:
        ax.axvspan(b0, b1, facecolor='red', alpha=0.1)

    with sns.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]) #cv2 reads in BGR
  plt.show()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
利用Python读取文件的四种不同方法比对
May 18 Python
python3学习之Splash的安装与实例教程
Jul 09 Python
Python使用sorted对字典的key或value排序
Nov 15 Python
Python docx库用法示例分析
Feb 16 Python
Python3.5模块的定义、导入、优化操作图文详解
Apr 27 Python
Python PyQt5 Pycharm 环境搭建及配置详解(图文教程)
Jul 16 Python
python+rsync精确同步指定格式文件
Aug 29 Python
TensorFlow 多元函数的极值实例
Feb 10 Python
PyCharm永久激活方式(推荐)
Sep 22 Python
django 解决扩展自带User表遇到的问题
May 14 Python
Python如何实现邮件功能
May 27 Python
Python趣味挑战之实现简易版音乐播放器
May 28 Python
python中的decorator的作用详解
Jul 26 #Python
python opencv实现旋转矩形框裁减功能
Jul 25 #Python
Python3匿名函数用法示例
Jul 25 #Python
Python实现动态添加属性和方法操作示例
Jul 25 #Python
利用pandas读取中文数据集的方法
Jul 25 #Python
利用pandas进行大文件计数处理的方法
Jul 25 #Python
使用python验证代理ip是否可用的实现方法
Jul 25 #Python
You might like
一个php作的文本留言本的例子(一)
2006/10/09 PHP
PHP分页类集锦
2014/11/18 PHP
php上传文件常见问题总结
2015/02/03 PHP
php建立Ftp连接的方法
2015/03/07 PHP
PHP+apc+ajax实现的ajax_upload上传进度条代码
2016/01/25 PHP
jquery 多行滚动代码(附详细解释)
2010/06/17 Javascript
Javascript 鼠标移动上去小三角形滑块缓慢跟随效果
2013/04/26 Javascript
javascript解决innerText浏览器兼容问题思路代码
2013/05/17 Javascript
简单的js表单验证函数
2013/10/28 Javascript
jQuery读取XML文件内容的方法
2015/03/09 Javascript
javascript判断css3动画结束 css3动画结束的回调函数
2015/03/10 Javascript
javascript实现的固定位置悬浮窗口实例
2015/04/30 Javascript
jQuery左右滚动支持图片放大缩略图图片轮播代码分享
2015/08/26 Javascript
基于jQuery插件实现点击小图显示大图效果
2016/05/11 Javascript
js通过指定下标或指定元素进行删除数组的实例
2017/01/12 Javascript
vue中计算属性(computed)、methods和watched之间的区别
2017/07/27 Javascript
Vue修改项目启动端口号方法
2019/11/07 Javascript
深入了解Vue动态组件和异步组件
2021/01/26 Vue.js
python实现查找excel里某一列重复数据并且剔除后打印的方法
2015/05/26 Python
Python计算字符宽度的方法
2016/06/14 Python
使用Python计算玩彩票赢钱概率
2019/06/26 Python
Python实现栈和队列的简单操作方法示例
2019/11/29 Python
Anconda环境下Vscode安装Python的方法详解
2020/03/29 Python
澳大利亚汽车零部件、音响及配件超市:Automotive Superstore
2018/06/19 全球购物
美国女士时尚珠宝及配饰购物网站:Icing
2018/07/02 全球购物
美国工业用品采购网站:Zoro.com
2020/10/27 全球购物
AJax面试题
2014/11/25 面试题
高级方案规划工程师岗位职责
2013/11/29 职场文书
护理职业生涯规划书
2014/01/24 职场文书
2014年公务员思想汇报范文:全心全意为人民服务
2014/03/06 职场文书
青奥会口号
2014/06/12 职场文书
学生检讨书范文
2015/01/27 职场文书
寒山寺导游词
2015/02/03 职场文书
生死抉择观后感
2015/06/09 职场文书
史上最全的军训拉歌口号
2015/12/25 职场文书
Nginx性能优化之Gzip压缩设置详解(最大程度提高页面打开速度)
2022/02/12 Servers