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系列之数据处理编程实例(二)
May 22 Python
使用PDB模式调试Python程序介绍
Apr 05 Python
python使用xlrd模块读写Excel文件的方法
May 06 Python
Python+微信接口实现运维报警
Aug 27 Python
Django自定义用户认证示例详解
Mar 14 Python
Python File readlines() 使用方法
Mar 19 Python
Python3.4学习笔记之列表、数组操作示例
Mar 01 Python
python matplotlib库直方图绘制详解
Aug 10 Python
python进阶之自定义可迭代的类
Aug 20 Python
python读取ini配置文件过程示范
Dec 23 Python
pyMySQL SQL语句传参问题,单个参数或多个参数说明
Jun 06 Python
Python创建自己的加密货币的示例
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
PHP5函数小全(分享)
2013/06/06 PHP
ThinkPHP验证码使用简明教程
2014/03/05 PHP
thinkphp实现附件上传功能
2017/05/26 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
防止xss和sql注入:JS特殊字符过滤正则
2013/04/18 Javascript
jQuery实现页面内锚点平滑跳转特效的方法总结
2015/05/11 Javascript
深入探究使JavaScript动画流畅的一些方法
2015/06/30 Javascript
Node.js的基本知识简单汇总
2016/09/19 Javascript
jQuery Easyui datagrid editor为combobox时指定数据源实例
2016/12/19 Javascript
ajax与json 获取数据并在前台使用简单实例
2017/01/19 Javascript
解决ajax不能访问本地文件问题(利用js跨域原理)
2017/01/24 Javascript
js下拉菜单生成器dropMenu使用方法详解
2017/08/01 Javascript
vue 2.0项目中如何引入element-ui详解
2017/09/06 Javascript
微信小程序实现点击文字页面跳转功能【附源码下载】
2017/12/12 Javascript
js读取本地文件的实例
2017/12/22 Javascript
vue中简单弹框dialog的实现方法
2018/02/26 Javascript
Vue2.0结合webuploader实现文件分片上传功能
2018/03/09 Javascript
npm配置国内镜像资源+淘宝镜像的方法
2018/09/07 Javascript
Postman的下载及安装教程详解
2018/10/16 Javascript
JavaScript的词法结构精华篇
2018/10/17 Javascript
js实现图片区域可点击大小随意改变(适用移动端)代码实例
2019/09/11 Javascript
归纳整理Python中的控制流语句的知识点
2015/04/14 Python
Python用imghdr模块识别图片格式实例解析
2018/01/11 Python
python用for循环求和的方法总结
2019/07/08 Python
TensorFlow学习之分布式的TensorFlow运行环境
2020/02/05 Python
解决python中0x80072ee2错误的方法
2020/07/19 Python
Python异常处理机制结构实例解析
2020/07/23 Python
python 模拟登陆github的示例
2020/12/04 Python
H5 canvas实现贪吃蛇小游戏
2017/07/28 HTML / CSS
Canvas 帧动画吃苹果小游戏
2020/08/05 HTML / CSS
中东地区最大的奢侈品市场:The Luxury Closet
2019/04/09 全球购物
三星加拿大官方网上商店:Samsung CA
2020/12/18 全球购物
请写出char *p与"零值"比较的if语句
2014/09/24 面试题
行政专员岗位职责
2014/01/02 职场文书
实习单位接收函
2014/01/11 职场文书
模具专业自荐信
2014/05/29 职场文书