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 dict remove数组删除(del,pop)
Mar 24 Python
Python 的内置字符串方法小结
Mar 15 Python
Python数据结构之双向链表的定义与使用方法示例
Jan 16 Python
python实现word 2007文档转换为pdf文件
Mar 15 Python
python合并已经存在的sheet数据到新sheet的方法
Dec 11 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
Feb 21 Python
Python字典中的值为列表或字典的构造实例
Dec 16 Python
Python多重继承之菱形继承的实例详解
Feb 12 Python
django 数据库返回queryset实现封装为字典
May 19 Python
python中执行smtplib失败的处理方法
Jul 01 Python
Pycharm在指定目录下生成文件和删除文件的实现
Dec 28 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
php adodb连接不同数据库
2009/03/19 PHP
php 数组元素快速去重
2017/05/05 PHP
PHP vsprintf()函数格式化字符串操作原理解析
2020/07/14 PHP
拖动一个HTML元素
2006/12/22 Javascript
jQuery中filter(),not(),split()使用方法
2010/07/06 Javascript
javascript 数据类型转换(parseInt,parseFloat)
2010/07/20 Javascript
分析Node.js connect ECONNREFUSED错误
2013/04/09 Javascript
Javascript脚本实现静态网页加密实例代码
2013/11/05 Javascript
javascript实现粘贴qq截图功能(clipboardData)
2016/05/29 Javascript
AngularJS 中的事件详解
2016/07/28 Javascript
在html中引入外部js文件,并调用带参函数的方法
2016/10/31 Javascript
JavaScript中全选、全不选、反选、无刷新删除、批量删除、即点即改入库(在yii框架中操作)的代码分享
2016/11/01 Javascript
谈谈JavaScript数组常用方法总结
2017/01/24 Javascript
使用JS实现导航切换时高亮显示的示例讲解
2018/08/22 Javascript
浅谈高大上的微信小程序中渲染html内容—技术分享
2018/10/25 Javascript
Angular 实现输入框中显示文章标签的实例代码
2018/11/07 Javascript
基于vue hash模式微信分享#号的解决
2020/09/07 Javascript
js前端对于大量数据的展示方式及处理方法
2020/12/02 Javascript
[00:37]DOTA2上海特级锦标赛 OG战队宣传片
2016/03/03 DOTA
[49:05]Newbee vs TNC 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python学习之第三方包安装方法(两种方法)
2015/07/30 Python
学习python之编写简单乘法口诀表实现代码
2016/02/27 Python
python进程管理工具supervisor的安装与使用教程
2017/09/05 Python
对python遍历文件夹中的所有jpg文件的实例详解
2018/12/08 Python
python实现Flappy Bird源码
2018/12/24 Python
Python Django的安装配置教程图文详解
2019/07/17 Python
关于pytorch处理类别不平衡的问题
2019/12/31 Python
python实现微信打飞机游戏
2020/03/24 Python
pytorch中 gpu与gpu、gpu与cpu 在load时相互转化操作
2020/05/25 Python
浅谈h5自定义audio(问题及解决)
2016/08/19 HTML / CSS
美国鲍勃商店:Bob’s Stores
2018/07/22 全球购物
屈臣氏官方旗舰店:亚洲享负盛名的保健及美妆零售商
2019/03/15 全球购物
CSS实现fullpage.js全屏滚动效果的示例代码
2021/03/24 HTML / CSS
函授毕业生的自我鉴定
2013/11/26 职场文书
治庸问责工作总结
2015/08/11 职场文书
python计算列表元素与乘积详情
2022/08/05 Python