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 执行字符串表达式函数(eval exec execfile)
Aug 11 Python
Python入门篇之编程习惯与特点
Oct 17 Python
Python中使用PyQt把网页转换成PDF操作代码实例
Apr 23 Python
实例解析Python的Twisted框架中Deferred对象的用法
May 25 Python
浅谈Python数据类型判断及列表脚本操作
Nov 04 Python
python简易实现任意位数的水仙花实例
Nov 13 Python
Python2与Python3的区别实例总结
Apr 17 Python
Django中使用haystack+whoosh实现搜索功能
Oct 08 Python
python通过cython加密代码
Dec 11 Python
python中yield的用法详解
Jan 13 Python
浅析Python打包时包含静态文件处理方法
Jan 15 Python
Python异常类型以及处理方法汇总
Jun 05 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
php中使用getimagesize获取图片、flash等文件的尺寸信息实例
2014/04/29 PHP
浅谈php fopen下载远程文件的函数
2016/11/18 PHP
基于thinkPHP3.2实现微信接入及查询token值的方法
2017/04/18 PHP
laravel实现批量更新多条记录的方法示例
2017/10/22 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
javascript阻止浏览器后退事件防止误操作清空表单
2013/11/22 Javascript
javascript中的事件代理初探
2014/03/08 Javascript
使用Node.js配合Nginx实现高负载网络
2015/06/28 Javascript
JS数组合并push与concat区别分析
2015/12/17 Javascript
JavaScript 不支持 indexof 该如何解决
2016/03/30 Javascript
Javascript实现从小到大的数组转换成二叉搜索树
2017/06/13 Javascript
jQuery实现获取及设置CSS样式操作详解
2018/09/05 jQuery
深入了解JavaScript 私有化
2019/05/30 Javascript
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
使用grappelli为django admin后台添加模板
2014/11/18 Python
python通过pip更新所有已安装的包实现方法
2017/05/19 Python
python中的随机函数小结
2018/01/27 Python
对Python中plt的画图函数详解
2018/11/07 Python
python将控制台输出保存至文件的方法
2019/01/07 Python
基于YUV 数据格式详解及python实现方式
2019/12/09 Python
Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解
2020/02/14 Python
Django Form常用功能及代码示例
2020/10/13 Python
详解Python openpyxl库的基本应用
2021/02/26 Python
IE9下html5初试小刀
2010/09/21 HTML / CSS
cosme官方海外旗舰店:日本最大化妆品和美容产品的综合口碑网站
2017/01/18 全球购物
台湾森森购物网:U-mall
2017/10/16 全球购物
美国波西米亚风格服装品牌:Show Me Your Mumu
2018/01/05 全球购物
初中生个人学习的自我评价
2013/12/04 职场文书
采购主管的岗位职责
2013/12/17 职场文书
英语演讲稿范文
2014/01/03 职场文书
依法行政工作汇报材料
2014/10/28 职场文书
雷锋的观后感
2015/06/10 职场文书
员工手册董事长致辞
2015/07/29 职场文书
公司人力资源管理制度
2015/08/05 职场文书
电力安全教育培训心得体会
2016/01/11 职场文书
利用Nginx代理如何解决前端跨域问题详析
2021/04/02 Servers