作用结果和正片叠底刚好相反,它是将两个颜色的互补色的像素值相乘,然后除以255得到的最终色的像素值。
在保留底色明暗变化的基础上使用“正片叠底”或“滤色”模式,绘图的颜色被叠加到底色上,但保留底色的高光和阴影部分。
简而言之:矩阵表达式为 dst = src1 * alpha + src2 * beta + gamma
g ( x ) = ( 1 − α ) f 0 ( x ) + α f 1 ( 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]]) → dst
src1 – 输入图片1.
alpha – 图片1的权重
src2 – 输入图片2(image.shape & channel 相同)
beta – 图片2的权重
dst – 目标图片
gamma – 标量求和.
dtype – 输出图片数组深度,当两个输入数组具有相同的深度时,
可以将dtype设置为-1,这相当于src1..()。
"""
import cv2
import numpy as np
def 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 dist
def addImage(img1, img2,alpha):
h, w, _ = img1.shape
"""
函数要求两张图必须是同一个size
alpha,beta,gamma可调
"""
img2 = cv2.resize(img2, (w, h), interpolation=cv2.INTER_AREA)
beta = 1 - alpha
gamma = 0
img_add = cv2.addWeighted(img1, alpha, img2, beta, gamma)
return img_add
if __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