Как сделать прозрачную маску изображения

У меня есть изображение кота, мне надо сделать маску изображения прозрачной фото кота

пробовал делать с помошью open-cv но в данном случає белая часть изображения не прозрачная а белая , как можно сделать белую часть прозрачной

код:

import numpy as np
import cv2

circle = np.zeros((300, 300), dtype = "uint8")
circle = cv2.circle(circle, (150, 150), 150, 255, -1)

img = cv2.imread('cat.png')
img = cv2.resize(img,(300,300),cv2.INTER_AREA)

bitwiseAnd = cv2.bitwise_and(img,img,mask=circle)
bitwiseAnd[circle==0] = 255

cv2.imshow("Masked image",bitwiseAnd)
cv2.waitKey(0)

исходное изображение кота введите сюда описание изображения


Ответы (2 шт):

Автор решения: Daniil Loban

Вот небольшой пример, главное тут формула определяющая выходит ли пиксель за заданную окружность (x - r)**2 +(y - r)**2 > r**2, если > — выходит, там где идет вычетание радиуса происходит смещение круга от левого верхнего угла в центр изображения, предполагается что изображение квадратное:

from PIL import Image
with Image.open("cat.png") as im:
    r = im.size[0] / 2  # радиус и соответсвенно координаты центра
    for y in range(im.size[0]):
        for x in range(im.size[1]):
            if (x - r)**2 +(y - r)**2 > r**2:
                im.putpixel((x,y), (255,0,0, 0))
    im.save('rounded_cat.png')

При желании этот алгоритм можно доработать чтобы контур смотрелся сглаженнее, добавив полупрозрачности на границе с прозрачными пикселями

→ Ссылка
Автор решения: Mango

я нашел еще одно решение вопроса

from PIL import Image, ImageDraw

cat = Image.open('cat.png').resize(size=(512,512), resample=1)
im_a = Image.new("L", cat.size, 0)
ImageDraw.Draw(im_a).ellipse((0, 0, 512, 512), fill=255)

im_rgba = cat.copy()
im_rgba.putalpha(im_a)
im_rgba.crop((0, 0, 512, 512)).save('catcircle.png') 
→ Ссылка