1. 程式人生 > 程式設計 >python利用蒙版摳圖(使用PIL.Image和cv2)輸出透明背景圖

python利用蒙版摳圖(使用PIL.Image和cv2)輸出透明背景圖

因為最近在做深度學習摳圖,正好要用到蒙版進行摳圖,所以我將摳圖程式碼進行了封裝註釋,可以直接使用。可能走了彎路,若有高見請一定提出!

主要程式碼

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) # 要替換的顏色
  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 輸出透明背景圖內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!