如何在opencv-python中创建透明蒙版 [英] How to create a transparent mask in opencv-python

查看:184
本文介绍了如何在opencv-python中创建透明蒙版的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有带有白色背景的标志(具有任意形状的标志)图像,并且我想获得具有透明背景的标志图像.

I have sign (signs with arbitrary shape) images with white background and I want to get an image of the sign with transparent background.

我设法创建一个遮罩并将其应用于图像,并认为使遮罩透明是可行的.我在这里和其他地方进行了很多搜索,但没有任何帮助.

I have managed to create a mask and apply it to the image and thought making the mask transparent would be doable. I searched a lot here and elsewhere, but nothing really helped me.

import cv2
import numpy as np

file_name = "/path/to/input/img/Unbenannt.jpg" # can be also .png

img = cv2.imread(file_name)

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
th, threshed = cv2.threshold(gray, 240, 255, cv2.THRESH_BINARY_INV)

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (11,11))
morphed = cv2.morphologyEx(threshed, cv2.MORPH_CLOSE, kernel)

_, roi, _ = cv2.findContours(morphed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

mask = np.zeros(img.shape, img.dtype)

cv2.fillPoly(mask, roi, (255,)*img.shape[2], )

masked_image = cv2.bitwise_and(img, mask)

cv2.imwrite("/path/to/output/mask_test.png", masked_image)

输入:

当前输出:

如前所述,我想使背景透明.

As already mentioned I want to make the background transparent.

我们非常感谢您的帮助.

Help is highly appreciated.

推荐答案

我发现必须将图像转换为BGRA才能获得透明背景.我还添加了一种将图像切割为其边界矩形的方法.如所承诺的,工作代码:

I found that I have to convert the image to BGRA to get a transparent background. I have also added a method to cut the image to its bounding rectangle. As promised, the working code:

import cv2
import numpy as np

file_name = "/path/to/img.png"

def cut(img):
  # crop image
  gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  th, threshed = cv2.threshold(gray, 240, 255, cv2.THRESH_BINARY_INV)

  kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (11,11))
  morphed = cv2.morphologyEx(threshed, cv2.MORPH_CLOSE, kernel)

  _, cnts, _ = cv2.findContours(morphed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  cnt = sorted(cnts, key=cv2.contourArea)[-1]
  x,y,w,h = cv2.boundingRect(cnt)
  new_img = img[y:y+h, x:x+w]

  return new_img        

def transBg(img):   
  gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  th, threshed = cv2.threshold(gray, 240, 255, cv2.THRESH_BINARY_INV)

  kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (11,11))
  morphed = cv2.morphologyEx(threshed, cv2.MORPH_CLOSE, kernel)

  _, roi, _ = cv2.findContours(morphed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

  mask = np.zeros(img.shape, img.dtype)

  cv2.fillPoly(mask, roi, (255,)*img.shape[2], )

  masked_image = cv2.bitwise_and(img, mask)

  return masked_image

def fourChannels(img):
  height, width, channels = img.shape
  if channels < 4:
    new_img = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)
    return new_img

  return img

s_img = cv2.imread(file_name, -1)

# set to 4 channels
s_img = fourChannels(s_img)

# remove white background
s_img = cut(s_img)

# set background transparent
s_img = transBg(s_img)

cv2.imwrite("/path/to/store/img.png", s_img)

输入为:

输出是具有透明背景的图像:

output is an image with transparent background:

这篇关于如何在opencv-python中创建透明蒙版的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆