技巧一, 利用颜色数值的和进行黑白色的操作
npImg = np.array(img)
yansemask = npImg[:,:,0] + npImg[:,:,1] + npImg[:,:,2] # 将3个通道的颜色值加起来, ==0 的是黑色, 等于 255 * 3 =765 的是白色
npImg[yansemask == 0] = 255 # 黑色的全变成白色
npImg[yansemask != 0] = 0 # 不是黑色的改成黑色.
技巧二, 利用颜色数值带位置信息的和的操作
npImg = np.array(img)
yansemask = npImg[:,:,0] * 1000000 + npImg[:,:,1] * 1000 + npImg[:,:,2] # 将3个通道的颜色值加起来, 红色的代码是 (255,0,0) 那么它的数值为2550000
#RGB适用
npImg[yansemask == 255000000] = 255 # 红色的全变成白色 RGB适用,RGBA则应改成下面这种
#RGBA 适用
for i in range(3):
npImg[:,:,i][yansemask == 255000000] = 255
#红色的单个手动改成绿色
npImg[:,:,0][yansemask == 255000000] = 0 #R
npImg[:,:,1][yansemask == 255000000] = 255 #G
npImg[:,:,2][yansemask == 255000000] = 0 #B
#红色的单个手动改成蓝色
npImg[:,:,0][yansemask == 255000000] = 0 #R
npImg[:,:,1][yansemask == 255000000] = 0 #G
npImg[:,:,2][yansemask == 255000000] = 255 #B
#此种操作执行速度快, 不用转来转去
技巧三. 利用 & 操作, 进行特殊颜色的过滤
npImg = np.array(img)
heisemask = (touQianTuImg[:,:,0] == 0 ) & (touQianTuImg[:,:,1] == 0 ) & (touQianTuImg[:,:,2] == 0 ) # 黑色
redmask = (touQianTuImg[:,:,0] == 255) & (touQianTuImg[:,:,1] == 0) & (touQianTuImg[:,:,2] == 0 ) # 红色
npImg[redmask == 0] = 255 # 红色的全变成白色
计划写一个numpy实现的代码替代 Image.alpha_composite 因为开发的时候经常用numpy处理图片, 再用Image要转来转去的消耗性能. 所以这里就直接一次性的实现这个功能.
半透明度计算公式,
参考 https://tieba.baidu.com/p/1787344682?red_tag=2980061745
阿尔法通道的图像中的任意一点的像素值计算结果如下 [1] :
下面是两图叠加的计算公式
这里是一个常见的透明化计算公式(对应 AlphaComposite.SrcOver):
Ar = As + Ad * (1 – As)
Cr = Cs + Cd * (1 – As)
Ar = 结果透明度分量
As = 源像素透明度分量
Ad = 目标区域透明度分量
Cr = 结果 RGB 分量
Cs = 源像素 RGB 分量
Cd = 目标区域 RGB 分量
效果如下图
Ar = As * (1 – Ad) + Ad * As = As
Cr = Cs * (1 – Ad) + Cd * As
效果如下图
Ar = Ad * As
Cr = Cd * As
效果如下图
Ar = Ad * (1 – As)
Cr = Cd * (1 – As)
效果如下图
Ar = As * (1 – Ad) + Ad
Cr = Cs * (1 – Ad) + Cd
Ar = As
Cr = Cs
Ar = As * Ad + Ad * (1 – As) = Ad
Cr = Cs * Ad + Cd * (1 – As)
Ar = As * Ad
Cr = Cs * Ad
Ar = As * (1 – Ad)
Cr = Cs * (1 – Ad)
Ar = As * (1 – Ad) + Ad * (1 – As)
Cr = Cs * (1 – Ad) + Cd * (1 – As)
先学习一下如何添加维度
import numpy as np
import cv2
'''
这里需要改一下默认通道顺序,cv2默认的是bgr顺序
'''
img = cv2.imread('./xx.jpeg')[:, :, [2, 1, 0]]
'''
归一化 到 0 ~ 1
'''
img = img/255
Red = img[:, :, 0] * 0.3
Green = img[:, :, 1] * 0.6
Blue = img[:, :, 2] * 0.1
new_img = np.stack((Red, Green, Blue), axis=2)
在附送一个代码 RGB2RGBA的转换代码
def numpy_RGB2RGBA(img):
# 增加一个不透明的A通道
return np.dstack((img, np.ones(img.shape[0:2]) * 255 ))
实现透明图叠加到底图上, 透明部分显示底图功能.目标是用numpy替代 Image.alpha_composite
减少转来转去的浪费. 不知道是否能够完全替代
def numpy_alpha_composite(img,mask):
'''
替代 Image.alpha_composite
'''
output = np.ones(img.shape, dtype=img.dtype) * 255
maska = mask[:, :, 3]
for i in range(3):
# output[:, :, i] = img[:, :, i] * (img[:,:,3]/255) + mask[:, :, i] * ( 1 - mask[:,:,3]/255)
output[:, :, i] = img[:, :, i] * ( 1 - maska/255) + mask[:, :, i] * (maska/255)
return output