博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python: PS 图层混合算法汇总
阅读量:4698 次
发布时间:2019-06-09

本文共 3890 字,大约阅读时间需要 12 分钟。

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

import matplotlib.pyplot as pltfrom skimage import ioimport mathimport numpy as np# image fusionfile_name='D:/Visual Effects/PS Algorithm/2.jpg';img_1=io.imread(file_name)img_1 = img_1/255.0file_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 imgalpha = 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 imageplt.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()

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

转载于:https://www.cnblogs.com/mtcnn/p/9412407.html

你可能感兴趣的文章
一点小基础
查看>>
PHP 自动加载类 __autoload() 方法
查看>>
JDK中的Timer和TimerTask详解(zhuan)
查看>>
【python练习】ATM&购物商城程序
查看>>
nginx 日志问题(\x22)
查看>>
装饰器、迭代器、生成器
查看>>
类对象作为类成员
查看>>
面向对象和面向过程的区别及优劣对比详解
查看>>
const与指针
查看>>
thsi指针的一些用法及作用
查看>>
c++友元
查看>>
c++运算符重载
查看>>
一元运算符重载
查看>>
Windows 远程栈溢出挖掘
查看>>
(网页)the server responded with a status of 403 (Forbidden)
查看>>
葡萄城报表介绍:Java 报表
查看>>
android 通知消息一
查看>>
UNET学习笔记2 - 高级API(HLAPI)
查看>>
腾讯编程马拉松2012第一题
查看>>
Day18
查看>>