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 相关文章推荐
Pyramid将models.py文件的内容分布到多个文件的方法
Nov 27 Python
python读写二进制文件的方法
May 09 Python
利用Python破解斗地主残局详解
Jun 30 Python
python处理csv数据动态显示曲线实例代码
Jan 23 Python
Python 读取指定文件夹下的所有图像方法
Apr 27 Python
python自动发送邮件脚本
Jun 20 Python
APIStar:一个专为Python3设计的API框架
Sep 26 Python
Python+OpenCV图片局部区域像素值处理详解
Jan 23 Python
python设置环境变量的作用和实例
Jul 09 Python
pycharm新建Vue项目的方法步骤(图文)
Mar 04 Python
python与idea的集成的实现
Nov 20 Python
教你利用python实现企业微信发送消息
May 23 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
Syphon 秘笈
2021/03/03 冲泡冲煮
Zend Studio for Eclipse的java.lang.NullPointerException错误的解决方法
2008/12/06 PHP
php打开远程文件的方法和风险及解决方法
2013/11/12 PHP
ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法
2014/08/08 PHP
PHP getNamespaces()函数讲解
2019/02/03 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
json简单介绍
2008/06/10 Javascript
jquery 必填项判断表单是否为空的方法
2008/09/14 Javascript
JavaScript关于select的相关操作说明
2010/01/13 Javascript
JavaScript编程开发中的五个实用小技巧
2010/07/22 Javascript
jquery getScript动态加载JS方法改进详解
2012/11/15 Javascript
JavaScript 开发工具webstrom使用指南
2014/12/09 Javascript
JS中的eval 为什么加括号
2016/04/13 Javascript
jQuery实现右下角可缩放大小的层完整实例
2016/06/20 Javascript
详解Vue路由History mode模式中页面无法渲染的原因及解决
2017/09/28 Javascript
vue2组件之select2调用的示例代码
2017/10/12 Javascript
Webpack优化配置缩小文件搜索范围
2017/12/25 Javascript
微信小程序6位或多位验证码密码输入框功能的实现代码
2018/05/29 Javascript
vue中组件的3种使用方式详解
2019/03/23 Javascript
详解JavaScript中关于this指向的4种情况
2019/04/18 Javascript
vue  elementUI 表单嵌套验证的实例代码
2019/11/06 Javascript
JS实现关闭小广告特效
2021/01/29 Javascript
python密码错误三次锁定(实例讲解)
2017/11/14 Python
详解Python中的分组函数groupby和itertools)
2018/07/11 Python
使用Python快速制作可视化报表的方法
2019/02/03 Python
tensorflow模型转ncnn的操作方式
2020/05/25 Python
amazeui树节点自动展开折叠面板并选中第一个树节点的实现
2020/08/24 HTML / CSS
世界上最好的威士忌和烈性酒购买网站:The Whisky Exchange
2016/11/20 全球购物
缓解脚、腿和背部疼痛:Z-CoiL鞋
2019/03/12 全球购物
Trench London官方网站:高级风衣和意大利皮夹克
2020/07/11 全球购物
初中语文教学反思
2014/02/02 职场文书
2014年班组工作总结
2014/11/20 职场文书
承诺函范文
2015/01/21 职场文书
同意转租证明
2015/06/24 职场文书
python实现学员管理系统(面向对象版)
2022/06/05 Python
Android开发手册TextInputLayout样式使用示例
2022/06/10 Java/Android