最近在研究将一张白色大背景图片中间图片内容的颜色透明化,用于前端选择颜色替换颜色的可视化效果的前期图片数据处理的透明化图片数据做准备。
尝试了蒙版但是效果不是太好,可能还没研究透吧,先分享一个经过训练效果还可用的算法。
首先我们要实现下面的效果也就是小鸭子的帽子和领子原图是黑色的做成前端可自由调配颜色的效果:
为了实现上面的效果,首先我们需要将帽子、眼睛、领带的部分进行透明化处理,此时我尝试使用python的PIL 和 haishoku代码如下:
#!/usr/bin/python3
# -*- coding: UTF-8 -*-
import cv2
import numpy as np
from PIL import Image
from haishoku.haishoku import Haishoku
def Dominant_Hue_hyalinize(image):
dominant = Haishoku.getDominant(image) #获取图片主色调
palette = Haishoku.getPalette(image) #获取图片主色调数组
#主色调数组长度
arrLen = len(palette)
if arrLen < 1 :
return "失败1"
else:
if arrLen<8 :
#主色调大于5组小于8组的则按照第三组颜色的小数值进行,否则在此基础上减去0.2
arrLenNum = ( arrLen+1 )/10 if arrLen > 5 else ( arrLen+1 )/10 -0.2
else:
#主色调超过8组的 调小替换透明的范围
arrLenNum = ( arrLen+1 )/10 - 0.5
#主色调最多的颜色进行统计总和
nums = sum(dominant)
#如果第一主色调综合大于750且在(250,250,250)颜色值上的则flag设置为一,用于下方数组的保留白色大背景
flag = 1 if dominant[0] >= 250 and nums >= 750 else 0
leftarrMax = []
for index,item in enumerate(palette):
#小数值*100转整型判断大于0的则视为要替换颜色的范围数组
per = int(item[0]*100)
if flag and index !=0 and per>0:
leftarrMax.append((item[1][0],item[1][1],item[1][2]))
if len(leftarrMax)<1 :
return "失败"
else:
#打开图片进行透明化颜色的替换
img = Image.open(image)
planeIm = img.convert('RGBA')
img.close()
#获取图片颜色数组
datas = planeIm.getdata()
newData = []
for item in datas:
if item[0] <= leftarrMax[0][0]*0.2 or item[0] < leftarrMax[1][0] * arrLenNum:
newData.append((255, 255, 255, 0)) # 透明化
else:
newData.append(item) #颜色不变化
planeIm.putdata(newData)
planeIm.show() #显示效果
planeIm.save('output.png', "PNG") #存储数据图到本地
planeIm.close()
return "成功"
image = "img/1.png"
status = Dominant_Hue_hyalinize(image)
print(status)
最终 运行后的效果如图:
剩下切换效果的部分就不再这里赘述了,直接参考Jquery相关效果替换背景颜色就可以达到效果。
background-color: rgba(245, 25, 45, 0.55);