zoukankan      html  css  js  c++  java
  • Python: PS 图层混合算法汇总

    本文用 Python 实现了PS 中的图层混合算法,把很多常见的图层混合算法都汇总到了一起,比起以前写的算法,就是用矩阵运算代替了很耗时的for 循环,运行效率有所提升。具体的代码如下:

    import matplotlib.pyplot as plt
    from skimage import io
    import math
    import numpy as np
    
    # image fusion
    
    file_name='D:/Visual Effects/PS Algorithm/2.jpg';
    img_1=io.imread(file_name)
    img_1 = img_1/255.0
    
    file_name2='D:/Visual Effects/PS Algorithm/3.jpg'
    img_2=io.imread(file_name2)
    img_2 = img_2/255.0
    
    
    # 不透明度
    def Transparent(img_1, img_2, alpha):
        img = img_1 * alpha + img_2 * (1-alpha)
        return img
    
    # 正片叠底
    def Multiply (img_1, img_2):
        img = img_1 * img_2
        return img
    
    # 颜色加深 
    def Color_burn (img_1, img_2):
        img = 1 - (1 - img_2) / (img_1 + 0.001)
    
        mask_1 = img  < 0 
        mask_2 = img  > 1
    
        img = img * (1-mask_1)
        img = img * (1-mask_2) + mask_2
    
        '''
        row, col, channel = img.shape
        for i in range(row):
            for j in range(col):
                img[i, j, 0] = min(max(img[i, j, 0], 0), 1)
                img[i, j, 1] = min(max(img[i, j, 1], 0), 1)
                img[i, j, 2] = min(max(img[i, j, 2], 0), 1)
        '''
    
        return img
    
    # 颜色减淡
    def Color_dodge(img_1, img_2):
        img = img_2 / (1.0 - img_1 + 0.001)
        mask_2 = img  > 1
        img = img * (1-mask_2) + mask_2          
        return img 
    
    # 线性加深 
    def Linear_burn(img_1, img_2):
        img = img_1 + img_2 - 1
        mask_1 = img  < 0 
        img = img * (1-mask_1)
        return img
    
    # 线性减淡
    def Linear_dodge(img_1, img_2):
        img = img_1 + img_2
        mask_2 = img  > 1
        img = img * (1-mask_2) + mask_2
        return img
    
    # 变亮
    def Lighten(img_1, img_2):
        img = img_1 - img_2
        mask = img > 0
        img = img_1 * mask + img_2 * (1-mask) 
    
        return img 
    
    # 变暗
    def Dark(img_1, img_2):
        img = img_1 - img_2
        mask = img < 0
        img = img_1 * mask + img_2 * (1-mask) 
    
        return img 
    
    # 滤色
    def Screen(img_1, img_2):
        img = 1- (1-img_1)*(1-img_2)
    
        return img
    
    # 叠加
    def Overlay(img_1, img_2):
        mask = img_2 < 0.5
        img = 2 * img_1 * img_2 * mask + (1-mask) * (1- 2 * (1-img_1)*(1-img_2))
    
        return img
    
    # 柔光
    def Soft_light(img_1, img_2):
        mask = img_1 < 0.5
        T1 = (2 * img_1 -1)*(img_2 - img_2 * img_2) + img_2
        T2 = (2 * img_1 -1)*(np.sqrt(img_2) - img_2) + img_2
        img = T1 * mask + T2 * (1-mask)
    
        return img
    
    # 强光
    def Hard_light(img_1, img_2):
        mask = img_1 < 0.5
        T1 = 2 * img_1 * img_2
        T2 = 1 - 2 * (1 - img_1) * (1 - img_2)
        img = T1 * mask + T2 * (1-mask)
    
        return img
    
    # 亮光
    def Vivid_light(img_1, img_2):
        mask = img_1 < 0.5
        T1 = 1 - (1 - img_2)/(2 * img_1 + 0.001)
        T2 = img_2 / (2*(1-img_1) + 0.001)
        mask_1 = T1 < 0
        mask_2 = T2 > 1
        T1 = T1 * (1-mask_1)
        T2 = T2 * (1-mask_2) + mask_2
        img = T1 * mask  + T2 * (1 - mask) 
    
        return img 
    
    # 点光
    def Pin_light(img_1, img_2):
        mask_1 = img_2 < (img_1 * 2 -1)
        mask_2 = img_2 > 2 * img_1
        T1 = 2 * img_1 -1 
        T2 = img_2
        T3 = 2 * img_1 
        img = T1 * mask_1 + T2 * (1 - mask_1) * (1 - mask_2) + T3 * mask_2
    
        return img
    
    # 线性光
    def Linear_light(img_1, img_2):
        img = img_2 + img_1 * 2 - 1
        mask_1 = img < 0
        mask_2 = img > 1
        img = img * (1-mask_1)
        img = img * (1-mask_2) + mask_2
    
        return img
    
    # 实色混合
    def Hard_mix(img_1, img_2):
        img = img_1 + img_2 
        mask = img_1 + img_2 > 1 
        img = img * (1-mask) + mask 
        img = img * mask
        return img
    
    
    alpha = 0.5
    
    # img = Transparent(img_1, img_2, alpha)
    # img = Multiply (img_1, img_2)
    # img = Color_burn(img_1, img_2)
    # img = Color_dodge(img_1, img_2)
    # img = Linear_burn(img_1, img_2)
    # img = Linear_dodge(img_1, img_2)
    # img = Lighten(img_1, img_2)
    # img = Dark (img_1, img_2)
    # img = Screen(img_1, img_2)
    # img = Overlay(img_1, img_2)
    # img = Soft_light(img_1, img_2)
    # img = Hard_light(img_1, img_2)
    # img = Vivid_light(img_1, img_2)
    # img = Pin_light(img_1, img_2)
    # img = Linear_light(img_1, img_2)
    img = Hard_mix(img_1, img_2)
    
    # show the image
    
    plt.figure(1)
    plt.imshow(img_1)
    plt.axis('off');
    
    plt.figure(2)
    plt.imshow(img_2)
    plt.axis('off');
    
    plt.figure(3)
    plt.imshow(img)
    plt.axis('off');
    
    plt.show()
    

    所有的算法原理以及效果图可以参考我以前的博客:

    http://blog.csdn.net/matrix_space/article/details/22416241

    http://blog.csdn.net/matrix_space/article/details/22425209

    http://blog.csdn.net/matrix_space/article/details/22426633

    http://blog.csdn.net/matrix_space/article/details/22427285

    http://blog.csdn.net/matrix_space/article/details/22488159

    http://blog.csdn.net/matrix_space/article/details/22488467

  • 相关阅读:
    phpMyAdmin出现错误 Access denied for user 'root'@'localhost' (using password: NO)
    Android使用butterknife注解出现nullPointerException解决
    Fragment Touch事件泄露
    清空Fragment回退栈中某个Fragment之上的所有Fragment
    Fragment保持状态切换
    点击EditText可编辑,点击其他地方不可编辑
    android ActionBar 去掉menu分隔线
    jquery validation remote进行唯一性验证时只使用自定义参数,不使用默认参数
    php 闭包函数
    phpstorm快捷按键
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9412407.html
Copyright © 2011-2022 走看看