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爬取APP下载链接的实现方法
Sep 30 Python
用python写一个windows下的定时关机脚本(推荐)
Mar 21 Python
python模拟登录并且保持cookie的方法详解
Apr 04 Python
python基于ID3思想的决策树
Jan 03 Python
Python实现求解括号匹配问题的方法
Apr 17 Python
python中不能连接超时的问题及解决方法
Jun 10 Python
Python3 chardet模块查看编码格式的例子
Aug 14 Python
Python3 中作为一等对象的函数解析
Dec 11 Python
xadmin使用formfield_for_dbfield函数过滤下拉表单实例
Apr 07 Python
python爬虫 requests-html的使用
Nov 30 Python
Pytorch实现图像识别之数字识别(附详细注释)
May 11 Python
django学习之ajax post传参的2种格式实例
May 14 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
一个很方便的 XML 类!!原创的噢
2006/10/09 PHP
PHP中的CMS的涵义
2007/03/11 PHP
php xml文件操作实现代码(二)
2009/03/20 PHP
PHP如何解决网站大流量与高并发的问题
2011/06/25 PHP
php实现在线生成条形码示例分享(条形码生成器)
2013/12/30 PHP
php 发送带附件邮件示例
2014/01/23 PHP
基于PHP实现商品成交时发送短信功能
2016/05/11 PHP
JavaScript XML和string相互转化实现代码
2011/07/04 Javascript
jquery.ajax的url中传递中文乱码问题的解决方法
2014/02/07 Javascript
js设置function参数默认值(适合没有传参情况)
2014/02/24 Javascript
node.js中的fs.exists方法使用说明
2014/12/17 Javascript
jquery ajax结合thinkphp的getjson实现跨域的方法
2016/06/06 Javascript
浅谈JavaScript函数的四种存在形态
2016/06/08 Javascript
详解Angular6学习笔记之主从组件
2018/09/05 Javascript
vue addRoutes路由动态加载操作
2020/08/04 Javascript
JavaScript array常用方法代码实例详解
2020/09/02 Javascript
微信小程序实现电影App导航和轮播
2020/11/30 Javascript
详解JavaScript中分解数字的三种方法
2021/01/05 Javascript
[00:58]2016年国际邀请赛勇士令状宣传片
2016/06/01 DOTA
Python装饰器基础详解
2016/03/09 Python
Python极简代码实现杨辉三角示例代码
2016/11/15 Python
python实现字典(dict)和字符串(string)的相互转换方法
2017/03/01 Python
Python实现曲线点抽稀算法的示例
2017/10/12 Python
python实现银行管理系统
2019/10/25 Python
Django 实现外键去除自动添加的后缀‘_id’
2019/11/15 Python
Python定义函数时参数有默认值问题解决
2019/12/19 Python
python属于解释语言吗
2020/06/11 Python
python如何导出微信公众号文章方法详解
2020/08/31 Python
css3中flex布局宽度不生效的解决
2020/12/09 HTML / CSS
印度购物网站:TATA CLiQ
2017/11/23 全球购物
Static Nested Class 和 Inner Class的不同
2013/11/28 面试题
装饰公司活动策划方案
2014/08/23 职场文书
2015教师年度思想工作总结
2015/04/30 职场文书
小程序与后端Java接口交互实现HelloWorld入门
2021/07/09 Java/Android
python中validators库的使用方法详解
2022/09/23 Python