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 Socket网络编程
Jan 05 Python
基于Python Shell获取hostname和fqdn释疑
Jan 25 Python
Python使用Pycrypto库进行RSA加密的方法详解
Jun 06 Python
PyTorch快速搭建神经网络及其保存提取方法详解
Apr 28 Python
Jupyter中直接显示Matplotlib的图形方法
May 24 Python
python 定时器每天就执行一次的实现代码
Aug 14 Python
python与mysql数据库交互的实现
Jan 06 Python
解决python父线程关闭后子线程不关闭问题
Apr 25 Python
Python 代码调试技巧示例代码
Aug 11 Python
python+django+selenium搭建简易自动化测试
Aug 19 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
Nov 02 Python
Python3压缩和解压缩实现代码
Mar 01 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 魔术函数使用说明
2010/05/14 PHP
详解Yii实现分页的两种方法
2017/01/14 PHP
PHP扩展mcrypt实现的AES加密功能示例
2019/01/29 PHP
js 表单验证方法(实用)
2009/04/28 Javascript
Zero Clipboard js+swf实现的复制功能使用方法
2010/03/07 Javascript
jQuery使用ajaxSubmit()提交表单示例
2014/04/04 Javascript
JavaScript制作的可折叠弹出式菜单示例
2014/04/04 Javascript
JavaScript定时显示广告代码分享
2015/03/02 Javascript
js实现向右横向滑出的二级菜单效果
2015/08/27 Javascript
JS数组合并push与concat区别分析
2015/12/17 Javascript
基于jquery实现轮播焦点图插件
2016/03/31 Javascript
jQuery之简单的表单验证实例
2016/07/07 Javascript
探索Vue.js component内容实现
2016/11/03 Javascript
微信小程序实战之上拉(分页加载)效果(2)
2017/04/17 Javascript
jQuery提示框插件SweetAlert用法分析
2019/08/05 jQuery
vue解决花括号数据绑定不成功的问题
2019/10/30 Javascript
JS在Array数组中按指定位置删除或添加元素对象方法示例
2019/11/19 Javascript
python中pycurl库的用法实例
2014/09/30 Python
用python实现面向对像的ASP程序实例
2014/11/10 Python
Python使用random和tertools模块解一些经典概率问题
2015/01/28 Python
深入理解python try异常处理机制
2016/06/01 Python
python3爬取淘宝信息代码分析
2018/02/10 Python
python调用外部程序的实操步骤
2019/03/04 Python
tensor和numpy的互相转换的实现示例
2019/08/02 Python
Python学习笔记之文件的读写操作实例分析
2019/08/07 Python
Python用input输入列表的实例代码
2020/02/07 Python
python 使用cx-freeze打包程序的实现
2020/03/14 Python
PYcharm 激活方法(推荐)
2020/03/23 Python
一文解决django 2.2与mysql兼容性问题
2020/07/15 Python
Expedia意大利旅游网站:酒店、机票和租车预订
2017/10/30 全球购物
Genny意大利官网:意大利高级时装品牌
2020/04/15 全球购物
犹他州最古老的体育用品公司:Al’s
2020/12/18 全球购物
神路信息Java面试题目
2013/03/31 面试题
群众路线教育实践活动的心得体会
2014/09/03 职场文书
小学入学感言
2015/08/01 职场文书
pytest实现多进程与多线程运行超好用的插件
2022/07/15 Python