Python将图片主色透明化算法

        最近在研究将一张白色大背景图片中间图片内容的颜色透明化,用于前端选择颜色替换颜色的可视化效果的前期图片数据处理的透明化图片数据做准备。

        尝试了蒙版但是效果不是太好,可能还没研究透吧,先分享一个经过训练效果还可用的算法。

        首先我们要实现下面的效果也就是小鸭子的帽子和领子原图是黑色的做成前端可自由调配颜色的效果:

        

 

 

        为了实现上面的效果,首先我们需要将帽子、眼睛、领带的部分进行透明化处理,此时我尝试使用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);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值