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基础教程之元组操作使用详解
Mar 25 Python
python实现ipsec开权限实例
Nov 11 Python
详解Python中的多线程编程
Apr 09 Python
Python的组合模式与责任链模式编程示例
Feb 02 Python
python 实现一个贴吧图片爬虫的示例
Oct 12 Python
TensorFlow实现随机训练和批量训练的方法
Apr 28 Python
基于python进行桶排序与基数排序的总结
May 29 Python
python在新的图片窗口显示图片(图像)的方法
Jul 11 Python
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
Aug 28 Python
手机使用python操作图片文件(pydroid3)过程详解
Sep 25 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
Feb 25 Python
Python 的演示平台支持 WSGI 接口的应用
Apr 20 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数据库开发知多少
2006/10/09 PHP
用PHP和ACCESS写聊天室(六)
2006/10/09 PHP
php实现文件下载更能介绍
2012/11/23 PHP
客户端 使用XML DOM加载json数据的方法
2010/09/28 Javascript
Jquery中显示隐藏的实现代码分析
2011/07/26 Javascript
动态加载外部javascript文件的函数代码分享
2011/07/28 Javascript
js限制文本框只能输入数字(正则表达式)
2012/07/15 Javascript
jquery查找父元素、子元素(个人经验总结)
2014/04/09 Javascript
移动端点击图片放大特效PhotoSwipe.js插件实现
2016/08/25 Javascript
JS中Array数组学习总结
2017/01/18 Javascript
Vue.js学习之过滤器详解
2017/01/22 Javascript
Vue集成Iframe页面的方法示例
2017/12/12 Javascript
原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作
2019/02/27 jQuery
Vue infinite update loop的问题解决
2019/04/23 Javascript
史上最为详细的javascript继承(推荐)
2019/05/18 Javascript
[24:42]VP vs TNC Supermajor小组赛B组 BO3 第三场 6.2
2018/06/03 DOTA
python多线程编程方式分析示例详解
2013/12/06 Python
Python3之读取连接过的网络并定位的方法
2018/04/22 Python
Python实现微信翻译机器人的方法
2019/08/13 Python
python str字符串转uuid实例
2020/03/03 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
2020/07/13 Python
python之语音识别speech模块
2020/09/09 Python
windows+vscode安装paddleOCR运行环境的步骤
2020/11/11 Python
使用CSS实现阅读进度条
2017/02/27 HTML / CSS
英国领先的珍珠首饰品牌:Orchira
2016/09/11 全球购物
简历的自我评价范文
2014/02/04 职场文书
服务质量承诺书
2014/03/27 职场文书
雏鹰争章活动总结
2014/05/09 职场文书
医疗器械售后服务承诺书
2014/05/21 职场文书
个人整改方案范文
2014/10/25 职场文书
教师听课评语大全
2014/12/31 职场文书
幼儿教师师德师风自我评价
2015/03/05 职场文书
卖车协议书范文
2016/03/23 职场文书
如何书写邀请函?
2019/06/24 职场文书
CSS3实现的3D隧道效果
2021/04/27 HTML / CSS
Python anaconda安装库命令详解
2021/10/16 Python