技巧一, 利用颜色数值的和进行黑白色的操作

		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] :
numpy中图片颜色替换和过滤操作技巧_颜色值
下面是两图叠加的计算公式

这里是一个常见的透明化计算公式(对应 AlphaComposite.SrcOver):
Ar = As + Ad * (1 – As)
Cr = Cs + Cd * (1 – As)
Ar = 结果透明度分量
As = 源像素透明度分量
Ad = 目标区域透明度分量
Cr = 结果 RGB 分量
Cs = 源像素 RGB 分量
Cd = 目标区域 RGB 分量
效果如下图
numpy中图片颜色替换和过滤操作技巧_归一化_02

Ar = As * (1 – Ad) + Ad * As = As
Cr = Cs * (1 – Ad) + Cd * As
效果如下图
numpy中图片颜色替换和过滤操作技巧_归一化_03

Ar = Ad * As
Cr = Cd * As
效果如下图
numpy中图片颜色替换和过滤操作技巧_归一化_04
Ar = Ad * (1 – As)
Cr = Cd * (1 – As)
效果如下图
numpy中图片颜色替换和过滤操作技巧_归一化_05
Ar = As * (1 – Ad) + Ad
Cr = Cs * (1 – Ad) + Cd
numpy中图片颜色替换和过滤操作技巧_颜色值_06

Ar = As
Cr = Cs
numpy中图片颜色替换和过滤操作技巧_颜色值_07

Ar = As * Ad + Ad * (1 – As) = Ad
Cr = Cs * Ad + Cd * (1 – As)
numpy中图片颜色替换和过滤操作技巧_颜色值_08

Ar = As * Ad
Cr = Cs * Ad
numpy中图片颜色替换和过滤操作技巧_归一化_09
Ar = As * (1 – Ad)
Cr = Cs * (1 – Ad)

numpy中图片颜色替换和过滤操作技巧_归一化_10

Ar = As * (1 – Ad) + Ad * (1 – As)
Cr = Cs * (1 – Ad) + Cd * (1 – As)
numpy中图片颜色替换和过滤操作技巧_颜色值_11

先学习一下如何添加维度

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