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 相关文章推荐
java直接调用python脚本的例子
Feb 16 Python
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
May 09 Python
python logging日志模块的详解
Oct 29 Python
python matplotlib 注释文本箭头简单代码示例
Jan 08 Python
用tensorflow构建线性回归模型的示例代码
Mar 05 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
Jul 14 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
Oct 04 Python
python 实现将小图片放到另一个较大的白色或黑色背景图片中
Dec 12 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
Mar 30 Python
Python如何生成xml文件
Jun 04 Python
pyspark对Mysql数据库进行读写的实现
Dec 30 Python
Python可视化神器pyecharts之绘制地理图表练习
Jul 07 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编程最快明白》第四讲:日期、表单接收、session、cookie
2010/11/01 PHP
利用PHP实现智能文件类型检测的实现代码
2011/08/02 PHP
PHP rawurlencode与urlencode函数的深入分析
2013/06/08 PHP
PHP彩蛋信息介绍和阻止泄漏的方法(隐藏功能)
2014/08/06 PHP
PHP程序员常见的40个陋习,你中了几个?
2014/11/20 PHP
php正则匹配html中带class的div并选取其中内容的方法
2015/01/13 PHP
PHP符合PSR编程规范的实例分享
2016/12/21 PHP
Laravel中的Auth模块详解
2017/08/17 PHP
laravel框架模型、视图与控制器简单操作示例
2019/10/10 PHP
JS中使用sort结合localeCompare实现中文排序实例
2014/07/23 Javascript
jQuery插件FusionCharts绘制的3D饼状图效果实例【附demo源码下载】
2017/03/03 Javascript
详解AngularJS 模块化
2017/06/14 Javascript
vue+element实现表单校验功能
2019/05/20 Javascript
layer.prompt使文本框为空的情况下也能点击确定的方法
2019/09/24 Javascript
详解关闭令人抓狂的ESlint 语法检测配置方法
2019/10/28 Javascript
Vue3新特性之在Composition API中使用CSS Modules
2020/07/13 Javascript
JavaScript快速调试的两个技巧
2020/11/04 Javascript
js实现头像上传并且可预览提交
2020/12/25 Javascript
Python中字符串对齐方法介绍
2015/05/21 Python
安装Python的教程-Windows
2017/07/22 Python
python爬虫实战之最简单的网页爬虫教程
2017/08/13 Python
python实现京东秒杀功能
2018/07/30 Python
解决python中os.listdir()函数读取文件夹下文件的乱序和排序问题
2018/10/17 Python
python 求1-100之间的奇数或者偶数之和的实例
2019/06/11 Python
python提取log文件内容并画出图表
2019/07/08 Python
Django REST 异常处理详解
2020/07/15 Python
CSS3制作3D立方体loading特效
2020/11/09 HTML / CSS
data:image data url 文件转为Blob上传后端的方法
2019/07/16 HTML / CSS
食堂员工工作职责
2013/12/18 职场文书
年会搞笑主持词
2014/03/27 职场文书
公司寄语大全
2014/04/10 职场文书
处级领导干部四风问题自我剖析材料
2014/09/29 职场文书
2015年高一班主任工作总结
2015/05/13 职场文书
患者身份识别制度
2015/08/06 职场文书
python 网络编程要点总结
2021/06/18 Python
Python 中 Shutil 模块详情
2021/11/11 Python