numpy中图片颜色替换和过滤操作技巧

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

		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

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值