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正则表达式介绍
Aug 06 Python
python入门之语句(if语句、while语句、for语句)
Jan 19 Python
Python的requests网络编程包使用教程
Jul 11 Python
解决Tensorflow安装成功,但在导入时报错的问题
Jun 13 Python
win10系统下Anaconda3安装配置方法图文教程
Sep 19 Python
对python读写文件去重、RE、set的使用详解
Dec 11 Python
实例详解Python模块decimal
Jun 26 Python
Python版中国省市经纬度
Feb 11 Python
python连接mongodb集群方法详解
Feb 13 Python
Django ValuesQuerySet转json方式
Mar 16 Python
使用Jupyter notebooks上传文件夹或大量数据到服务器
Apr 14 Python
Python新手如何理解循环加载模块
May 29 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
萌王史莱姆”萌王性别尴尬!那“萌战”归女组还是男?
2018/12/17 日漫
php网站来路获取代码(针对搜索引擎)
2010/06/08 PHP
Uncaught exception com_exception with message Failed to create COM object
2012/01/11 PHP
Smarty模板学习笔记之Smarty简介
2014/05/20 PHP
解决CodeIgniter伪静态失效
2014/06/09 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
2017/11/14 PHP
PHP实现基于状态的责任链审批模式详解
2019/05/31 PHP
php 输出缓冲 Output Control用法实例详解
2020/03/03 PHP
一个简单的瀑布流效果(主体形式自写)
2013/05/27 Javascript
jQuery中使用Ajax获取JSON格式数据示例代码
2013/11/26 Javascript
理解JavaScript的变量的入门教程
2015/07/07 Javascript
高效的jquery数字滚动特效
2015/12/17 Javascript
基于jquery日历价格、库存等设置插件
2020/07/05 jQuery
Angular4学习教程之DOM属性绑定详解
2018/01/04 Javascript
微信小程序上传图片功能(附后端代码)
2020/06/19 Javascript
基于layui数据表格以及传数据的方式
2018/08/19 Javascript
vue-lazyload使用总结(推荐)
2018/11/01 Javascript
微信小程序实现无限滚动列表
2020/05/29 Javascript
Python进行数据提取的方法总结
2016/08/22 Python
Python常用库推荐
2016/12/04 Python
Python算法应用实战之栈详解
2017/02/04 Python
python 环境变量和import模块导入方法(详解)
2017/07/11 Python
Python实现爬取需要登录的网站完整示例
2017/08/19 Python
python 实现一个贴吧图片爬虫的示例
2017/10/12 Python
对python cv2批量灰度图片并保存的实例讲解
2018/11/09 Python
python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能
2019/07/04 Python
图解python全局变量与局部变量相关知识
2019/11/02 Python
LEGO玩具英国官方商店:LEGO Shop GB
2018/03/27 全球购物
新闻编辑自荐信
2013/11/03 职场文书
销售辞职报告范文
2014/01/12 职场文书
买房子个人收入证明
2014/01/16 职场文书
汽车专业求职信
2014/06/05 职场文书
无房证明样本
2015/06/17 职场文书
小学生六年级作文之关于感恩
2019/08/16 职场文书
教你如何用python开发一款数字推盘小游戏
2021/04/14 Python
Vue + iView实现Excel上传功能的完整代码
2021/06/22 Vue.js