python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图


Posted in Python onAugust 04, 2020

因为最近在做深度学习抠图,正好要用到蒙版进行抠图,所以我将抠图代码进行了封装注释,可以直接使用。可能走了弯路,若有高见请一定提出!

主要代码

import cv2
from PIL import Image
import numpy as np


class UnsupportedFormat(Exception):
 def __init__(self, input_type):
  self.t = input_type

 def __str__(self):
  return "不支持'{}'模式的转换,请使用为图片地址(path)、PIL.Image(pil)或OpenCV(cv2)模式".format(self.t)


class MatteMatting():
 def __init__(self, original_graph, mask_graph, input_type='path'):
  """
  将输入的图片经过蒙版转化为透明图构造函数
  :param original_graph:输入的图片地址、PIL格式、CV2格式
  :param mask_graph:蒙版的图片地址、PIL格式、CV2格式
  :param input_type:输入的类型,有path:图片地址、pil:pil类型、cv2类型
  """
  if input_type == 'path':
   self.img1 = cv2.imread(original_graph)
   self.img2 = cv2.imread(mask_graph)
  elif input_type == 'pil':
   self.img1 = self.__image_to_opencv(original_graph)
   self.img2 = self.__image_to_opencv(mask_graph)
  elif input_type == 'cv2':
   self.img1 = original_graph
   self.img2 = mask_graph
  else:
   raise UnsupportedFormat(input_type)

 @staticmethod
 def __transparent_back(img):
  """
  :param img: 传入图片地址
  :return: 返回替换白色后的透明图
  """
  img = img.convert('RGBA')
  L, H = img.size
  color_0 = (255, 255, 255, 255) # 要替换的颜色
  for h in range(H):
   for l in range(L):
    dot = (l, h)
    color_1 = img.getpixel(dot)
    if color_1 == color_0:
     color_1 = color_1[:-1] + (0,)
     img.putpixel(dot, color_1)
  return img

 def save_image(self, path, mask_flip=False):
  """
  用于保存透明图
  :param path: 保存位置
  :param mask_flip: 蒙版翻转,将蒙版的黑白颜色翻转;True翻转;False不使用翻转
  """
  if mask_flip:
   img2 = cv2.bitwise_not(self.img2) # 黑白翻转
  image = cv2.add(self.img1, img2)
  image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) # OpenCV转换成PIL.Image格式
  img = self.__transparent_back(image)
  img.save(path)

 @staticmethod
 def __image_to_opencv(image):
  """
  PIL.Image转换成OpenCV格式
  """
  img = cv2.cvtColor(np.asarray(image), cv2.COLOR_RGB2BGR)
  return img

使用示例

mm = MatteMatting("input.jpg", "mask.jpg")
mm.save_image("output.png", mask_flip=True) # mask_flip是指蒙版翻转,即把白色的变成黑色的,黑色的变成白色的

效果展示

input.jpg

python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图

mask.jpg

python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图

output.png

python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图

到此这篇关于python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图的文章就介绍到这了,更多相关python 输出透明背景图内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python重新引入被覆盖的自带function
Jul 16 Python
低版本中Python除法运算小技巧
Apr 05 Python
深入理解Python中命名空间的查找规则LEGB
Aug 06 Python
django批量导入xml数据
Oct 16 Python
python 垃圾收集机制的实例详解
Aug 20 Python
django-rest-framework解析请求参数过程详解
Jul 18 Python
Django model 中设置联合约束和联合索引的方法
Aug 06 Python
Python 中判断列表是否为空的方法
Nov 24 Python
python对数组进行排序,并输出排序后对应的索引值方式
Feb 28 Python
Python enumerate() 函数如何实现索引功能
Jun 29 Python
浅谈python锁与死锁问题
Aug 14 Python
写一个Python脚本下载哔哩哔哩舞蹈区的所有视频
May 31 Python
Python如何给函数库增加日志功能
Aug 04 #Python
pycharm导入源码的具体步骤
Aug 04 #Python
python根据用户需求输入想爬取的内容及页数爬取图片方法详解
Aug 03 #Python
Python 如何调试程序崩溃错误
Aug 03 #Python
Python 捕获代码中所有异常的方法
Aug 03 #Python
Python连接mysql数据库及简单增删改查操作示例代码
Aug 03 #Python
Python pip使用超时问题解决方案
Aug 03 #Python
You might like
用libtemplate实现静态网页生成
2006/10/09 PHP
PHP处理SQL脚本文件导入到MySQL的代码实例
2014/03/17 PHP
Codeigniter框架实现获取分页数据和总条数的方法
2014/12/05 PHP
Laravel框架学习笔记之批量更新数据功能
2019/05/30 PHP
详解php反序列化
2020/06/10 PHP
ext读取两种结构的xml的代码
2008/11/05 Javascript
JavaScript通过正则表达式实现表单验证电话号码
2014/03/07 Javascript
js判断iframe内的网页是否滚动到底部触发事件
2014/03/18 Javascript
jQuery构造函数init参数分析续
2015/05/13 Javascript
javascript实现Table排序的方法
2015/05/15 Javascript
JavaScript提高网站性能优化的建议(二)
2016/07/24 Javascript
AngularJS入门教程之Scope(作用域)
2016/07/27 Javascript
Angular 4 指令快速入门教程
2017/06/07 Javascript
Angular2.0/4.0 使用Echarts图表的示例代码
2017/12/07 Javascript
node中间层实现文件上传功能
2018/06/11 Javascript
Node.js API详解之 assert模块用法实例分析
2020/05/26 Javascript
[05:22]DOTA2 2015国际邀请赛中国区预选赛首日TOP10
2015/05/26 DOTA
[51:29]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
详解python3实现的web端json通信协议
2016/12/29 Python
python使用SMTP发送qq或sina邮件
2017/10/21 Python
详解Python基础random模块随机数的生成
2019/03/23 Python
不到40行代码用Python实现一个简单的推荐系统
2019/05/10 Python
python队列原理及实现方法示例
2019/11/27 Python
总结Pyinstaller的坑及终极解决方法(小结)
2020/09/21 Python
python如何调用百度识图api
2020/09/29 Python
MADE荷兰:提供原创设计师家具
2018/04/03 全球购物
求职自荐书范文
2013/12/04 职场文书
吸烟检讨书2000字
2014/02/13 职场文书
《威尼斯的小艇》教学反思
2014/02/17 职场文书
高三毕业典礼演讲稿
2014/05/13 职场文书
春节联欢会策划方案
2014/05/16 职场文书
毕业生代领毕业材料的授权委托书
2014/09/29 职场文书
服务整改报告
2014/11/06 职场文书
2014年小学教学工作总结
2014/11/13 职场文书
证券区域经理岗位职责
2015/04/10 职场文书
python如何为list实现find方法
2022/05/30 Python