Python-OpenCV 图像加权混合(滤色, 叠加, 柔光, 强光)
OpenCV 图像混合模式
- 一、图像混合原理
- 1.1 滤色模式
- 1.2 叠加模式
- 1.3 柔光模式
- 1.4 强光模式
- 二、线性混合(相加)
一、图像混合原理
1.1 滤色模式
作用结果和正片叠底刚好相反,它是将两个颜色的互补色的像素值相乘,然后除以255得到的最终色的像素值。
- 通常执行滤色模式后的颜色都较浅:
任何颜色和黑色执行滤色,原色不受影响;
任何颜色和白色执行滤色得到的是白色;
而与其他颜色执行滤色会产生漂白的效果。 - Screen 滤色
C=1−(1−A)×(1−B)C=1-(1-A)×(1-B)C=1−(1−A)×(1−B) 也可以写成 1-C=(1-A)*(1-B)
该模式和上一个模式刚好相反,上下层像素的标准色彩值反相后相乘后输出,输出结果比两者的像素值都将要亮(就好像两台投影机分别对其中一个图层进行投影后,然后投射到同一个屏幕上)。从第二个公式中我们可以看出,如果两个图层反相后,采用Multiply模式混合,则将和对这两个图层采用 Screen模式混合后反相的结果完全一样。
1.2 叠加模式
在保留底色明暗变化的基础上使用“正片叠底”或“滤色”模式,绘图的颜色被叠加到底色上,但保留底色的高光和阴影部分。
- 底色的颜色没有被取代,而是和绘图色混合来体现原图的亮部和暗部。
使用此模式可使底色的图像的饱和度及对比度得到相应的提高,使图像看起来更加鲜亮。 - Overlay 叠加
B⩽0.5:C=2×A×BB \leqslant 0.5: C=2×A×BB⩽0.5:C=2×A×B
B>0.5:C=1−2×(1−A)×(1−B)B>0.5: C=1-2×(1-A)×(1-B)B>0.5:C=1−2×(1−A)×(1−B)
依据下层色彩值的不同,该模式可能是Multiply,也可能是Screen模式。上层决定了下层中间色调偏移的强度。- 如果上层为50%灰,则结果将完全为下层像素的值。
- 如果上层比50%灰暗,则下层的中间色调的将向暗地方偏移,
对于上层比50%灰暗,下层中间色调以下的色带变窄(原来为0~2*0.4*0.5,现在为0~2*0.3*0.5),中间色调以上的色带变宽(原来为20.40.5~1,现在为2*0.3*0.5~1)。反之亦然。 - 如果上层比50%灰亮,则下层的中间色调的将向亮地方偏移。
1.3 柔光模式
- 根据绘图色的明暗程度来决定最终色是变亮还是变暗:
当绘图色比50%的灰要亮时,则 底色图像变亮。
当绘图色比50%的灰要暗时,则底色图像就变暗。
如果绘图色有纯黑色或纯白色,最终色不是黑色或白色,而是稍微变暗或变亮。
如果底色是纯白色或纯黑色,不产生任何效果。此效果与发散的聚光灯照在图像上相似。 - Soft Light 柔光(叠加时去除灰色调)
A⩽0.5:C=(2∗A−1)∗(B−B∗B)+BA \leqslant 0.5: C=(2*A-1)*(B-B*B)+BA⩽0.5:C=(2∗A−1)∗(B−B∗B)+B
A>0.5:C=(2∗A−1)∗(sqrt(B)−B)+BA>0.5 : C=(2*A-1)*(sqrt(B)-B)+BA>0.5:C=(2∗A−1)∗(sqrt(B)−B)+B
混合色 <=128:结果色 = 基色 + (2 * 混合色 - 255) * (基色 - 基色 * 基色 / 255) / 255;
混合色 >128: 结果色 = 基色 + (2 * 混合色 - 255) * (Sqrt(基色/255)*255 - 基色)/255。
该模式类似上层以Gamma值范围为2.0到0.5的方式来调制下层的色彩值。结果将是一个非常柔和的组合。
1.4 强光模式
- 根据绘图色来决定是执行“正片叠底”还是“滤色”模式。
当绘图色比50%的灰要亮 时,则底色变亮,就执行“滤色”模式一样,这对增加图像的高光非常有帮助;
当绘图色比50%的灰要暗时,则底色变暗,就执行“正片叠底”模式一样,可增加 图像的暗部。
当绘图色是纯白色或黑色时得到的是纯白色和黑色。此效果与耀眼的聚光灯照在图像上相似。 - Hard Light 强光
A⩽0.5:C=2∗A∗BA\leqslant0.5: C=2*A*BA⩽0.5:C=2∗A∗B
A>0.5:C=1−2∗(1−A)∗(1−B)A>0.5: C=1-2*(1-A)*(1-B)A>0.5:C=1−2∗(1−A)∗(1−B)
该模式完全相对应于Overlay模式下,两个图层进行次序交换的情况。如过上层的颜色高于50%灰,则下层越亮,反之越暗。
二、线性混合(相加)
简而言之:矩阵表达式为 dst = src1 * alpha + src2 * beta + gamma
g(x)=(1−α)f0(x)+αf1(x)g(x) = (1-\alpha)f_0(x)+\alpha f_1(x)g(x)=(1−α)f0(x)+αf1(x)
"""
cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) → dstsrc1 – 输入图片1.alpha – 图片1的权重src2 – 输入图片2(image.shape & channel 相同)beta – 图片2的权重dst – 目标图片gamma – 标量求和.dtype – 输出图片数组深度,当两个输入数组具有相同的深度时,可以将dtype设置为-1,这相当于src1..()。
"""
import cv2
import numpy as npdef img_filter(img): #计算图像梯度(高反差像素)x=cv2.Sobel(img,cv2.CV_16S,1,0)y=cv2.Sobel(img,cv2.CV_16S,0,1)absx=cv2.convertScaleAbs(x)absy=cv2.convertScaleAbs(y)dist=cv2.addWeighted(absx,0.5,absy,0.5,0)return distdef addImage(img1, img2,alpha):h, w, _ = img1.shape"""函数要求两张图必须是同一个sizealpha,beta,gamma可调"""img2 = cv2.resize(img2, (w, h), interpolation=cv2.INTER_AREA)beta = 1 - alphagamma = 0img_add = cv2.addWeighted(img1, alpha, img2, beta, gamma)return img_addif __name__ == '__main__':img1=cv2.imread('R_channel.png',cv2.IMREAD_COLOR) # 以彩色图的形式读入dist_img = img_filter(img1) # 执行高通过滤for i in range(1,10): # 循环执行(不同的alpha):显示叠加图,写入处理后的图像IMG_Add = addImage(img1,dist_img,i*0.1) # alpha,beta,gamma可调cv2.imshow('img_add_'+ str(i), IMG_Add)cv2.imwrite('img_add_'+ str(i)+".png", IMG_Add)cv2.imshow("img1",img1)# cv2.waitKey()# cv2.destroyAllWindows()
参考与鸣谢:
python 图层混合大全:https://blog.csdn.net/chy555chy/article/details/54016317
图层混合原理
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
https://blog.csdn.net/matrix_space/article/details/72284090
Python-OpenCV 图像加权混合(滤色, 叠加, 柔光, 强光)相关推荐
- python opencv 图像膨胀
python opencv 图像膨胀 代码: import cv2 import numpy as np # 图像膨胀 def dilate_img(img,a,iterations):kernel ...
- python opencv 图像旋转
python opencv 图像旋转 原图 顺时针旋转 代码: import cv2 path = '2.jpg' img = cv2.imread(path,1) trans_img = cv2.t ...
- python opencv图像二值化函数_python opencv 二值化 计算白色像素点的实例
python opencv 二值化 计算白色像素点的实例 贴部分代码 #! /usr/bin/env python # -*- coding: utf-8 -*- import cv2 import ...
- 【Python+OpenCV 图像透视变换 warpPerspective函数】
Python+OpenCV 图像透视变换 warpPerspective函数 1.函数介绍 2.代码实例 3.实现效果 1.函数介绍 warpPerspective():对图像进行透视变换.简单来说, ...
- 【Python+OpenCV 图像的缩放和裁剪】
Python+OpenCV 图像的缩放和裁剪 代码部分 实现效果 代码部分 import cv2 import numpy as npimg = cv2.imread("Photos/1.b ...
- Python OpenCV 图像缩放 cv2.resize 方法
今天是持续写作的第 42 / 100 天. 如果你有想要交流的想法.技术,欢迎在评论区留言. 本篇博客只学习一个方法,cv2.resize 即图像缩放. 取经之旅第 9 天 铺垫知识 resize 方 ...
- Python OpenCV 图像平移,取经之旅第 10 天
今天是持续写作的第 43 / 100 天. 如果你有想要交流的想法.技术,欢迎在评论区留言. 本篇博客学习 OpenCV 中关于图像平移的方法,核心学习到的方法是 warpAffine . 取经之旅第 ...
- Python OpenCV 图像的几何变换,先说不平凡的 resize 函数
Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧.本篇博客是这个系列的第 41 篇. 该系列文章导航参考:https://blog.csdn.net/hihell/categ ...
- OpenCV 图像的混合
图像混合的计算公式如下: g(x) = (1-α)f0(x) +αf1(x) 通过修改α的值(0 → 1),可以实现混合 函数cv2.addWeighted()可以按下面的公式对图片进行混合操作. d ...
最新文章
- 【JavaWeb】servlet与http请求协议
- layUI 学习记录
- Codeforces Round 550 (Div.3) 题解
- java注解接收上传文件,前台:Input type=file 后台获取文件内容用的是spring注解,当地环境上传图片是好的,发布到服务器上图片读取不到,求大神指点...
- 前端公共库CDN加速
- 必须学会使用的35个Jquery小技巧
- 用反射方法使用户控件动态调用父页面的方法
- C#开发微信门户及应用(17)-微信企业号的通讯录管理开发之部门管理
- IOS开发 ios7适配
- python web框架哪个好_盘点:9款流行Web框架及其优缺点
- @Value取值为NULL的解决方案
- ASP.net揭秘笔记
- 官方配置要求_《魔兽争霸3》重制版极客装机配置和官方要求配置
- [转]30个总结JVM虚拟机的技术文排版好(收藏版)
- 浅谈敏捷管理工具:看板(Kanban)
- iOS --- 使用Mixpanel来统计和分析移动APP的用户数据
- 科目二考试之倒车入库步骤
- mysql将数据库表内容(表内字段/属性)导出为excel表格
- 如何查看.mdf文件数据库版本信息
- u8信息服务器,u8服务器的配置
热门文章
- java 情感分析_Alink中文情感分析示例(Java版本)
- 4.1 图像的几种色彩模式 [原创Ps教程]
- c语言里什么叫double,c语言double什么意思
- 柠檬班的课程怎么样,来自一个金融行业转行到软件测试行业的故事
- Plugin工具类-Unreal4源码拆解-UnrealBuildTool功能流程解析
- android https HttpsURLConnection 忽略证书
- 百度搜索引擎结果网址参数_反馈搜索结果用时(rsv_sug4)
- 百度搜索结果页面的参数 搜索历史记录(rsv_sug)
- sqlite3设置密码 password
- 物联网案例研究:确保格兰仕智能设备不易受黑客攻击